From b80a387a1e7c2691ebd62cdef5f261c8aee1457d Mon Sep 17 00:00:00 2001 From: Erwin Coumans Date: Sat, 19 Aug 2017 09:48:32 -0700 Subject: [PATCH 1/2] upgrade to latest OpenVR 1.0.9 (https://github.com/ValveSoftware/openvr) enable experimental Mac OSX OpenVR, tested using Apple External Graphics Development Kit. --- examples/SharedMemory/CMakeLists.txt | 35 +- .../StandaloneMain/hellovr_opengl_main.cpp | 37 +- .../openvr/bin/osx32/libopenvr_api.dylib | Bin 296772 -> 300868 bytes .../osx64/OpenVR.framework/Headers/openvr.h | 3721 ++++++++++++ .../OpenVR.framework/Headers/openvr_api.cs | 4997 +++++++++++++++++ .../OpenVR.framework/Headers/openvr_api.json | 3887 +++++++++++++ .../OpenVR.framework/Headers/openvr_capi.h | 1918 +++++++ .../OpenVR.framework/Headers/openvr_driver.h | 2677 +++++++++ .../openvr/bin/osx64/OpenVR.framework/OpenVR | Bin 0 -> 1318196 bytes .../OpenVR.framework/Resources/Info.plist | 18 + .../Versions/A/Headers/openvr.h | 3721 ++++++++++++ .../Versions/A/Headers/openvr_api.cs | 4997 +++++++++++++++++ .../Versions/A/Headers/openvr_api.json | 3887 +++++++++++++ .../Versions/A/Headers/openvr_capi.h | 1918 +++++++ .../Versions/A/Headers/openvr_driver.h | 2677 +++++++++ .../osx64/OpenVR.framework/Versions/A/OpenVR | Bin 0 -> 1318196 bytes .../Versions/A/Resources/Info.plist | 18 + .../Versions/Current/Headers/openvr.h | 3721 ++++++++++++ .../Versions/Current/Headers/openvr_api.cs | 4997 +++++++++++++++++ .../Versions/Current/Headers/openvr_api.json | 3887 +++++++++++++ .../Versions/Current/Headers/openvr_capi.h | 1918 +++++++ .../Versions/Current/Headers/openvr_driver.h | 2677 +++++++++ .../OpenVR.framework/Versions/Current/OpenVR | Bin 0 -> 1318196 bytes .../Versions/Current/Resources/Info.plist | 18 + .../openvr/bin/osx64/libopenvr_api.a | Bin 0 -> 1613520 bytes .../ThirdPartyLibs/openvr/headers/openvr.h | 93 +- .../openvr/headers/openvr_api.cs | 79 +- .../openvr/headers/openvr_api.json | 57 +- .../openvr/headers/openvr_capi.h | 32 +- .../openvr/headers/openvr_driver.h | 129 +- .../openvr/lib/linux32/libopenvr_api.so | Bin 1963478 -> 1897474 bytes .../openvr/lib/linux64/libopenvr_api.so | Bin 2447145 -> 2385833 bytes .../openvr/lib/win32/openvr_api.lib | Bin 5964 -> 5964 bytes .../openvr/lib/win64/openvr_api.lib | Bin 5876 -> 5876 bytes .../openvr/samples/shared/pathtools.cpp | 9 +- .../openvr/samples/shared/strtools.h | 16 +- 36 files changed, 52071 insertions(+), 70 deletions(-) create mode 100644 examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Headers/openvr.h create mode 100644 examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Headers/openvr_api.cs create mode 100644 examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Headers/openvr_api.json create mode 100644 examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Headers/openvr_capi.h create mode 100644 examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Headers/openvr_driver.h create mode 100755 examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/OpenVR create mode 100644 examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Resources/Info.plist create mode 100644 examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr.h create mode 100644 examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_api.cs create mode 100644 examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_api.json create mode 100644 examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_capi.h create mode 100644 examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_driver.h create mode 100755 examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/OpenVR create mode 100644 examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Resources/Info.plist create mode 100644 examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Headers/openvr.h create mode 100644 examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Headers/openvr_api.cs create mode 100644 examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Headers/openvr_api.json create mode 100644 examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Headers/openvr_capi.h create mode 100644 examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Headers/openvr_driver.h create mode 100755 examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/OpenVR create mode 100644 examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Resources/Info.plist create mode 100644 examples/ThirdPartyLibs/openvr/bin/osx64/libopenvr_api.a mode change 100644 => 100755 examples/ThirdPartyLibs/openvr/lib/linux32/libopenvr_api.so diff --git a/examples/SharedMemory/CMakeLists.txt b/examples/SharedMemory/CMakeLists.txt index 44ceefca3..dd10c5ff8 100644 --- a/examples/SharedMemory/CMakeLists.txt +++ b/examples/SharedMemory/CMakeLists.txt @@ -213,7 +213,8 @@ IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) -IF (WIN32) +#VR/OpenVR only on Windows and Mac OSX for now +IF (WIN32 OR APPLE) INCLUDE_DIRECTORIES( ${BULLET_PHYSICS_SOURCE_DIR}/src @@ -234,13 +235,42 @@ LINK_LIBRARIES( ADD_DEFINITIONS(-DGLEW_STATIC) LINK_LIBRARIES( ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} ) + IF(WIN32) + SET(Platform_SRCS + ../MultiThreading/b3Win32ThreadSupport.cpp + ../MultiThreading/b3Win32ThreadSupport.h + ${BULLET_PHYSICS_SOURCE_DIR}/build3/bullet.rc + ) IF (CMAKE_CL_64) LINK_DIRECTORIES(${BULLET_PHYSICS_SOURCE_DIR}/examples/ThirdPartyLibs/openvr/lib/win64) ELSE(CMAKE_CL_64) LINK_DIRECTORIES(${BULLET_PHYSICS_SOURCE_DIR}/examples/ThirdPartyLibs/openvr/lib/win32) ENDIF(CMAKE_CL_64) + ELSE(WIN32) + + set_source_files_properties(../ThirdPartyLibs/openvr/samples/shared/pathtools.cpp ../StandaloneMain/hellovr_opengl_main.cpp PROPERTIES COMPILE_FLAGS "-x objective-c++") + find_library(FOUNDATION_FRAMEWORK Foundation) + mark_as_advanced(FOUNDATION_FRAMEWORK) + set(EXTRA_LIBS ${EXTRA_LIBS} ${FOUNDATION_FRAMEWORK}) + + set(CMAKE_MACOSX_RPATH 0) + + SET(Platform_SRCS + ../MultiThreading/b3PosixThreadSupport.cpp + ../MultiThreading/b3PosixThreadSupport.h + ) + IF (CMAKE_CL_64) + LINK_DIRECTORIES(${BULLET_PHYSICS_SOURCE_DIR}/examples/ThirdPartyLibs/openvr/lib/osx64) + ELSE() + set(ARCH_TARGET osx32) + LINK_DIRECTORIES(${BULLET_PHYSICS_SOURCE_DIR}/examples/ThirdPartyLibs/openvr/lib/osx32) + ENDIF() + add_definitions(-DOSX -DPOSIX) + + ENDIF(WIN32) ADD_EXECUTABLE(App_PhysicsServer_SharedMemory_VR ${SharedMemory_SRCS} + ${Platform_SRCS} ../StandaloneMain/hellovr_opengl_main.cpp ../ExampleBrowser/OpenGLGuiHelper.cpp ../ExampleBrowser/GL_ShapeDrawer.cpp @@ -257,9 +287,6 @@ LINK_LIBRARIES( ../ThirdPartyLibs/openvr/samples/shared/strtools.cpp ../ThirdPartyLibs/openvr/samples/shared/strtools.h ../ThirdPartyLibs/openvr/samples/shared/Vectors.h - ../MultiThreading/b3Win32ThreadSupport.cpp - ../MultiThreading/b3Win32ThreadSupport.h - ${BULLET_PHYSICS_SOURCE_DIR}/build3/bullet.rc ) diff --git a/examples/StandaloneMain/hellovr_opengl_main.cpp b/examples/StandaloneMain/hellovr_opengl_main.cpp index 5936e7cf0..cad0eeb35 100644 --- a/examples/StandaloneMain/hellovr_opengl_main.cpp +++ b/examples/StandaloneMain/hellovr_opengl_main.cpp @@ -31,7 +31,8 @@ bool gDisableDesktopGL = false; #include #include - +#include "strtools.h" +#include "compat.h" #include "lodepng.h" #include "Matrices.h" #include "pathtools.h" @@ -597,10 +598,10 @@ bool CMainApplication::BInitGL() { if( m_bDebugOpenGL ) { - const GLvoid *userParam=0; - glDebugMessageCallback(DebugCallback, userParam); - glDebugMessageControl( GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE ); - glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); + //const GLvoid *userParam=0; + //glDebugMessageCallback(DebugCallback, userParam); + //glDebugMessageControl( GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE ); + //glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); } if( !CreateAllShaders() ) @@ -656,8 +657,8 @@ void CMainApplication::Shutdown() { if (m_glSceneVertBuffer) { - glDebugMessageControl( GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_FALSE ); - glDebugMessageCallback(nullptr, nullptr); + //glDebugMessageControl( GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_FALSE ); + //glDebugMessageCallback(nullptr, nullptr); glDeleteBuffers(1, &m_glSceneVertBuffer); glDeleteBuffers(1, &m_glIDVertBuffer); glDeleteBuffers(1, &m_glIDIndexBuffer); @@ -1278,10 +1279,12 @@ bool CMainApplication::SetupTexturemaps() glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR ); +#ifdef WIN32 GLfloat fLargest; + glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &fLargest); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, fLargest); - +#endif glBindTexture( GL_TEXTURE_2D, 0 ); return ( m_iTexture != 0 ); @@ -2290,11 +2293,11 @@ bool CGLRenderModel::BInit( const vr::RenderModel_t & vrModel, const vr::RenderM glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR ); - +#ifdef _WIN32 GLfloat fLargest; glGetFloatv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &fLargest ); glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, fLargest ); - +#endif glBindTexture( GL_TEXTURE_2D, 0 ); m_unVertexCount = vrModel.unTriangleCount * 3; @@ -2384,7 +2387,8 @@ int main(int argc, char *argv[]) args.GetCmdLineArgument("mp4",gVideoFileName); if (gVideoFileName) pMainApplication->getApp()->dumpFramesToVideo(gVideoFileName); - + +#ifdef _WIN32 //request disable VSYNC typedef bool (APIENTRY *PFNWGLSWAPINTERVALFARPROC)(int); PFNWGLSWAPINTERVALFARPROC wglSwapIntervalEXT = 0; @@ -2392,7 +2396,14 @@ int main(int argc, char *argv[]) (PFNWGLSWAPINTERVALFARPROC)wglGetProcAddress("wglSwapIntervalEXT"); if (wglSwapIntervalEXT) wglSwapIntervalEXT(0); - +#endif + +#ifdef __APPLE__ + GLint sync = 0; + CGLContextObj ctx = CGLGetCurrentContext(); + CGLSetParameter(ctx, kCGLCPSwapInterval, &sync); +#endif + pMainApplication->RunMainLoop(); pMainApplication->Shutdown(); @@ -2405,4 +2416,4 @@ int main(int argc, char *argv[]) return 0; } -#endif //BT_ENABLE_VR \ No newline at end of file +#endif //BT_ENABLE_VR diff --git a/examples/ThirdPartyLibs/openvr/bin/osx32/libopenvr_api.dylib b/examples/ThirdPartyLibs/openvr/bin/osx32/libopenvr_api.dylib index 5a20f3aae81087457eed30a915aedb44e47aab1b..fb1d77f02273f57a849f72ede7ed77fd58013887 100644 GIT binary patch delta 49681 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 delta 48199 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 z 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 + + + +// vrtypes.h +#ifndef _INCLUDE_VRTYPES_H +#define _INCLUDE_VRTYPES_H + +// Forward declarations to avoid requiring vulkan.h +struct VkDevice_T; +struct VkPhysicalDevice_T; +struct VkInstance_T; +struct VkQueue_T; + +// Forward declarations to avoid requiring d3d12.h +struct ID3D12Resource; +struct ID3D12CommandQueue; + +namespace vr +{ +#pragma pack( push, 8 ) + +typedef void* glSharedTextureHandle_t; +typedef int32_t glInt_t; +typedef uint32_t glUInt_t; + +// right-handed system +// +y is up +// +x is to the right +// -z is going away from you +// Distance unit is meters +struct HmdMatrix34_t +{ + float m[3][4]; +}; + +struct HmdMatrix44_t +{ + float m[4][4]; +}; + +struct HmdVector3_t +{ + float v[3]; +}; + +struct HmdVector4_t +{ + float v[4]; +}; + +struct HmdVector3d_t +{ + double v[3]; +}; + +struct HmdVector2_t +{ + float v[2]; +}; + +struct HmdQuaternion_t +{ + double w, x, y, z; +}; + +struct HmdColor_t +{ + float r, g, b, a; +}; + +struct HmdQuad_t +{ + HmdVector3_t vCorners[ 4 ]; +}; + +struct HmdRect2_t +{ + HmdVector2_t vTopLeft; + HmdVector2_t vBottomRight; +}; + +/** Used to return the post-distortion UVs for each color channel. +* UVs range from 0 to 1 with 0,0 in the upper left corner of the +* source render target. The 0,0 to 1,1 range covers a single eye. */ +struct DistortionCoordinates_t +{ + float rfRed[2]; + float rfGreen[2]; + float rfBlue[2]; +}; + +enum EVREye +{ + Eye_Left = 0, + Eye_Right = 1 +}; + +enum ETextureType +{ + TextureType_DirectX = 0, // Handle is an ID3D11Texture + TextureType_OpenGL = 1, // Handle is an OpenGL texture name or an OpenGL render buffer name, depending on submit flags + TextureType_Vulkan = 2, // Handle is a pointer to a VRVulkanTextureData_t structure + TextureType_IOSurface = 3, // Handle is a macOS cross-process-sharable IOSurfaceRef + TextureType_DirectX12 = 4, // Handle is a pointer to a D3D12TextureData_t structure +}; + +enum EColorSpace +{ + ColorSpace_Auto = 0, // Assumes 'gamma' for 8-bit per component formats, otherwise 'linear'. This mirrors the DXGI formats which have _SRGB variants. + ColorSpace_Gamma = 1, // Texture data can be displayed directly on the display without any conversion (a.k.a. display native format). + ColorSpace_Linear = 2, // Same as gamma but has been converted to a linear representation using DXGI's sRGB conversion algorithm. +}; + +struct Texture_t +{ + void* handle; // See ETextureType definition above + ETextureType eType; + EColorSpace eColorSpace; +}; + +// Handle to a shared texture (HANDLE on Windows obtained using OpenSharedResource). +typedef uint64_t SharedTextureHandle_t; +#define INVALID_SHARED_TEXTURE_HANDLE ((vr::SharedTextureHandle_t)0) + +enum ETrackingResult +{ + TrackingResult_Uninitialized = 1, + + TrackingResult_Calibrating_InProgress = 100, + TrackingResult_Calibrating_OutOfRange = 101, + + TrackingResult_Running_OK = 200, + TrackingResult_Running_OutOfRange = 201, +}; + +typedef uint32_t DriverId_t; +static const uint32_t k_nDriverNone = 0xFFFFFFFF; + +static const uint32_t k_unMaxDriverDebugResponseSize = 32768; + +/** Used to pass device IDs to API calls */ +typedef uint32_t TrackedDeviceIndex_t; +static const uint32_t k_unTrackedDeviceIndex_Hmd = 0; +static const uint32_t k_unMaxTrackedDeviceCount = 16; +static const uint32_t k_unTrackedDeviceIndexOther = 0xFFFFFFFE; +static const uint32_t k_unTrackedDeviceIndexInvalid = 0xFFFFFFFF; + +/** Describes what kind of object is being tracked at a given ID */ +enum ETrackedDeviceClass +{ + TrackedDeviceClass_Invalid = 0, // the ID was not valid. + TrackedDeviceClass_HMD = 1, // Head-Mounted Displays + TrackedDeviceClass_Controller = 2, // Tracked controllers + TrackedDeviceClass_GenericTracker = 3, // Generic trackers, similar to controllers + TrackedDeviceClass_TrackingReference = 4, // Camera and base stations that serve as tracking reference points + TrackedDeviceClass_DisplayRedirect = 5, // Accessories that aren't necessarily tracked themselves, but may redirect video output from other tracked devices +}; + + +/** Describes what specific role associated with a tracked device */ +enum ETrackedControllerRole +{ + TrackedControllerRole_Invalid = 0, // Invalid value for controller type + TrackedControllerRole_LeftHand = 1, // Tracked device associated with the left hand + TrackedControllerRole_RightHand = 2, // Tracked device associated with the right hand +}; + + +/** describes a single pose for a tracked object */ +struct TrackedDevicePose_t +{ + HmdMatrix34_t mDeviceToAbsoluteTracking; + HmdVector3_t vVelocity; // velocity in tracker space in m/s + HmdVector3_t vAngularVelocity; // angular velocity in radians/s (?) + ETrackingResult eTrackingResult; + bool bPoseIsValid; + + // This indicates that there is a device connected for this spot in the pose array. + // It could go from true to false if the user unplugs the device. + bool bDeviceIsConnected; +}; + +/** Identifies which style of tracking origin the application wants to use +* for the poses it is requesting */ +enum ETrackingUniverseOrigin +{ + TrackingUniverseSeated = 0, // Poses are provided relative to the seated zero pose + TrackingUniverseStanding = 1, // Poses are provided relative to the safe bounds configured by the user + 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. +}; + +// Refers to a single container of properties +typedef uint64_t PropertyContainerHandle_t; +typedef uint32_t PropertyTypeTag_t; + +static const PropertyContainerHandle_t k_ulInvalidPropertyContainer = 0; +static const PropertyTypeTag_t k_unInvalidPropertyTag = 0; + +// Use these tags to set/get common types as struct properties +static const PropertyTypeTag_t k_unFloatPropertyTag = 1; +static const PropertyTypeTag_t k_unInt32PropertyTag = 2; +static const PropertyTypeTag_t k_unUint64PropertyTag = 3; +static const PropertyTypeTag_t k_unBoolPropertyTag = 4; +static const PropertyTypeTag_t k_unStringPropertyTag = 5; + +static const PropertyTypeTag_t k_unHmdMatrix34PropertyTag = 20; +static const PropertyTypeTag_t k_unHmdMatrix44PropertyTag = 21; +static const PropertyTypeTag_t k_unHmdVector3PropertyTag = 22; +static const PropertyTypeTag_t k_unHmdVector4PropertyTag = 23; + +static const PropertyTypeTag_t k_unHiddenAreaPropertyTag = 30; + +static const PropertyTypeTag_t k_unOpenVRInternalReserved_Start = 1000; +static const PropertyTypeTag_t k_unOpenVRInternalReserved_End = 10000; + + +/** Each entry in this enum represents a property that can be retrieved about a +* tracked device. Many fields are only valid for one ETrackedDeviceClass. */ +enum ETrackedDeviceProperty +{ + Prop_Invalid = 0, + + // general properties that apply to all device classes + Prop_TrackingSystemName_String = 1000, + Prop_ModelNumber_String = 1001, + Prop_SerialNumber_String = 1002, + Prop_RenderModelName_String = 1003, + Prop_WillDriftInYaw_Bool = 1004, + Prop_ManufacturerName_String = 1005, + Prop_TrackingFirmwareVersion_String = 1006, + Prop_HardwareRevision_String = 1007, + Prop_AllWirelessDongleDescriptions_String = 1008, + Prop_ConnectedWirelessDongle_String = 1009, + Prop_DeviceIsWireless_Bool = 1010, + Prop_DeviceIsCharging_Bool = 1011, + Prop_DeviceBatteryPercentage_Float = 1012, // 0 is empty, 1 is full + Prop_StatusDisplayTransform_Matrix34 = 1013, + Prop_Firmware_UpdateAvailable_Bool = 1014, + Prop_Firmware_ManualUpdate_Bool = 1015, + Prop_Firmware_ManualUpdateURL_String = 1016, + Prop_HardwareRevision_Uint64 = 1017, + Prop_FirmwareVersion_Uint64 = 1018, + Prop_FPGAVersion_Uint64 = 1019, + Prop_VRCVersion_Uint64 = 1020, + Prop_RadioVersion_Uint64 = 1021, + Prop_DongleVersion_Uint64 = 1022, + Prop_BlockServerShutdown_Bool = 1023, + Prop_CanUnifyCoordinateSystemWithHmd_Bool = 1024, + Prop_ContainsProximitySensor_Bool = 1025, + Prop_DeviceProvidesBatteryStatus_Bool = 1026, + Prop_DeviceCanPowerOff_Bool = 1027, + Prop_Firmware_ProgrammingTarget_String = 1028, + Prop_DeviceClass_Int32 = 1029, + Prop_HasCamera_Bool = 1030, + Prop_DriverVersion_String = 1031, + Prop_Firmware_ForceUpdateRequired_Bool = 1032, + Prop_ViveSystemButtonFixRequired_Bool = 1033, + Prop_ParentDriver_Uint64 = 1034, + Prop_ResourceRoot_String = 1035, + + // Properties that are unique to TrackedDeviceClass_HMD + Prop_ReportsTimeSinceVSync_Bool = 2000, + Prop_SecondsFromVsyncToPhotons_Float = 2001, + Prop_DisplayFrequency_Float = 2002, + Prop_UserIpdMeters_Float = 2003, + Prop_CurrentUniverseId_Uint64 = 2004, + Prop_PreviousUniverseId_Uint64 = 2005, + Prop_DisplayFirmwareVersion_Uint64 = 2006, + Prop_IsOnDesktop_Bool = 2007, + Prop_DisplayMCType_Int32 = 2008, + Prop_DisplayMCOffset_Float = 2009, + Prop_DisplayMCScale_Float = 2010, + Prop_EdidVendorID_Int32 = 2011, + Prop_DisplayMCImageLeft_String = 2012, + Prop_DisplayMCImageRight_String = 2013, + Prop_DisplayGCBlackClamp_Float = 2014, + Prop_EdidProductID_Int32 = 2015, + Prop_CameraToHeadTransform_Matrix34 = 2016, + Prop_DisplayGCType_Int32 = 2017, + Prop_DisplayGCOffset_Float = 2018, + Prop_DisplayGCScale_Float = 2019, + Prop_DisplayGCPrescale_Float = 2020, + Prop_DisplayGCImage_String = 2021, + Prop_LensCenterLeftU_Float = 2022, + Prop_LensCenterLeftV_Float = 2023, + Prop_LensCenterRightU_Float = 2024, + Prop_LensCenterRightV_Float = 2025, + Prop_UserHeadToEyeDepthMeters_Float = 2026, + Prop_CameraFirmwareVersion_Uint64 = 2027, + Prop_CameraFirmwareDescription_String = 2028, + Prop_DisplayFPGAVersion_Uint64 = 2029, + Prop_DisplayBootloaderVersion_Uint64 = 2030, + Prop_DisplayHardwareVersion_Uint64 = 2031, + Prop_AudioFirmwareVersion_Uint64 = 2032, + Prop_CameraCompatibilityMode_Int32 = 2033, + Prop_ScreenshotHorizontalFieldOfViewDegrees_Float = 2034, + Prop_ScreenshotVerticalFieldOfViewDegrees_Float = 2035, + Prop_DisplaySuppressed_Bool = 2036, + Prop_DisplayAllowNightMode_Bool = 2037, + Prop_DisplayMCImageWidth_Int32 = 2038, + Prop_DisplayMCImageHeight_Int32 = 2039, + Prop_DisplayMCImageNumChannels_Int32 = 2040, + Prop_DisplayMCImageData_Binary = 2041, + Prop_SecondsFromPhotonsToVblank_Float = 2042, + Prop_DriverDirectModeSendsVsyncEvents_Bool = 2043, + Prop_DisplayDebugMode_Bool = 2044, + Prop_GraphicsAdapterLuid_Uint64 = 2045, + + // Properties that are unique to TrackedDeviceClass_Controller + Prop_AttachedDeviceId_String = 3000, + Prop_SupportedButtons_Uint64 = 3001, + Prop_Axis0Type_Int32 = 3002, // Return value is of type EVRControllerAxisType + Prop_Axis1Type_Int32 = 3003, // Return value is of type EVRControllerAxisType + Prop_Axis2Type_Int32 = 3004, // Return value is of type EVRControllerAxisType + Prop_Axis3Type_Int32 = 3005, // Return value is of type EVRControllerAxisType + Prop_Axis4Type_Int32 = 3006, // Return value is of type EVRControllerAxisType + Prop_ControllerRoleHint_Int32 = 3007, // Return value is of type ETrackedControllerRole + + // Properties that are unique to TrackedDeviceClass_TrackingReference + Prop_FieldOfViewLeftDegrees_Float = 4000, + Prop_FieldOfViewRightDegrees_Float = 4001, + Prop_FieldOfViewTopDegrees_Float = 4002, + Prop_FieldOfViewBottomDegrees_Float = 4003, + Prop_TrackingRangeMinimumMeters_Float = 4004, + Prop_TrackingRangeMaximumMeters_Float = 4005, + Prop_ModeLabel_String = 4006, + + // Properties that are used for user interface like icons names + Prop_IconPathName_String = 5000, // DEPRECATED. Value not referenced. Now expected to be part of icon path properties. + Prop_NamedIconPathDeviceOff_String = 5001, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceSearching_String = 5002, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceSearchingAlert_String = 5003, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceReady_String = 5004, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceReadyAlert_String = 5005, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceNotReady_String = 5006, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceStandby_String = 5007, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceAlertLow_String = 5008, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + + // Properties that are used by helpers, but are opaque to applications + Prop_DisplayHiddenArea_Binary_Start = 5100, + Prop_DisplayHiddenArea_Binary_End = 5150, + + // Properties that are unique to drivers + Prop_UserConfigPath_String = 6000, + Prop_InstallPath_String = 6001, + Prop_HasDisplayComponent_Bool = 6002, + Prop_HasControllerComponent_Bool = 6003, + Prop_HasCameraComponent_Bool = 6004, + Prop_HasDriverDirectModeComponent_Bool = 6005, + Prop_HasVirtualDisplayComponent_Bool = 6006, + + // Vendors are free to expose private debug data in this reserved region + Prop_VendorSpecific_Reserved_Start = 10000, + Prop_VendorSpecific_Reserved_End = 10999, +}; + +/** No string property will ever be longer than this length */ +static const uint32_t k_unMaxPropertyStringSize = 32 * 1024; + +/** Used to return errors that occur when reading properties. */ +enum ETrackedPropertyError +{ + TrackedProp_Success = 0, + TrackedProp_WrongDataType = 1, + TrackedProp_WrongDeviceClass = 2, + TrackedProp_BufferTooSmall = 3, + TrackedProp_UnknownProperty = 4, // Driver has not set the property (and may not ever). + TrackedProp_InvalidDevice = 5, + TrackedProp_CouldNotContactServer = 6, + TrackedProp_ValueNotProvidedByDevice = 7, + TrackedProp_StringExceedsMaximumLength = 8, + TrackedProp_NotYetAvailable = 9, // The property value isn't known yet, but is expected soon. Call again later. + TrackedProp_PermissionDenied = 10, + TrackedProp_InvalidOperation = 11, +}; + +/** Allows the application to control what part of the provided texture will be used in the +* frame buffer. */ +struct VRTextureBounds_t +{ + float uMin, vMin; + float uMax, vMax; +}; + + +/** Allows the application to control how scene textures are used by the compositor when calling Submit. */ +enum EVRSubmitFlags +{ + // Simple render path. App submits rendered left and right eye images with no lens distortion correction applied. + Submit_Default = 0x00, + + // App submits final left and right eye images with lens distortion already applied (lens distortion makes the images appear + // barrel distorted with chromatic aberration correction applied). The app would have used the data returned by + // vr::IVRSystem::ComputeDistortion() to apply the correct distortion to the rendered images before calling Submit(). + Submit_LensDistortionAlreadyApplied = 0x01, + + // If the texture pointer passed in is actually a renderbuffer (e.g. for MSAA in OpenGL) then set this flag. + Submit_GlRenderBuffer = 0x02, + + // Do not use + Submit_Reserved = 0x04, +}; + +/** Data required for passing Vulkan textures to IVRCompositor::Submit. +* Be sure to call OpenVR_Shutdown before destroying these resources. */ +struct VRVulkanTextureData_t +{ + uint64_t m_nImage; // VkImage + VkDevice_T *m_pDevice; + VkPhysicalDevice_T *m_pPhysicalDevice; + VkInstance_T *m_pInstance; + VkQueue_T *m_pQueue; + uint32_t m_nQueueFamilyIndex; + uint32_t m_nWidth, m_nHeight, m_nFormat, m_nSampleCount; +}; + +/** Data required for passing D3D12 textures to IVRCompositor::Submit. +* Be sure to call OpenVR_Shutdown before destroying these resources. */ +struct D3D12TextureData_t +{ + ID3D12Resource *m_pResource; + ID3D12CommandQueue *m_pCommandQueue; + uint32_t m_nNodeMask; +}; + +/** Status of the overall system or tracked objects */ +enum EVRState +{ + VRState_Undefined = -1, + VRState_Off = 0, + VRState_Searching = 1, + VRState_Searching_Alert = 2, + VRState_Ready = 3, + VRState_Ready_Alert = 4, + VRState_NotReady = 5, + VRState_Standby = 6, + VRState_Ready_Alert_Low = 7, +}; + +/** The types of events that could be posted (and what the parameters mean for each event type) */ +enum EVREventType +{ + VREvent_None = 0, + + VREvent_TrackedDeviceActivated = 100, + VREvent_TrackedDeviceDeactivated = 101, + VREvent_TrackedDeviceUpdated = 102, + VREvent_TrackedDeviceUserInteractionStarted = 103, + VREvent_TrackedDeviceUserInteractionEnded = 104, + VREvent_IpdChanged = 105, + VREvent_EnterStandbyMode = 106, + VREvent_LeaveStandbyMode = 107, + VREvent_TrackedDeviceRoleChanged = 108, + VREvent_WatchdogWakeUpRequested = 109, + VREvent_LensDistortionChanged = 110, + VREvent_PropertyChanged = 111, + + VREvent_ButtonPress = 200, // data is controller + VREvent_ButtonUnpress = 201, // data is controller + VREvent_ButtonTouch = 202, // data is controller + VREvent_ButtonUntouch = 203, // data is controller + + VREvent_MouseMove = 300, // data is mouse + VREvent_MouseButtonDown = 301, // data is mouse + VREvent_MouseButtonUp = 302, // data is mouse + VREvent_FocusEnter = 303, // data is overlay + VREvent_FocusLeave = 304, // data is overlay + VREvent_Scroll = 305, // data is mouse + VREvent_TouchPadMove = 306, // data is mouse + VREvent_OverlayFocusChanged = 307, // data is overlay, global event + + VREvent_InputFocusCaptured = 400, // data is process DEPRECATED + VREvent_InputFocusReleased = 401, // data is process DEPRECATED + VREvent_SceneFocusLost = 402, // data is process + VREvent_SceneFocusGained = 403, // data is process + VREvent_SceneApplicationChanged = 404, // data is process - The App actually drawing the scene changed (usually to or from the compositor) + VREvent_SceneFocusChanged = 405, // data is process - New app got access to draw the scene + VREvent_InputFocusChanged = 406, // data is process + VREvent_SceneApplicationSecondaryRenderingStarted = 407, // data is process + + VREvent_HideRenderModels = 410, // Sent to the scene application to request hiding render models temporarily + VREvent_ShowRenderModels = 411, // Sent to the scene application to request restoring render model visibility + + VREvent_OverlayShown = 500, + VREvent_OverlayHidden = 501, + VREvent_DashboardActivated = 502, + VREvent_DashboardDeactivated = 503, + VREvent_DashboardThumbSelected = 504, // Sent to the overlay manager - data is overlay + VREvent_DashboardRequested = 505, // Sent to the overlay manager - data is overlay + VREvent_ResetDashboard = 506, // Send to the overlay manager + VREvent_RenderToast = 507, // Send to the dashboard to render a toast - data is the notification ID + VREvent_ImageLoaded = 508, // Sent to overlays when a SetOverlayRaw or SetOverlayFromFile call finishes loading + VREvent_ShowKeyboard = 509, // Sent to keyboard renderer in the dashboard to invoke it + VREvent_HideKeyboard = 510, // Sent to keyboard renderer in the dashboard to hide it + VREvent_OverlayGamepadFocusGained = 511, // Sent to an overlay when IVROverlay::SetFocusOverlay is called on it + VREvent_OverlayGamepadFocusLost = 512, // Send to an overlay when it previously had focus and IVROverlay::SetFocusOverlay is called on something else + VREvent_OverlaySharedTextureChanged = 513, + VREvent_DashboardGuideButtonDown = 514, + VREvent_DashboardGuideButtonUp = 515, + VREvent_ScreenshotTriggered = 516, // Screenshot button combo was pressed, Dashboard should request a screenshot + VREvent_ImageFailed = 517, // Sent to overlays when a SetOverlayRaw or SetOverlayfromFail fails to load + VREvent_DashboardOverlayCreated = 518, + + // Screenshot API + VREvent_RequestScreenshot = 520, // Sent by vrclient application to compositor to take a screenshot + VREvent_ScreenshotTaken = 521, // Sent by compositor to the application that the screenshot has been taken + VREvent_ScreenshotFailed = 522, // Sent by compositor to the application that the screenshot failed to be taken + VREvent_SubmitScreenshotToDashboard = 523, // Sent by compositor to the dashboard that a completed screenshot was submitted + VREvent_ScreenshotProgressToDashboard = 524, // Sent by compositor to the dashboard that a completed screenshot was submitted + + VREvent_PrimaryDashboardDeviceChanged = 525, + + VREvent_Notification_Shown = 600, + VREvent_Notification_Hidden = 601, + VREvent_Notification_BeginInteraction = 602, + VREvent_Notification_Destroyed = 603, + + VREvent_Quit = 700, // data is process + VREvent_ProcessQuit = 701, // data is process + VREvent_QuitAborted_UserPrompt = 702, // data is process + VREvent_QuitAcknowledged = 703, // data is process + VREvent_DriverRequestedQuit = 704, // The driver has requested that SteamVR shut down + + VREvent_ChaperoneDataHasChanged = 800, + VREvent_ChaperoneUniverseHasChanged = 801, + VREvent_ChaperoneTempDataHasChanged = 802, + VREvent_ChaperoneSettingsHaveChanged = 803, + VREvent_SeatedZeroPoseReset = 804, + + VREvent_AudioSettingsHaveChanged = 820, + + VREvent_BackgroundSettingHasChanged = 850, + VREvent_CameraSettingsHaveChanged = 851, + VREvent_ReprojectionSettingHasChanged = 852, + VREvent_ModelSkinSettingsHaveChanged = 853, + VREvent_EnvironmentSettingsHaveChanged = 854, + VREvent_PowerSettingsHaveChanged = 855, + VREvent_EnableHomeAppSettingsHaveChanged = 856, + + VREvent_StatusUpdate = 900, + + VREvent_MCImageUpdated = 1000, + + VREvent_FirmwareUpdateStarted = 1100, + VREvent_FirmwareUpdateFinished = 1101, + + VREvent_KeyboardClosed = 1200, + VREvent_KeyboardCharInput = 1201, + VREvent_KeyboardDone = 1202, // Sent when DONE button clicked on keyboard + + VREvent_ApplicationTransitionStarted = 1300, + VREvent_ApplicationTransitionAborted = 1301, + VREvent_ApplicationTransitionNewAppStarted = 1302, + VREvent_ApplicationListUpdated = 1303, + VREvent_ApplicationMimeTypeLoad = 1304, + VREvent_ApplicationTransitionNewAppLaunchComplete = 1305, + VREvent_ProcessConnected = 1306, + VREvent_ProcessDisconnected = 1307, + + VREvent_Compositor_MirrorWindowShown = 1400, + VREvent_Compositor_MirrorWindowHidden = 1401, + VREvent_Compositor_ChaperoneBoundsShown = 1410, + VREvent_Compositor_ChaperoneBoundsHidden = 1411, + + VREvent_TrackedCamera_StartVideoStream = 1500, + VREvent_TrackedCamera_StopVideoStream = 1501, + VREvent_TrackedCamera_PauseVideoStream = 1502, + VREvent_TrackedCamera_ResumeVideoStream = 1503, + VREvent_TrackedCamera_EditingSurface = 1550, + + VREvent_PerformanceTest_EnableCapture = 1600, + VREvent_PerformanceTest_DisableCapture = 1601, + VREvent_PerformanceTest_FidelityLevel = 1602, + + VREvent_MessageOverlay_Closed = 1650, + + // Vendors are free to expose private events in this reserved region + VREvent_VendorSpecific_Reserved_Start = 10000, + VREvent_VendorSpecific_Reserved_End = 19999, +}; + + +/** Level of Hmd activity */ +// UserInteraction_Timeout means the device is in the process of timing out. +// InUse = ( k_EDeviceActivityLevel_UserInteraction || k_EDeviceActivityLevel_UserInteraction_Timeout ) +// VREvent_TrackedDeviceUserInteractionStarted fires when the devices transitions from Standby -> UserInteraction or Idle -> UserInteraction. +// VREvent_TrackedDeviceUserInteractionEnded fires when the devices transitions from UserInteraction_Timeout -> Idle +enum EDeviceActivityLevel +{ + k_EDeviceActivityLevel_Unknown = -1, + k_EDeviceActivityLevel_Idle = 0, // No activity for the last 10 seconds + k_EDeviceActivityLevel_UserInteraction = 1, // Activity (movement or prox sensor) is happening now + k_EDeviceActivityLevel_UserInteraction_Timeout = 2, // No activity for the last 0.5 seconds + k_EDeviceActivityLevel_Standby = 3, // Idle for at least 5 seconds (configurable in Settings -> Power Management) +}; + + +/** VR controller button and axis IDs */ +enum EVRButtonId +{ + k_EButton_System = 0, + k_EButton_ApplicationMenu = 1, + k_EButton_Grip = 2, + k_EButton_DPad_Left = 3, + k_EButton_DPad_Up = 4, + k_EButton_DPad_Right = 5, + k_EButton_DPad_Down = 6, + k_EButton_A = 7, + + k_EButton_ProximitySensor = 31, + + k_EButton_Axis0 = 32, + k_EButton_Axis1 = 33, + k_EButton_Axis2 = 34, + k_EButton_Axis3 = 35, + k_EButton_Axis4 = 36, + + // aliases for well known controllers + k_EButton_SteamVR_Touchpad = k_EButton_Axis0, + k_EButton_SteamVR_Trigger = k_EButton_Axis1, + + k_EButton_Dashboard_Back = k_EButton_Grip, + + k_EButton_Max = 64 +}; + +inline uint64_t ButtonMaskFromId( EVRButtonId id ) { return 1ull << id; } + +/** used for controller button events */ +struct VREvent_Controller_t +{ + uint32_t button; // EVRButtonId enum +}; + + +/** used for simulated mouse events in overlay space */ +enum EVRMouseButton +{ + VRMouseButton_Left = 0x0001, + VRMouseButton_Right = 0x0002, + VRMouseButton_Middle = 0x0004, +}; + + +/** used for simulated mouse events in overlay space */ +struct VREvent_Mouse_t +{ + float x, y; // co-ords are in GL space, bottom left of the texture is 0,0 + uint32_t button; // EVRMouseButton enum +}; + +/** used for simulated mouse wheel scroll in overlay space */ +struct VREvent_Scroll_t +{ + float xdelta, ydelta; // movement in fraction of the pad traversed since last delta, 1.0 for a full swipe + uint32_t repeatCount; +}; + +/** when in mouse input mode you can receive data from the touchpad, these events are only sent if the users finger + is on the touchpad (or just released from it) +**/ +struct VREvent_TouchPadMove_t +{ + // true if the users finger is detected on the touch pad + bool bFingerDown; + + // How long the finger has been down in seconds + float flSecondsFingerDown; + + // These values indicate the starting finger position (so you can do some basic swipe stuff) + float fValueXFirst; + float fValueYFirst; + + // This is the raw sampled coordinate without deadzoning + float fValueXRaw; + float fValueYRaw; +}; + +/** notification related events. Details will still change at this point */ +struct VREvent_Notification_t +{ + uint64_t ulUserValue; + uint32_t notificationId; +}; + +/** Used for events about processes */ +struct VREvent_Process_t +{ + uint32_t pid; + uint32_t oldPid; + bool bForced; +}; + + +/** Used for a few events about overlays */ +struct VREvent_Overlay_t +{ + uint64_t overlayHandle; +}; + + +/** Used for a few events about overlays */ +struct VREvent_Status_t +{ + uint32_t statusState; // EVRState enum +}; + +/** Used for keyboard events **/ +struct VREvent_Keyboard_t +{ + char cNewInput[8]; // Up to 11 bytes of new input + uint64_t uUserValue; // Possible flags about the new input +}; + +struct VREvent_Ipd_t +{ + float ipdMeters; +}; + +struct VREvent_Chaperone_t +{ + uint64_t m_nPreviousUniverse; + uint64_t m_nCurrentUniverse; +}; + +/** Not actually used for any events */ +struct VREvent_Reserved_t +{ + uint64_t reserved0; + uint64_t reserved1; +}; + +struct VREvent_PerformanceTest_t +{ + uint32_t m_nFidelityLevel; +}; + +struct VREvent_SeatedZeroPoseReset_t +{ + bool bResetBySystemMenu; +}; + +struct VREvent_Screenshot_t +{ + uint32_t handle; + uint32_t type; +}; + +struct VREvent_ScreenshotProgress_t +{ + float progress; +}; + +struct VREvent_ApplicationLaunch_t +{ + uint32_t pid; + uint32_t unArgsHandle; +}; + +struct VREvent_EditingCameraSurface_t +{ + uint64_t overlayHandle; + uint32_t nVisualMode; +}; + +struct VREvent_MessageOverlay_t +{ + uint32_t unVRMessageOverlayResponse; // vr::VRMessageOverlayResponse enum +}; + +struct VREvent_Property_t +{ + PropertyContainerHandle_t container; + ETrackedDeviceProperty prop; +}; + +/** NOTE!!! If you change this you MUST manually update openvr_interop.cs.py */ +typedef union +{ + VREvent_Reserved_t reserved; + VREvent_Controller_t controller; + VREvent_Mouse_t mouse; + VREvent_Scroll_t scroll; + VREvent_Process_t process; + VREvent_Notification_t notification; + VREvent_Overlay_t overlay; + VREvent_Status_t status; + VREvent_Keyboard_t keyboard; + VREvent_Ipd_t ipd; + VREvent_Chaperone_t chaperone; + VREvent_PerformanceTest_t performanceTest; + VREvent_TouchPadMove_t touchPadMove; + VREvent_SeatedZeroPoseReset_t seatedZeroPoseReset; + VREvent_Screenshot_t screenshot; + VREvent_ScreenshotProgress_t screenshotProgress; + VREvent_ApplicationLaunch_t applicationLaunch; + VREvent_EditingCameraSurface_t cameraSurface; + VREvent_MessageOverlay_t messageOverlay; + VREvent_Property_t property; +} VREvent_Data_t; + + +#if defined(__linux__) || defined(__APPLE__) +// This structure was originally defined mis-packed on Linux, preserved for +// compatibility. +#pragma pack( push, 4 ) +#endif + +/** An event posted by the server to all running applications */ +struct VREvent_t +{ + uint32_t eventType; // EVREventType enum + TrackedDeviceIndex_t trackedDeviceIndex; + float eventAgeSeconds; + // event data must be the end of the struct as its size is variable + VREvent_Data_t data; +}; + +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( pop ) +#endif + +/** The mesh to draw into the stencil (or depth) buffer to perform +* early stencil (or depth) kills of pixels that will never appear on the HMD. +* This mesh draws on all the pixels that will be hidden after distortion. +* +* If the HMD does not provide a visible area mesh pVertexData will be +* NULL and unTriangleCount will be 0. */ +struct HiddenAreaMesh_t +{ + const HmdVector2_t *pVertexData; + uint32_t unTriangleCount; +}; + + +enum EHiddenAreaMeshType +{ + k_eHiddenAreaMesh_Standard = 0, + k_eHiddenAreaMesh_Inverse = 1, + k_eHiddenAreaMesh_LineLoop = 2, + + k_eHiddenAreaMesh_Max = 3, +}; + + +/** Identifies what kind of axis is on the controller at index n. Read this type +* with pVRSystem->Get( nControllerDeviceIndex, Prop_Axis0Type_Int32 + n ); +*/ +enum EVRControllerAxisType +{ + k_eControllerAxis_None = 0, + k_eControllerAxis_TrackPad = 1, + k_eControllerAxis_Joystick = 2, + k_eControllerAxis_Trigger = 3, // Analog trigger data is in the X axis +}; + + +/** contains information about one axis on the controller */ +struct VRControllerAxis_t +{ + 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. + float y; // Ranges from -1.0 to 1.0 for joysticks and track pads. Is always 0.0 for triggers. +}; + + +/** the number of axes in the controller state */ +static const uint32_t k_unControllerStateAxisCount = 5; + + +#if defined(__linux__) || defined(__APPLE__) +// This structure was originally defined mis-packed on Linux, preserved for +// compatibility. +#pragma pack( push, 4 ) +#endif + +/** Holds all the state of a controller at one moment in time. */ +struct VRControllerState001_t +{ + // If packet num matches that on your prior call, then the controller state hasn't been changed since + // your last call and there is no need to process it + uint32_t unPacketNum; + + // bit flags for each of the buttons. Use ButtonMaskFromId to turn an ID into a mask + uint64_t ulButtonPressed; + uint64_t ulButtonTouched; + + // Axis data for the controller's analog inputs + VRControllerAxis_t rAxis[ k_unControllerStateAxisCount ]; +}; +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( pop ) +#endif + + +typedef VRControllerState001_t VRControllerState_t; + + +/** determines how to provide output to the application of various event processing functions. */ +enum EVRControllerEventOutputType +{ + ControllerEventOutput_OSEvents = 0, + ControllerEventOutput_VREvents = 1, +}; + + + +/** Collision Bounds Style */ +enum ECollisionBoundsStyle +{ + COLLISION_BOUNDS_STYLE_BEGINNER = 0, + COLLISION_BOUNDS_STYLE_INTERMEDIATE, + COLLISION_BOUNDS_STYLE_SQUARES, + COLLISION_BOUNDS_STYLE_ADVANCED, + COLLISION_BOUNDS_STYLE_NONE, + + COLLISION_BOUNDS_STYLE_COUNT +}; + +/** Allows the application to customize how the overlay appears in the compositor */ +struct Compositor_OverlaySettings +{ + uint32_t size; // sizeof(Compositor_OverlaySettings) + bool curved, antialias; + float scale, distance, alpha; + float uOffset, vOffset, uScale, vScale; + float gridDivs, gridWidth, gridScale; + HmdMatrix44_t transform; +}; + +/** used to refer to a single VR overlay */ +typedef uint64_t VROverlayHandle_t; + +static const VROverlayHandle_t k_ulOverlayHandleInvalid = 0; + +/** Errors that can occur around VR overlays */ +enum EVROverlayError +{ + VROverlayError_None = 0, + + VROverlayError_UnknownOverlay = 10, + VROverlayError_InvalidHandle = 11, + VROverlayError_PermissionDenied = 12, + VROverlayError_OverlayLimitExceeded = 13, // No more overlays could be created because the maximum number already exist + VROverlayError_WrongVisibilityType = 14, + VROverlayError_KeyTooLong = 15, + VROverlayError_NameTooLong = 16, + VROverlayError_KeyInUse = 17, + VROverlayError_WrongTransformType = 18, + VROverlayError_InvalidTrackedDevice = 19, + VROverlayError_InvalidParameter = 20, + VROverlayError_ThumbnailCantBeDestroyed = 21, + VROverlayError_ArrayTooSmall = 22, + VROverlayError_RequestFailed = 23, + VROverlayError_InvalidTexture = 24, + VROverlayError_UnableToLoadFile = 25, + VROverlayError_KeyboardAlreadyInUse = 26, + VROverlayError_NoNeighbor = 27, + VROverlayError_TooManyMaskPrimitives = 29, + VROverlayError_BadMaskPrimitive = 30, +}; + +/** enum values to pass in to VR_Init to identify whether the application will +* draw a 3D scene. */ +enum EVRApplicationType +{ + VRApplication_Other = 0, // Some other kind of application that isn't covered by the other entries + VRApplication_Scene = 1, // Application will submit 3D frames + VRApplication_Overlay = 2, // Application only interacts with overlays + VRApplication_Background = 3, // Application should not start SteamVR if it's not already running, and should not + // keep it running if everything else quits. + VRApplication_Utility = 4, // Init should not try to load any drivers. The application needs access to utility + // interfaces (like IVRSettings and IVRApplications) but not hardware. + VRApplication_VRMonitor = 5, // Reserved for vrmonitor + VRApplication_SteamWatchdog = 6,// Reserved for Steam + VRApplication_Bootstrapper = 7, // Start up SteamVR + + VRApplication_Max +}; + + +/** error codes for firmware */ +enum EVRFirmwareError +{ + VRFirmwareError_None = 0, + VRFirmwareError_Success = 1, + VRFirmwareError_Fail = 2, +}; + + +/** error codes for notifications */ +enum EVRNotificationError +{ + VRNotificationError_OK = 0, + VRNotificationError_InvalidNotificationId = 100, + VRNotificationError_NotificationQueueFull = 101, + VRNotificationError_InvalidOverlayHandle = 102, + VRNotificationError_SystemWithUserValueAlreadyExists = 103, +}; + + +/** error codes returned by Vr_Init */ + +// Please add adequate error description to https://developer.valvesoftware.com/w/index.php?title=Category:SteamVRHelp +enum EVRInitError +{ + VRInitError_None = 0, + VRInitError_Unknown = 1, + + VRInitError_Init_InstallationNotFound = 100, + VRInitError_Init_InstallationCorrupt = 101, + VRInitError_Init_VRClientDLLNotFound = 102, + VRInitError_Init_FileNotFound = 103, + VRInitError_Init_FactoryNotFound = 104, + VRInitError_Init_InterfaceNotFound = 105, + VRInitError_Init_InvalidInterface = 106, + VRInitError_Init_UserConfigDirectoryInvalid = 107, + VRInitError_Init_HmdNotFound = 108, + VRInitError_Init_NotInitialized = 109, + VRInitError_Init_PathRegistryNotFound = 110, + VRInitError_Init_NoConfigPath = 111, + VRInitError_Init_NoLogPath = 112, + VRInitError_Init_PathRegistryNotWritable = 113, + VRInitError_Init_AppInfoInitFailed = 114, + VRInitError_Init_Retry = 115, // Used internally to cause retries to vrserver + VRInitError_Init_InitCanceledByUser = 116, // The calling application should silently exit. The user canceled app startup + VRInitError_Init_AnotherAppLaunching = 117, + VRInitError_Init_SettingsInitFailed = 118, + VRInitError_Init_ShuttingDown = 119, + VRInitError_Init_TooManyObjects = 120, + VRInitError_Init_NoServerForBackgroundApp = 121, + VRInitError_Init_NotSupportedWithCompositor = 122, + VRInitError_Init_NotAvailableToUtilityApps = 123, + VRInitError_Init_Internal = 124, + VRInitError_Init_HmdDriverIdIsNone = 125, + VRInitError_Init_HmdNotFoundPresenceFailed = 126, + VRInitError_Init_VRMonitorNotFound = 127, + VRInitError_Init_VRMonitorStartupFailed = 128, + VRInitError_Init_LowPowerWatchdogNotSupported = 129, + VRInitError_Init_InvalidApplicationType = 130, + VRInitError_Init_NotAvailableToWatchdogApps = 131, + VRInitError_Init_WatchdogDisabledInSettings = 132, + VRInitError_Init_VRDashboardNotFound = 133, + VRInitError_Init_VRDashboardStartupFailed = 134, + VRInitError_Init_VRHomeNotFound = 135, + VRInitError_Init_VRHomeStartupFailed = 136, + + VRInitError_Driver_Failed = 200, + VRInitError_Driver_Unknown = 201, + VRInitError_Driver_HmdUnknown = 202, + VRInitError_Driver_NotLoaded = 203, + VRInitError_Driver_RuntimeOutOfDate = 204, + VRInitError_Driver_HmdInUse = 205, + VRInitError_Driver_NotCalibrated = 206, + VRInitError_Driver_CalibrationInvalid = 207, + VRInitError_Driver_HmdDisplayNotFound = 208, + VRInitError_Driver_TrackedDeviceInterfaceUnknown = 209, + // VRInitError_Driver_HmdDisplayNotFoundAfterFix = 210, // not needed: here for historic reasons + VRInitError_Driver_HmdDriverIdOutOfBounds = 211, + VRInitError_Driver_HmdDisplayMirrored = 212, + + VRInitError_IPC_ServerInitFailed = 300, + VRInitError_IPC_ConnectFailed = 301, + VRInitError_IPC_SharedStateInitFailed = 302, + VRInitError_IPC_CompositorInitFailed = 303, + VRInitError_IPC_MutexInitFailed = 304, + VRInitError_IPC_Failed = 305, + VRInitError_IPC_CompositorConnectFailed = 306, + VRInitError_IPC_CompositorInvalidConnectResponse = 307, + VRInitError_IPC_ConnectFailedAfterMultipleAttempts = 308, + + VRInitError_Compositor_Failed = 400, + VRInitError_Compositor_D3D11HardwareRequired = 401, + VRInitError_Compositor_FirmwareRequiresUpdate = 402, + VRInitError_Compositor_OverlayInitFailed = 403, + VRInitError_Compositor_ScreenshotsInitFailed = 404, + VRInitError_Compositor_UnableToCreateDevice = 405, + + VRInitError_VendorSpecific_UnableToConnectToOculusRuntime = 1000, + + VRInitError_VendorSpecific_HmdFound_CantOpenDevice = 1101, + VRInitError_VendorSpecific_HmdFound_UnableToRequestConfigStart = 1102, + VRInitError_VendorSpecific_HmdFound_NoStoredConfig = 1103, + VRInitError_VendorSpecific_HmdFound_ConfigTooBig = 1104, + VRInitError_VendorSpecific_HmdFound_ConfigTooSmall = 1105, + VRInitError_VendorSpecific_HmdFound_UnableToInitZLib = 1106, + VRInitError_VendorSpecific_HmdFound_CantReadFirmwareVersion = 1107, + VRInitError_VendorSpecific_HmdFound_UnableToSendUserDataStart = 1108, + VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataStart = 1109, + VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataNext = 1110, + VRInitError_VendorSpecific_HmdFound_UserDataAddressRange = 1111, + VRInitError_VendorSpecific_HmdFound_UserDataError = 1112, + VRInitError_VendorSpecific_HmdFound_ConfigFailedSanityCheck = 1113, + + VRInitError_Steam_SteamInstallationNotFound = 2000, +}; + +enum EVRScreenshotType +{ + VRScreenshotType_None = 0, + VRScreenshotType_Mono = 1, // left eye only + VRScreenshotType_Stereo = 2, + VRScreenshotType_Cubemap = 3, + VRScreenshotType_MonoPanorama = 4, + VRScreenshotType_StereoPanorama = 5 +}; + +enum EVRScreenshotPropertyFilenames +{ + VRScreenshotPropertyFilenames_Preview = 0, + VRScreenshotPropertyFilenames_VR = 1, +}; + +enum EVRTrackedCameraError +{ + VRTrackedCameraError_None = 0, + VRTrackedCameraError_OperationFailed = 100, + VRTrackedCameraError_InvalidHandle = 101, + VRTrackedCameraError_InvalidFrameHeaderVersion = 102, + VRTrackedCameraError_OutOfHandles = 103, + VRTrackedCameraError_IPCFailure = 104, + VRTrackedCameraError_NotSupportedForThisDevice = 105, + VRTrackedCameraError_SharedMemoryFailure = 106, + VRTrackedCameraError_FrameBufferingFailure = 107, + VRTrackedCameraError_StreamSetupFailure = 108, + VRTrackedCameraError_InvalidGLTextureId = 109, + VRTrackedCameraError_InvalidSharedTextureHandle = 110, + VRTrackedCameraError_FailedToGetGLTextureId = 111, + VRTrackedCameraError_SharedTextureFailure = 112, + VRTrackedCameraError_NoFrameAvailable = 113, + VRTrackedCameraError_InvalidArgument = 114, + VRTrackedCameraError_InvalidFrameBufferSize = 115, +}; + +enum EVRTrackedCameraFrameType +{ + VRTrackedCameraFrameType_Distorted = 0, // This is the camera video frame size in pixels, still distorted. + VRTrackedCameraFrameType_Undistorted, // In pixels, an undistorted inscribed rectangle region without invalid regions. This size is subject to changes shortly. + VRTrackedCameraFrameType_MaximumUndistorted, // In pixels, maximum undistorted with invalid regions. Non zero alpha component identifies valid regions. + MAX_CAMERA_FRAME_TYPES +}; + +typedef uint64_t TrackedCameraHandle_t; +#define INVALID_TRACKED_CAMERA_HANDLE ((vr::TrackedCameraHandle_t)0) + +struct CameraVideoStreamFrameHeader_t +{ + EVRTrackedCameraFrameType eFrameType; + + uint32_t nWidth; + uint32_t nHeight; + uint32_t nBytesPerPixel; + + uint32_t nFrameSequence; + + TrackedDevicePose_t standingTrackedDevicePose; +}; + +// Screenshot types +typedef uint32_t ScreenshotHandle_t; + +static const uint32_t k_unScreenshotHandleInvalid = 0; + +#pragma pack( pop ) + +// figure out how to import from the VR API dll +#if defined(_WIN32) + +#ifdef VR_API_EXPORT +#define VR_INTERFACE extern "C" __declspec( dllexport ) +#else +#define VR_INTERFACE extern "C" __declspec( dllimport ) +#endif + +#elif defined(__GNUC__) || defined(COMPILER_GCC) || defined(__APPLE__) + +#ifdef VR_API_EXPORT +#define VR_INTERFACE extern "C" __attribute__((visibility("default"))) +#else +#define VR_INTERFACE extern "C" +#endif + +#else +#error "Unsupported Platform." +#endif + + +#if defined( _WIN32 ) +#define VR_CALLTYPE __cdecl +#else +#define VR_CALLTYPE +#endif + +} // namespace vr + +#endif // _INCLUDE_VRTYPES_H + + +// vrannotation.h +#ifdef API_GEN +# define VR_CLANG_ATTR(ATTR) __attribute__((annotate( ATTR ))) +#else +# define VR_CLANG_ATTR(ATTR) +#endif + +#define VR_METHOD_DESC(DESC) VR_CLANG_ATTR( "desc:" #DESC ";" ) +#define VR_IGNOREATTR() VR_CLANG_ATTR( "ignore" ) +#define VR_OUT_STRUCT() VR_CLANG_ATTR( "out_struct: ;" ) +#define VR_OUT_STRING() VR_CLANG_ATTR( "out_string: ;" ) +#define VR_OUT_ARRAY_CALL(COUNTER,FUNCTION,PARAMS) VR_CLANG_ATTR( "out_array_call:" #COUNTER "," #FUNCTION "," #PARAMS ";" ) +#define VR_OUT_ARRAY_COUNT(COUNTER) VR_CLANG_ATTR( "out_array_count:" #COUNTER ";" ) +#define VR_ARRAY_COUNT(COUNTER) VR_CLANG_ATTR( "array_count:" #COUNTER ";" ) +#define VR_ARRAY_COUNT_D(COUNTER, DESC) VR_CLANG_ATTR( "array_count:" #COUNTER ";desc:" #DESC ) +#define VR_BUFFER_COUNT(COUNTER) VR_CLANG_ATTR( "buffer_count:" #COUNTER ";" ) +#define VR_OUT_BUFFER_COUNT(COUNTER) VR_CLANG_ATTR( "out_buffer_count:" #COUNTER ";" ) +#define VR_OUT_STRING_COUNT(COUNTER) VR_CLANG_ATTR( "out_string_count:" #COUNTER ";" ) + +// ivrsystem.h +namespace vr +{ + +class IVRSystem +{ +public: + + + // ------------------------------------ + // Display Methods + // ------------------------------------ + + /** Suggested size for the intermediate render target that the distortion pulls from. */ + virtual void GetRecommendedRenderTargetSize( uint32_t *pnWidth, uint32_t *pnHeight ) = 0; + + /** The projection matrix for the specified eye */ + virtual HmdMatrix44_t GetProjectionMatrix( EVREye eEye, float fNearZ, float fFarZ ) = 0; + + /** The components necessary to build your own projection matrix in case your + * application is doing something fancy like infinite Z */ + virtual void GetProjectionRaw( EVREye eEye, float *pfLeft, float *pfRight, float *pfTop, float *pfBottom ) = 0; + + /** Gets the result of the distortion function for the specified eye and input UVs. UVs go from 0,0 in + * the upper left of that eye's viewport and 1,1 in the lower right of that eye's viewport. + * Returns true for success. Otherwise, returns false, and distortion coordinates are not suitable. */ + virtual bool ComputeDistortion( EVREye eEye, float fU, float fV, DistortionCoordinates_t *pDistortionCoordinates ) = 0; + + /** Returns the transform from eye space to the head space. Eye space is the per-eye flavor of head + * space that provides stereo disparity. Instead of Model * View * Projection the sequence is Model * View * Eye^-1 * Projection. + * Normally View and Eye^-1 will be multiplied together and treated as View in your application. + */ + virtual HmdMatrix34_t GetEyeToHeadTransform( EVREye eEye ) = 0; + + /** Returns the number of elapsed seconds since the last recorded vsync event. This + * will come from a vsync timer event in the timer if possible or from the application-reported + * time if that is not available. If no vsync times are available the function will + * return zero for vsync time and frame counter and return false from the method. */ + virtual bool GetTimeSinceLastVsync( float *pfSecondsSinceLastVsync, uint64_t *pulFrameCounter ) = 0; + + /** [D3D9 Only] + * Returns the adapter index that the user should pass into CreateDevice to set up D3D9 in such + * a way that it can go full screen exclusive on the HMD. Returns -1 if there was an error. + */ + virtual int32_t GetD3D9AdapterIndex() = 0; + + /** [D3D10/11 Only] + * Returns the adapter index that the user should pass into EnumAdapters to create the device + * and swap chain in DX10 and DX11. If an error occurs the index will be set to -1. + */ + virtual void GetDXGIOutputInfo( int32_t *pnAdapterIndex ) = 0; + + /** + * Returns platform- and texture-type specific adapter identification so that applications and the + * compositor are creating textures and swap chains on the same GPU. If an error occurs the device + * will be set to 0. + * [D3D10/11/12 Only (D3D9 Not Supported)] + * Returns the adapter LUID that identifies the GPU attached to the HMD. The user should + * enumerate all adapters using IDXGIFactory::EnumAdapters and IDXGIAdapter::GetDesc to find + * the adapter with the matching LUID, or use IDXGIFactory4::EnumAdapterByLuid. + * The discovered IDXGIAdapter should be used to create the device and swap chain. + * [Vulkan Only] + * Returns the vk::PhysicalDevice that should be used by the application. + * [macOS Only] + * Returns an id that should be used by the application. + */ + virtual void GetOutputDevice( uint64_t *pnDevice, ETextureType textureType ) = 0; + + // ------------------------------------ + // Display Mode methods + // ------------------------------------ + + /** Use to determine if the headset display is part of the desktop (i.e. extended) or hidden (i.e. direct mode). */ + virtual bool IsDisplayOnDesktop() = 0; + + /** Set the display visibility (true = extended, false = direct mode). Return value of true indicates that the change was successful. */ + virtual bool SetDisplayVisibility( bool bIsVisibleOnDesktop ) = 0; + + // ------------------------------------ + // Tracking Methods + // ------------------------------------ + + /** The pose that the tracker thinks that the HMD will be in at the specified number of seconds into the + * future. Pass 0 to get the state at the instant the method is called. Most of the time the application should + * calculate the time until the photons will be emitted from the display and pass that time into the method. + * + * This is roughly analogous to the inverse of the view matrix in most applications, though + * many games will need to do some additional rotation or translation on top of the rotation + * and translation provided by the head pose. + * + * For devices where bPoseIsValid is true the application can use the pose to position the device + * in question. The provided array can be any size up to k_unMaxTrackedDeviceCount. + * + * Seated experiences should call this method with TrackingUniverseSeated and receive poses relative + * to the seated zero pose. Standing experiences should call this method with TrackingUniverseStanding + * and receive poses relative to the Chaperone Play Area. TrackingUniverseRawAndUncalibrated should + * probably not be used unless the application is the Chaperone calibration tool itself, but will provide + * poses relative to the hardware-specific coordinate system in the driver. + */ + virtual void GetDeviceToAbsoluteTrackingPose( ETrackingUniverseOrigin eOrigin, float fPredictedSecondsToPhotonsFromNow, VR_ARRAY_COUNT(unTrackedDevicePoseArrayCount) TrackedDevicePose_t *pTrackedDevicePoseArray, uint32_t unTrackedDevicePoseArrayCount ) = 0; + + /** Sets the zero pose for the seated tracker coordinate system to the current position and yaw of the HMD. After + * ResetSeatedZeroPose all GetDeviceToAbsoluteTrackingPose calls that pass TrackingUniverseSeated as the origin + * will be relative to this new zero pose. The new zero coordinate system will not change the fact that the Y axis + * is up in the real world, so the next pose returned from GetDeviceToAbsoluteTrackingPose after a call to + * ResetSeatedZeroPose may not be exactly an identity matrix. + * + * NOTE: This function overrides the user's previously saved seated zero pose and should only be called as the result of a user action. + * Users are also able to set their seated zero pose via the OpenVR Dashboard. + **/ + virtual void ResetSeatedZeroPose() = 0; + + /** Returns the transform from the seated zero pose to the standing absolute tracking system. This allows + * applications to represent the seated origin to used or transform object positions from one coordinate + * system to the other. + * + * The seated origin may or may not be inside the Play Area or Collision Bounds returned by IVRChaperone. Its position + * depends on what the user has set from the Dashboard settings and previous calls to ResetSeatedZeroPose. */ + virtual HmdMatrix34_t GetSeatedZeroPoseToStandingAbsoluteTrackingPose() = 0; + + /** Returns the transform from the tracking origin to the standing absolute tracking system. This allows + * applications to convert from raw tracking space to the calibrated standing coordinate system. */ + virtual HmdMatrix34_t GetRawZeroPoseToStandingAbsoluteTrackingPose() = 0; + + /** Get a sorted array of device indices of a given class of tracked devices (e.g. controllers). Devices are sorted right to left + * relative to the specified tracked device (default: hmd -- pass in -1 for absolute tracking space). Returns the number of devices + * in the list, or the size of the array needed if not large enough. */ + 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; + + /** Returns the level of activity on the device. */ + virtual EDeviceActivityLevel GetTrackedDeviceActivityLevel( vr::TrackedDeviceIndex_t unDeviceId ) = 0; + + /** Convenience utility to apply the specified transform to the specified pose. + * This properly transforms all pose components, including velocity and angular velocity + */ + virtual void ApplyTransform( TrackedDevicePose_t *pOutputPose, const TrackedDevicePose_t *pTrackedDevicePose, const HmdMatrix34_t *pTransform ) = 0; + + /** Returns the device index associated with a specific role, for example the left hand or the right hand. */ + virtual vr::TrackedDeviceIndex_t GetTrackedDeviceIndexForControllerRole( vr::ETrackedControllerRole unDeviceType ) = 0; + + /** Returns the controller type associated with a device index. */ + virtual vr::ETrackedControllerRole GetControllerRoleForTrackedDeviceIndex( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0; + + // ------------------------------------ + // Property methods + // ------------------------------------ + + /** Returns the device class of a tracked device. If there has not been a device connected in this slot + * since the application started this function will return TrackedDevice_Invalid. For previous detected + * devices the function will return the previously observed device class. + * + * To determine which devices exist on the system, just loop from 0 to k_unMaxTrackedDeviceCount and check + * the device class. Every device with something other than TrackedDevice_Invalid is associated with an + * actual tracked device. */ + virtual ETrackedDeviceClass GetTrackedDeviceClass( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0; + + /** Returns true if there is a device connected in this slot. */ + virtual bool IsTrackedDeviceConnected( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0; + + /** Returns a bool property. If the device index is not valid or the property is not a bool type this function will return false. */ + virtual bool GetBoolTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0; + + /** Returns a float property. If the device index is not valid or the property is not a float type this function will return 0. */ + virtual float GetFloatTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0; + + /** Returns an int property. If the device index is not valid or the property is not a int type this function will return 0. */ + virtual int32_t GetInt32TrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0; + + /** Returns a uint64 property. If the device index is not valid or the property is not a uint64 type this function will return 0. */ + virtual uint64_t GetUint64TrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0; + + /** Returns a matrix property. If the device index is not valid or the property is not a matrix type, this function will return identity. */ + virtual HmdMatrix34_t GetMatrix34TrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0; + + /** Returns a string property. If the device index is not valid or the property is not a string type this function will + * return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing + * null. Strings will always fit in buffers of k_unMaxPropertyStringSize characters. */ + virtual uint32_t GetStringTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize, ETrackedPropertyError *pError = 0L ) = 0; + + /** returns a string that corresponds with the specified property error. The string will be the name + * of the error enum value for all valid error codes */ + virtual const char *GetPropErrorNameFromEnum( ETrackedPropertyError error ) = 0; + + // ------------------------------------ + // Event methods + // ------------------------------------ + + /** Returns true and fills the event with the next event on the queue if there is one. If there are no events + * this method returns false. uncbVREvent should be the size in bytes of the VREvent_t struct */ + virtual bool PollNextEvent( VREvent_t *pEvent, uint32_t uncbVREvent ) = 0; + + /** Returns true and fills the event with the next event on the queue if there is one. If there are no events + * this method returns false. Fills in the pose of the associated tracked device in the provided pose struct. + * This pose will always be older than the call to this function and should not be used to render the device. + uncbVREvent should be the size in bytes of the VREvent_t struct */ + virtual bool PollNextEventWithPose( ETrackingUniverseOrigin eOrigin, VREvent_t *pEvent, uint32_t uncbVREvent, vr::TrackedDevicePose_t *pTrackedDevicePose ) = 0; + + /** returns the name of an EVREvent enum value */ + virtual const char *GetEventTypeNameFromEnum( EVREventType eType ) = 0; + + // ------------------------------------ + // Rendering helper methods + // ------------------------------------ + + /** 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 + * 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. + * This mesh is meant to be rendered into the stencil buffer (or into the depth buffer setting nearz) before rendering each eye's view. + * This will improve performance by letting the GPU early-reject pixels the user will never see before running the pixel shader. + * NOTE: Render this mesh with backface culling disabled since the winding order of the vertices can be different per-HMD or per-eye. + * 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. + * 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. + */ + virtual HiddenAreaMesh_t GetHiddenAreaMesh( EVREye eEye, EHiddenAreaMeshType type = k_eHiddenAreaMesh_Standard ) = 0; + + // ------------------------------------ + // Controller methods + // ------------------------------------ + + /** Fills the supplied struct with the current state of the controller. Returns false if the controller index + * is invalid. */ + virtual bool GetControllerState( vr::TrackedDeviceIndex_t unControllerDeviceIndex, vr::VRControllerState_t *pControllerState, uint32_t unControllerStateSize ) = 0; + + /** fills the supplied struct with the current state of the controller and the provided pose with the pose of + * the controller when the controller state was updated most recently. Use this form if you need a precise controller + * pose as input to your application when the user presses or releases a button. */ + virtual bool GetControllerStateWithPose( ETrackingUniverseOrigin eOrigin, vr::TrackedDeviceIndex_t unControllerDeviceIndex, vr::VRControllerState_t *pControllerState, uint32_t unControllerStateSize, TrackedDevicePose_t *pTrackedDevicePose ) = 0; + + /** Trigger a single haptic pulse on a controller. After this call the application may not trigger another haptic pulse on this controller + * and axis combination for 5ms. */ + virtual void TriggerHapticPulse( vr::TrackedDeviceIndex_t unControllerDeviceIndex, uint32_t unAxisId, unsigned short usDurationMicroSec ) = 0; + + /** returns the name of an EVRButtonId enum value */ + virtual const char *GetButtonIdNameFromEnum( EVRButtonId eButtonId ) = 0; + + /** returns the name of an EVRControllerAxisType enum value */ + virtual const char *GetControllerAxisTypeNameFromEnum( EVRControllerAxisType eAxisType ) = 0; + + /** Tells OpenVR that this process wants exclusive access to controller button states and button events. Other apps will be notified that + * they have lost input focus with a VREvent_InputFocusCaptured event. Returns false if input focus could not be captured for + * some reason. */ + virtual bool CaptureInputFocus() = 0; + + /** Tells OpenVR that this process no longer wants exclusive access to button states and button events. Other apps will be notified + * that input focus has been released with a VREvent_InputFocusReleased event. */ + virtual void ReleaseInputFocus() = 0; + + /** Returns true if input focus is captured by another process. */ + virtual bool IsInputFocusCapturedByAnotherProcess() = 0; + + // ------------------------------------ + // Debug Methods + // ------------------------------------ + + /** Sends a request to the driver for the specified device and returns the response. The maximum response size is 32k, + * but this method can be called with a smaller buffer. If the response exceeds the size of the buffer, it is truncated. + * The size of the response including its terminating null is returned. */ + virtual uint32_t DriverDebugRequest( vr::TrackedDeviceIndex_t unDeviceIndex, const char *pchRequest, char *pchResponseBuffer, uint32_t unResponseBufferSize ) = 0; + + // ------------------------------------ + // Firmware methods + // ------------------------------------ + + /** Performs the actual firmware update if applicable. + * The following events will be sent, if VRFirmwareError_None was returned: VREvent_FirmwareUpdateStarted, VREvent_FirmwareUpdateFinished + * Use the properties Prop_Firmware_UpdateAvailable_Bool, Prop_Firmware_ManualUpdate_Bool, and Prop_Firmware_ManualUpdateURL_String + * to figure our whether a firmware update is available, and to figure out whether its a manual update + * Prop_Firmware_ManualUpdateURL_String should point to an URL describing the manual update process */ + virtual vr::EVRFirmwareError PerformFirmwareUpdate( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0; + + // ------------------------------------ + // Application life cycle methods + // ------------------------------------ + + /** Call this to acknowledge to the system that VREvent_Quit has been received and that the process is exiting. + * This extends the timeout until the process is killed. */ + virtual void AcknowledgeQuit_Exiting() = 0; + + /** Call this to tell the system that the user is being prompted to save data. This + * halts the timeout and dismisses the dashboard (if it was up). Applications should be sure to actually + * prompt the user to save and then exit afterward, otherwise the user will be left in a confusing state. */ + virtual void AcknowledgeQuit_UserPrompt() = 0; + +}; + +static const char * const IVRSystem_Version = "IVRSystem_016"; + +} + + +// ivrapplications.h +namespace vr +{ + + /** Used for all errors reported by the IVRApplications interface */ + enum EVRApplicationError + { + VRApplicationError_None = 0, + + VRApplicationError_AppKeyAlreadyExists = 100, // Only one application can use any given key + VRApplicationError_NoManifest = 101, // the running application does not have a manifest + VRApplicationError_NoApplication = 102, // No application is running + VRApplicationError_InvalidIndex = 103, + VRApplicationError_UnknownApplication = 104, // the application could not be found + VRApplicationError_IPCFailed = 105, // An IPC failure caused the request to fail + VRApplicationError_ApplicationAlreadyRunning = 106, + VRApplicationError_InvalidManifest = 107, + VRApplicationError_InvalidApplication = 108, + VRApplicationError_LaunchFailed = 109, // the process didn't start + VRApplicationError_ApplicationAlreadyStarting = 110, // the system was already starting the same application + VRApplicationError_LaunchInProgress = 111, // The system was already starting a different application + VRApplicationError_OldApplicationQuitting = 112, + VRApplicationError_TransitionAborted = 113, + VRApplicationError_IsTemplate = 114, // error when you try to call LaunchApplication() on a template type app (use LaunchTemplateApplication) + + VRApplicationError_BufferTooSmall = 200, // The provided buffer was too small to fit the requested data + VRApplicationError_PropertyNotSet = 201, // The requested property was not set + VRApplicationError_UnknownProperty = 202, + VRApplicationError_InvalidParameter = 203, + }; + + /** The maximum length of an application key */ + static const uint32_t k_unMaxApplicationKeyLength = 128; + + /** these are the properties available on applications. */ + enum EVRApplicationProperty + { + VRApplicationProperty_Name_String = 0, + + VRApplicationProperty_LaunchType_String = 11, + VRApplicationProperty_WorkingDirectory_String = 12, + VRApplicationProperty_BinaryPath_String = 13, + VRApplicationProperty_Arguments_String = 14, + VRApplicationProperty_URL_String = 15, + + VRApplicationProperty_Description_String = 50, + VRApplicationProperty_NewsURL_String = 51, + VRApplicationProperty_ImagePath_String = 52, + VRApplicationProperty_Source_String = 53, + + VRApplicationProperty_IsDashboardOverlay_Bool = 60, + VRApplicationProperty_IsTemplate_Bool = 61, + VRApplicationProperty_IsInstanced_Bool = 62, + VRApplicationProperty_IsInternal_Bool = 63, + + VRApplicationProperty_LastLaunchTime_Uint64 = 70, + }; + + /** These are states the scene application startup process will go through. */ + enum EVRApplicationTransitionState + { + VRApplicationTransition_None = 0, + + VRApplicationTransition_OldAppQuitSent = 10, + VRApplicationTransition_WaitingForExternalLaunch = 11, + + VRApplicationTransition_NewAppLaunched = 20, + }; + + struct AppOverrideKeys_t + { + const char *pchKey; + const char *pchValue; + }; + + /** Currently recognized mime types */ + static const char * const k_pch_MimeType_HomeApp = "vr/home"; + static const char * const k_pch_MimeType_GameTheater = "vr/game_theater"; + + class IVRApplications + { + public: + + // --------------- Application management --------------- // + + /** Adds an application manifest to the list to load when building the list of installed applications. + * Temporary manifests are not automatically loaded */ + virtual EVRApplicationError AddApplicationManifest( const char *pchApplicationManifestFullPath, bool bTemporary = false ) = 0; + + /** Removes an application manifest from the list to load when building the list of installed applications. */ + virtual EVRApplicationError RemoveApplicationManifest( const char *pchApplicationManifestFullPath ) = 0; + + /** Returns true if an application is installed */ + virtual bool IsApplicationInstalled( const char *pchAppKey ) = 0; + + /** Returns the number of applications available in the list */ + virtual uint32_t GetApplicationCount() = 0; + + /** Returns the key of the specified application. The index is at least 0 and is less than the return + * value of GetApplicationCount(). The buffer should be at least k_unMaxApplicationKeyLength in order to + * fit the key. */ + virtual EVRApplicationError GetApplicationKeyByIndex( uint32_t unApplicationIndex, VR_OUT_STRING() char *pchAppKeyBuffer, uint32_t unAppKeyBufferLen ) = 0; + + /** Returns the key of the application for the specified Process Id. The buffer should be at least + * k_unMaxApplicationKeyLength in order to fit the key. */ + virtual EVRApplicationError GetApplicationKeyByProcessId( uint32_t unProcessId, char *pchAppKeyBuffer, uint32_t unAppKeyBufferLen ) = 0; + + /** Launches the application. The existing scene application will exit and then the new application will start. + * This call is not valid for dashboard overlay applications. */ + virtual EVRApplicationError LaunchApplication( const char *pchAppKey ) = 0; + + /** Launches an instance of an application of type template, with its app key being pchNewAppKey (which must be unique) and optionally override sections + * from the manifest file via AppOverrideKeys_t + */ + virtual EVRApplicationError LaunchTemplateApplication( const char *pchTemplateAppKey, const char *pchNewAppKey, VR_ARRAY_COUNT( unKeys ) const AppOverrideKeys_t *pKeys, uint32_t unKeys ) = 0; + + /** 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 */ + virtual vr::EVRApplicationError LaunchApplicationFromMimeType( const char *pchMimeType, const char *pchArgs ) = 0; + + /** Launches the dashboard overlay application if it is not already running. This call is only valid for + * dashboard overlay applications. */ + virtual EVRApplicationError LaunchDashboardOverlay( const char *pchAppKey ) = 0; + + /** Cancel a pending launch for an application */ + virtual bool CancelApplicationLaunch( const char *pchAppKey ) = 0; + + /** Identifies a running application. OpenVR can't always tell which process started in response + * to a URL. This function allows a URL handler (or the process itself) to identify the app key + * for the now running application. Passing a process ID of 0 identifies the calling process. + * The application must be one that's known to the system via a call to AddApplicationManifest. */ + virtual EVRApplicationError IdentifyApplication( uint32_t unProcessId, const char *pchAppKey ) = 0; + + /** Returns the process ID for an application. Return 0 if the application was not found or is not running. */ + virtual uint32_t GetApplicationProcessId( const char *pchAppKey ) = 0; + + /** Returns a string for an applications error */ + virtual const char *GetApplicationsErrorNameFromEnum( EVRApplicationError error ) = 0; + + // --------------- Application properties --------------- // + + /** Returns a value for an application property. The required buffer size to fit this value will be returned. */ + virtual uint32_t GetApplicationPropertyString( const char *pchAppKey, EVRApplicationProperty eProperty, VR_OUT_STRING() char *pchPropertyValueBuffer, uint32_t unPropertyValueBufferLen, EVRApplicationError *peError = nullptr ) = 0; + + /** Returns a bool value for an application property. Returns false in all error cases. */ + virtual bool GetApplicationPropertyBool( const char *pchAppKey, EVRApplicationProperty eProperty, EVRApplicationError *peError = nullptr ) = 0; + + /** Returns a uint64 value for an application property. Returns 0 in all error cases. */ + virtual uint64_t GetApplicationPropertyUint64( const char *pchAppKey, EVRApplicationProperty eProperty, EVRApplicationError *peError = nullptr ) = 0; + + /** Sets the application auto-launch flag. This is only valid for applications which return true for VRApplicationProperty_IsDashboardOverlay_Bool. */ + virtual EVRApplicationError SetApplicationAutoLaunch( const char *pchAppKey, bool bAutoLaunch ) = 0; + + /** Gets the application auto-launch flag. This is only valid for applications which return true for VRApplicationProperty_IsDashboardOverlay_Bool. */ + virtual bool GetApplicationAutoLaunch( const char *pchAppKey ) = 0; + + /** Adds this mime-type to the list of supported mime types for this application*/ + virtual EVRApplicationError SetDefaultApplicationForMimeType( const char *pchAppKey, const char *pchMimeType ) = 0; + + /** return the app key that will open this mime type */ + virtual bool GetDefaultApplicationForMimeType( const char *pchMimeType, char *pchAppKeyBuffer, uint32_t unAppKeyBufferLen ) = 0; + + /** Get the list of supported mime types for this application, comma-delimited */ + virtual bool GetApplicationSupportedMimeTypes( const char *pchAppKey, char *pchMimeTypesBuffer, uint32_t unMimeTypesBuffer ) = 0; + + /** 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 */ + virtual uint32_t GetApplicationsThatSupportMimeType( const char *pchMimeType, char *pchAppKeysThatSupportBuffer, uint32_t unAppKeysThatSupportBuffer ) = 0; + + /** Get the args list from an app launch that had the process already running, you call this when you get a VREvent_ApplicationMimeTypeLoad */ + virtual uint32_t GetApplicationLaunchArguments( uint32_t unHandle, char *pchArgs, uint32_t unArgs ) = 0; + + // --------------- Transition methods --------------- // + + /** Returns the app key for the application that is starting up */ + virtual EVRApplicationError GetStartingApplication( char *pchAppKeyBuffer, uint32_t unAppKeyBufferLen ) = 0; + + /** Returns the application transition state */ + virtual EVRApplicationTransitionState GetTransitionState() = 0; + + /** Returns errors that would prevent the specified application from launching immediately. Calling this function will + * cause the current scene application to quit, so only call it when you are actually about to launch something else. + * What the caller should do about these failures depends on the failure: + * VRApplicationError_OldApplicationQuitting - An existing application has been told to quit. Wait for a VREvent_ProcessQuit + * and try again. + * VRApplicationError_ApplicationAlreadyStarting - This application is already starting. This is a permanent failure. + * VRApplicationError_LaunchInProgress - A different application is already starting. This is a permanent failure. + * VRApplicationError_None - Go ahead and launch. Everything is clear. + */ + virtual EVRApplicationError PerformApplicationPrelaunchCheck( const char *pchAppKey ) = 0; + + /** Returns a string for an application transition state */ + virtual const char *GetApplicationsTransitionStateNameFromEnum( EVRApplicationTransitionState state ) = 0; + + /** Returns true if the outgoing scene app has requested a save prompt before exiting */ + virtual bool IsQuitUserPromptRequested() = 0; + + /** Starts a subprocess within the calling application. This + * suppresses all application transition UI and automatically identifies the new executable + * as part of the same application. On success the calling process should exit immediately. + * If working directory is NULL or "" the directory portion of the binary path will be + * the working directory. */ + virtual EVRApplicationError LaunchInternalProcess( const char *pchBinaryPath, const char *pchArguments, const char *pchWorkingDirectory ) = 0; + + /** Returns the current scene process ID according to the application system. A scene process will get scene + * focus once it starts rendering, but it will appear here once it calls VR_Init with the Scene application + * type. */ + virtual uint32_t GetCurrentSceneProcessId() = 0; + }; + + static const char * const IVRApplications_Version = "IVRApplications_006"; + +} // namespace vr + +// ivrsettings.h +namespace vr +{ + enum EVRSettingsError + { + VRSettingsError_None = 0, + VRSettingsError_IPCFailed = 1, + VRSettingsError_WriteFailed = 2, + VRSettingsError_ReadFailed = 3, + VRSettingsError_JsonParseFailed = 4, + VRSettingsError_UnsetSettingHasNoDefault = 5, // This will be returned if the setting does not appear in the appropriate default file and has not been set + }; + + // The maximum length of a settings key + static const uint32_t k_unMaxSettingsKeyLength = 128; + + class IVRSettings + { + public: + virtual const char *GetSettingsErrorNameFromEnum( EVRSettingsError eError ) = 0; + + // Returns true if file sync occurred (force or settings dirty) + virtual bool Sync( bool bForce = false, EVRSettingsError *peError = nullptr ) = 0; + + virtual void SetBool( const char *pchSection, const char *pchSettingsKey, bool bValue, EVRSettingsError *peError = nullptr ) = 0; + virtual void SetInt32( const char *pchSection, const char *pchSettingsKey, int32_t nValue, EVRSettingsError *peError = nullptr ) = 0; + virtual void SetFloat( const char *pchSection, const char *pchSettingsKey, float flValue, EVRSettingsError *peError = nullptr ) = 0; + virtual void SetString( const char *pchSection, const char *pchSettingsKey, const char *pchValue, EVRSettingsError *peError = nullptr ) = 0; + + // Users of the system need to provide a proper default in default.vrsettings in the resources/settings/ directory + // of either the runtime or the driver_xxx directory. Otherwise the default will be false, 0, 0.0 or "" + virtual bool GetBool( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0; + virtual int32_t GetInt32( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0; + virtual float GetFloat( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0; + virtual void GetString( const char *pchSection, const char *pchSettingsKey, VR_OUT_STRING() char *pchValue, uint32_t unValueLen, EVRSettingsError *peError = nullptr ) = 0; + + virtual void RemoveSection( const char *pchSection, EVRSettingsError *peError = nullptr ) = 0; + virtual void RemoveKeyInSection( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0; + }; + + //----------------------------------------------------------------------------- + static const char * const IVRSettings_Version = "IVRSettings_002"; + + //----------------------------------------------------------------------------- + // steamvr keys + static const char * const k_pch_SteamVR_Section = "steamvr"; + static const char * const k_pch_SteamVR_RequireHmd_String = "requireHmd"; + static const char * const k_pch_SteamVR_ForcedDriverKey_String = "forcedDriver"; + static const char * const k_pch_SteamVR_ForcedHmdKey_String = "forcedHmd"; + static const char * const k_pch_SteamVR_DisplayDebug_Bool = "displayDebug"; + static const char * const k_pch_SteamVR_DebugProcessPipe_String = "debugProcessPipe"; + static const char * const k_pch_SteamVR_DisplayDebugX_Int32 = "displayDebugX"; + static const char * const k_pch_SteamVR_DisplayDebugY_Int32 = "displayDebugY"; + static const char * const k_pch_SteamVR_SendSystemButtonToAllApps_Bool= "sendSystemButtonToAllApps"; + static const char * const k_pch_SteamVR_LogLevel_Int32 = "loglevel"; + static const char * const k_pch_SteamVR_IPD_Float = "ipd"; + static const char * const k_pch_SteamVR_Background_String = "background"; + static const char * const k_pch_SteamVR_BackgroundUseDomeProjection_Bool = "backgroundUseDomeProjection"; + static const char * const k_pch_SteamVR_BackgroundCameraHeight_Float = "backgroundCameraHeight"; + static const char * const k_pch_SteamVR_BackgroundDomeRadius_Float = "backgroundDomeRadius"; + static const char * const k_pch_SteamVR_GridColor_String = "gridColor"; + static const char * const k_pch_SteamVR_PlayAreaColor_String = "playAreaColor"; + static const char * const k_pch_SteamVR_ShowStage_Bool = "showStage"; + static const char * const k_pch_SteamVR_ActivateMultipleDrivers_Bool = "activateMultipleDrivers"; + static const char * const k_pch_SteamVR_DirectMode_Bool = "directMode"; + static const char * const k_pch_SteamVR_DirectModeEdidVid_Int32 = "directModeEdidVid"; + static const char * const k_pch_SteamVR_DirectModeEdidPid_Int32 = "directModeEdidPid"; + static const char * const k_pch_SteamVR_UsingSpeakers_Bool = "usingSpeakers"; + static const char * const k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float = "speakersForwardYawOffsetDegrees"; + static const char * const k_pch_SteamVR_BaseStationPowerManagement_Bool = "basestationPowerManagement"; + static const char * const k_pch_SteamVR_NeverKillProcesses_Bool = "neverKillProcesses"; + static const char * const k_pch_SteamVR_SupersampleScale_Float = "supersampleScale"; + static const char * const k_pch_SteamVR_AllowAsyncReprojection_Bool = "allowAsyncReprojection"; + static const char * const k_pch_SteamVR_AllowReprojection_Bool = "allowInterleavedReprojection"; + static const char * const k_pch_SteamVR_ForceReprojection_Bool = "forceReprojection"; + static const char * const k_pch_SteamVR_ForceFadeOnBadTracking_Bool = "forceFadeOnBadTracking"; + static const char * const k_pch_SteamVR_DefaultMirrorView_Int32 = "defaultMirrorView"; + static const char * const k_pch_SteamVR_ShowMirrorView_Bool = "showMirrorView"; + static const char * const k_pch_SteamVR_MirrorViewGeometry_String = "mirrorViewGeometry"; + static const char * const k_pch_SteamVR_StartMonitorFromAppLaunch = "startMonitorFromAppLaunch"; + static const char * const k_pch_SteamVR_StartCompositorFromAppLaunch_Bool = "startCompositorFromAppLaunch"; + static const char * const k_pch_SteamVR_StartDashboardFromAppLaunch_Bool = "startDashboardFromAppLaunch"; + static const char * const k_pch_SteamVR_StartOverlayAppsFromDashboard_Bool = "startOverlayAppsFromDashboard"; + static const char * const k_pch_SteamVR_EnableHomeApp = "enableHomeApp"; + static const char * const k_pch_SteamVR_CycleBackgroundImageTimeSec_Int32 = "CycleBackgroundImageTimeSec"; + static const char * const k_pch_SteamVR_RetailDemo_Bool = "retailDemo"; + static const char * const k_pch_SteamVR_IpdOffset_Float = "ipdOffset"; + static const char * const k_pch_SteamVR_AllowSupersampleFiltering_Bool = "allowSupersampleFiltering"; + + //----------------------------------------------------------------------------- + // lighthouse keys + static const char * const k_pch_Lighthouse_Section = "driver_lighthouse"; + static const char * const k_pch_Lighthouse_DisableIMU_Bool = "disableimu"; + static const char * const k_pch_Lighthouse_UseDisambiguation_String = "usedisambiguation"; + static const char * const k_pch_Lighthouse_DisambiguationDebug_Int32 = "disambiguationdebug"; + static const char * const k_pch_Lighthouse_PrimaryBasestation_Int32 = "primarybasestation"; + static const char * const k_pch_Lighthouse_DBHistory_Bool = "dbhistory"; + + //----------------------------------------------------------------------------- + // null keys + static const char * const k_pch_Null_Section = "driver_null"; + static const char * const k_pch_Null_SerialNumber_String = "serialNumber"; + static const char * const k_pch_Null_ModelNumber_String = "modelNumber"; + static const char * const k_pch_Null_WindowX_Int32 = "windowX"; + static const char * const k_pch_Null_WindowY_Int32 = "windowY"; + static const char * const k_pch_Null_WindowWidth_Int32 = "windowWidth"; + static const char * const k_pch_Null_WindowHeight_Int32 = "windowHeight"; + static const char * const k_pch_Null_RenderWidth_Int32 = "renderWidth"; + static const char * const k_pch_Null_RenderHeight_Int32 = "renderHeight"; + static const char * const k_pch_Null_SecondsFromVsyncToPhotons_Float = "secondsFromVsyncToPhotons"; + static const char * const k_pch_Null_DisplayFrequency_Float = "displayFrequency"; + + //----------------------------------------------------------------------------- + // user interface keys + static const char * const k_pch_UserInterface_Section = "userinterface"; + static const char * const k_pch_UserInterface_StatusAlwaysOnTop_Bool = "StatusAlwaysOnTop"; + static const char * const k_pch_UserInterface_MinimizeToTray_Bool = "MinimizeToTray"; + static const char * const k_pch_UserInterface_Screenshots_Bool = "screenshots"; + static const char * const k_pch_UserInterface_ScreenshotType_Int = "screenshotType"; + + //----------------------------------------------------------------------------- + // notification keys + static const char * const k_pch_Notifications_Section = "notifications"; + static const char * const k_pch_Notifications_DoNotDisturb_Bool = "DoNotDisturb"; + + //----------------------------------------------------------------------------- + // keyboard keys + static const char * const k_pch_Keyboard_Section = "keyboard"; + static const char * const k_pch_Keyboard_TutorialCompletions = "TutorialCompletions"; + static const char * const k_pch_Keyboard_ScaleX = "ScaleX"; + static const char * const k_pch_Keyboard_ScaleY = "ScaleY"; + static const char * const k_pch_Keyboard_OffsetLeftX = "OffsetLeftX"; + static const char * const k_pch_Keyboard_OffsetRightX = "OffsetRightX"; + static const char * const k_pch_Keyboard_OffsetY = "OffsetY"; + static const char * const k_pch_Keyboard_Smoothing = "Smoothing"; + + //----------------------------------------------------------------------------- + // perf keys + static const char * const k_pch_Perf_Section = "perfcheck"; + static const char * const k_pch_Perf_HeuristicActive_Bool = "heuristicActive"; + static const char * const k_pch_Perf_NotifyInHMD_Bool = "warnInHMD"; + static const char * const k_pch_Perf_NotifyOnlyOnce_Bool = "warnOnlyOnce"; + static const char * const k_pch_Perf_AllowTimingStore_Bool = "allowTimingStore"; + static const char * const k_pch_Perf_SaveTimingsOnExit_Bool = "saveTimingsOnExit"; + static const char * const k_pch_Perf_TestData_Float = "perfTestData"; + static const char * const k_pch_Perf_LinuxGPUProfiling_Bool = "linuxGPUProfiling"; + + //----------------------------------------------------------------------------- + // collision bounds keys + static const char * const k_pch_CollisionBounds_Section = "collisionBounds"; + static const char * const k_pch_CollisionBounds_Style_Int32 = "CollisionBoundsStyle"; + static const char * const k_pch_CollisionBounds_GroundPerimeterOn_Bool = "CollisionBoundsGroundPerimeterOn"; + static const char * const k_pch_CollisionBounds_CenterMarkerOn_Bool = "CollisionBoundsCenterMarkerOn"; + static const char * const k_pch_CollisionBounds_PlaySpaceOn_Bool = "CollisionBoundsPlaySpaceOn"; + static const char * const k_pch_CollisionBounds_FadeDistance_Float = "CollisionBoundsFadeDistance"; + static const char * const k_pch_CollisionBounds_ColorGammaR_Int32 = "CollisionBoundsColorGammaR"; + static const char * const k_pch_CollisionBounds_ColorGammaG_Int32 = "CollisionBoundsColorGammaG"; + static const char * const k_pch_CollisionBounds_ColorGammaB_Int32 = "CollisionBoundsColorGammaB"; + static const char * const k_pch_CollisionBounds_ColorGammaA_Int32 = "CollisionBoundsColorGammaA"; + + //----------------------------------------------------------------------------- + // camera keys + static const char * const k_pch_Camera_Section = "camera"; + static const char * const k_pch_Camera_EnableCamera_Bool = "enableCamera"; + static const char * const k_pch_Camera_EnableCameraInDashboard_Bool = "enableCameraInDashboard"; + static const char * const k_pch_Camera_EnableCameraForCollisionBounds_Bool = "enableCameraForCollisionBounds"; + static const char * const k_pch_Camera_EnableCameraForRoomView_Bool = "enableCameraForRoomView"; + static const char * const k_pch_Camera_BoundsColorGammaR_Int32 = "cameraBoundsColorGammaR"; + static const char * const k_pch_Camera_BoundsColorGammaG_Int32 = "cameraBoundsColorGammaG"; + static const char * const k_pch_Camera_BoundsColorGammaB_Int32 = "cameraBoundsColorGammaB"; + static const char * const k_pch_Camera_BoundsColorGammaA_Int32 = "cameraBoundsColorGammaA"; + static const char * const k_pch_Camera_BoundsStrength_Int32 = "cameraBoundsStrength"; + + //----------------------------------------------------------------------------- + // audio keys + static const char * const k_pch_audio_Section = "audio"; + static const char * const k_pch_audio_OnPlaybackDevice_String = "onPlaybackDevice"; + static const char * const k_pch_audio_OnRecordDevice_String = "onRecordDevice"; + static const char * const k_pch_audio_OnPlaybackMirrorDevice_String = "onPlaybackMirrorDevice"; + static const char * const k_pch_audio_OffPlaybackDevice_String = "offPlaybackDevice"; + static const char * const k_pch_audio_OffRecordDevice_String = "offRecordDevice"; + static const char * const k_pch_audio_VIVEHDMIGain = "viveHDMIGain"; + + //----------------------------------------------------------------------------- + // power management keys + static const char * const k_pch_Power_Section = "power"; + static const char * const k_pch_Power_PowerOffOnExit_Bool = "powerOffOnExit"; + static const char * const k_pch_Power_TurnOffScreensTimeout_Float = "turnOffScreensTimeout"; + static const char * const k_pch_Power_TurnOffControllersTimeout_Float = "turnOffControllersTimeout"; + static const char * const k_pch_Power_ReturnToWatchdogTimeout_Float = "returnToWatchdogTimeout"; + static const char * const k_pch_Power_AutoLaunchSteamVROnButtonPress = "autoLaunchSteamVROnButtonPress"; + + //----------------------------------------------------------------------------- + // dashboard keys + static const char * const k_pch_Dashboard_Section = "dashboard"; + static const char * const k_pch_Dashboard_EnableDashboard_Bool = "enableDashboard"; + static const char * const k_pch_Dashboard_ArcadeMode_Bool = "arcadeMode"; + + //----------------------------------------------------------------------------- + // model skin keys + static const char * const k_pch_modelskin_Section = "modelskins"; + + //----------------------------------------------------------------------------- + // driver keys - These could be checked in any driver_ section + static const char * const k_pch_Driver_Enable_Bool = "enable"; + +} // namespace vr + +// ivrchaperone.h +namespace vr +{ + +#pragma pack( push, 8 ) + +enum ChaperoneCalibrationState +{ + // OK! + ChaperoneCalibrationState_OK = 1, // Chaperone is fully calibrated and working correctly + + // Warnings + ChaperoneCalibrationState_Warning = 100, + ChaperoneCalibrationState_Warning_BaseStationMayHaveMoved = 101, // A base station thinks that it might have moved + ChaperoneCalibrationState_Warning_BaseStationRemoved = 102, // There are less base stations than when calibrated + ChaperoneCalibrationState_Warning_SeatedBoundsInvalid = 103, // Seated bounds haven't been calibrated for the current tracking center + + // Errors + ChaperoneCalibrationState_Error = 200, // The UniverseID is invalid + ChaperoneCalibrationState_Error_BaseStationUninitialized = 201, // Tracking center hasn't be calibrated for at least one of the base stations + ChaperoneCalibrationState_Error_BaseStationConflict = 202, // Tracking center is calibrated, but base stations disagree on the tracking space + ChaperoneCalibrationState_Error_PlayAreaInvalid = 203, // Play Area hasn't been calibrated for the current tracking center + ChaperoneCalibrationState_Error_CollisionBoundsInvalid = 204, // Collision Bounds haven't been calibrated for the current tracking center +}; + + +/** HIGH LEVEL TRACKING SPACE ASSUMPTIONS: +* 0,0,0 is the preferred standing area center. +* 0Y is the floor height. +* -Z is the preferred forward facing direction. */ +class IVRChaperone +{ +public: + + /** Get the current state of Chaperone calibration. This state can change at any time during a session due to physical base station changes. **/ + virtual ChaperoneCalibrationState GetCalibrationState() = 0; + + /** Returns the width and depth of the Play Area (formerly named Soft Bounds) in X and Z. + * Tracking space center (0,0,0) is the center of the Play Area. **/ + virtual bool GetPlayAreaSize( float *pSizeX, float *pSizeZ ) = 0; + + /** Returns the 4 corner positions of the Play Area (formerly named Soft Bounds). + * Corners are in counter-clockwise order. + * Standing center (0,0,0) is the center of the Play Area. + * It's a rectangle. + * 2 sides are parallel to the X axis and 2 sides are parallel to the Z axis. + * Height of every corner is 0Y (on the floor). **/ + virtual bool GetPlayAreaRect( HmdQuad_t *rect ) = 0; + + /** Reload Chaperone data from the .vrchap file on disk. */ + virtual void ReloadInfo( void ) = 0; + + /** Optionally give the chaperone system a hit about the color and brightness in the scene **/ + virtual void SetSceneColor( HmdColor_t color ) = 0; + + /** Get the current chaperone bounds draw color and brightness **/ + virtual void GetBoundsColor( HmdColor_t *pOutputColorArray, int nNumOutputColors, float flCollisionBoundsFadeDistance, HmdColor_t *pOutputCameraColor ) = 0; + + /** Determine whether the bounds are showing right now **/ + virtual bool AreBoundsVisible() = 0; + + /** Force the bounds to show, mostly for utilities **/ + virtual void ForceBoundsVisible( bool bForce ) = 0; +}; + +static const char * const IVRChaperone_Version = "IVRChaperone_003"; + +#pragma pack( pop ) + +} + +// ivrchaperonesetup.h +namespace vr +{ + +enum EChaperoneConfigFile +{ + EChaperoneConfigFile_Live = 1, // The live chaperone config, used by most applications and games + EChaperoneConfigFile_Temp = 2, // The temporary chaperone config, used to live-preview collision bounds in room setup +}; + +enum EChaperoneImportFlags +{ + EChaperoneImport_BoundsOnly = 0x0001, +}; + +/** Manages the working copy of the chaperone info. By default this will be the same as the +* live copy. Any changes made with this interface will stay in the working copy until +* CommitWorkingCopy() is called, at which point the working copy and the live copy will be +* the same again. */ +class IVRChaperoneSetup +{ +public: + + /** Saves the current working copy to disk */ + virtual bool CommitWorkingCopy( EChaperoneConfigFile configFile ) = 0; + + /** Reverts the working copy to match the live chaperone calibration. + * To modify existing data this MUST be do WHILE getting a non-error ChaperoneCalibrationStatus. + * Only after this should you do gets and sets on the existing data. */ + virtual void RevertWorkingCopy() = 0; + + /** Returns the width and depth of the Play Area (formerly named Soft Bounds) in X and Z from the working copy. + * Tracking space center (0,0,0) is the center of the Play Area. */ + virtual bool GetWorkingPlayAreaSize( float *pSizeX, float *pSizeZ ) = 0; + + /** Returns the 4 corner positions of the Play Area (formerly named Soft Bounds) from the working copy. + * Corners are in clockwise order. + * Tracking space center (0,0,0) is the center of the Play Area. + * It's a rectangle. + * 2 sides are parallel to the X axis and 2 sides are parallel to the Z axis. + * Height of every corner is 0Y (on the floor). **/ + virtual bool GetWorkingPlayAreaRect( HmdQuad_t *rect ) = 0; + + /** Returns the number of Quads if the buffer points to null. Otherwise it returns Quads + * into the buffer up to the max specified from the working copy. */ + virtual bool GetWorkingCollisionBoundsInfo( VR_OUT_ARRAY_COUNT(punQuadsCount) HmdQuad_t *pQuadsBuffer, uint32_t* punQuadsCount ) = 0; + + /** Returns the number of Quads if the buffer points to null. Otherwise it returns Quads + * into the buffer up to the max specified. */ + virtual bool GetLiveCollisionBoundsInfo( VR_OUT_ARRAY_COUNT(punQuadsCount) HmdQuad_t *pQuadsBuffer, uint32_t* punQuadsCount ) = 0; + + /** Returns the preferred seated position from the working copy. */ + virtual bool GetWorkingSeatedZeroPoseToRawTrackingPose( HmdMatrix34_t *pmatSeatedZeroPoseToRawTrackingPose ) = 0; + + /** Returns the standing origin from the working copy. */ + virtual bool GetWorkingStandingZeroPoseToRawTrackingPose( HmdMatrix34_t *pmatStandingZeroPoseToRawTrackingPose ) = 0; + + /** Sets the Play Area in the working copy. */ + virtual void SetWorkingPlayAreaSize( float sizeX, float sizeZ ) = 0; + + /** Sets the Collision Bounds in the working copy. */ + virtual void SetWorkingCollisionBoundsInfo( VR_ARRAY_COUNT(unQuadsCount) HmdQuad_t *pQuadsBuffer, uint32_t unQuadsCount ) = 0; + + /** Sets the preferred seated position in the working copy. */ + virtual void SetWorkingSeatedZeroPoseToRawTrackingPose( const HmdMatrix34_t *pMatSeatedZeroPoseToRawTrackingPose ) = 0; + + /** Sets the preferred standing position in the working copy. */ + virtual void SetWorkingStandingZeroPoseToRawTrackingPose( const HmdMatrix34_t *pMatStandingZeroPoseToRawTrackingPose ) = 0; + + /** Tear everything down and reload it from the file on disk */ + virtual void ReloadFromDisk( EChaperoneConfigFile configFile ) = 0; + + /** Returns the preferred seated position. */ + virtual bool GetLiveSeatedZeroPoseToRawTrackingPose( HmdMatrix34_t *pmatSeatedZeroPoseToRawTrackingPose ) = 0; + + virtual void SetWorkingCollisionBoundsTagsInfo( VR_ARRAY_COUNT(unTagCount) uint8_t *pTagsBuffer, uint32_t unTagCount ) = 0; + virtual bool GetLiveCollisionBoundsTagsInfo( VR_OUT_ARRAY_COUNT(punTagCount) uint8_t *pTagsBuffer, uint32_t *punTagCount ) = 0; + + virtual bool SetWorkingPhysicalBoundsInfo( VR_ARRAY_COUNT(unQuadsCount) HmdQuad_t *pQuadsBuffer, uint32_t unQuadsCount ) = 0; + virtual bool GetLivePhysicalBoundsInfo( VR_OUT_ARRAY_COUNT(punQuadsCount) HmdQuad_t *pQuadsBuffer, uint32_t* punQuadsCount ) = 0; + + virtual bool ExportLiveToBuffer( VR_OUT_STRING() char *pBuffer, uint32_t *pnBufferLength ) = 0; + virtual bool ImportFromBufferToWorking( const char *pBuffer, uint32_t nImportFlags ) = 0; +}; + +static const char * const IVRChaperoneSetup_Version = "IVRChaperoneSetup_005"; + + +} + +// ivrcompositor.h +namespace vr +{ + +#pragma pack( push, 8 ) + +/** Errors that can occur with the VR compositor */ +enum EVRCompositorError +{ + VRCompositorError_None = 0, + VRCompositorError_RequestFailed = 1, + VRCompositorError_IncompatibleVersion = 100, + VRCompositorError_DoNotHaveFocus = 101, + VRCompositorError_InvalidTexture = 102, + VRCompositorError_IsNotSceneApplication = 103, + VRCompositorError_TextureIsOnWrongDevice = 104, + VRCompositorError_TextureUsesUnsupportedFormat = 105, + VRCompositorError_SharedTexturesNotSupported = 106, + VRCompositorError_IndexOutOfRange = 107, + VRCompositorError_AlreadySubmitted = 108, +}; + +const uint32_t VRCompositor_ReprojectionReason_Cpu = 0x01; +const uint32_t VRCompositor_ReprojectionReason_Gpu = 0x02; +const uint32_t VRCompositor_ReprojectionAsync = 0x04; // This flag indicates the async reprojection mode is active, + // but does not indicate if reprojection actually happened or not. + // Use the ReprojectionReason flags above to check if reprojection + // was actually applied (i.e. scene texture was reused). + // NumFramePresents > 1 also indicates the scene texture was reused, + // and also the number of times that it was presented in total. + +/** Provides a single frame's timing information to the app */ +struct Compositor_FrameTiming +{ + uint32_t m_nSize; // Set to sizeof( Compositor_FrameTiming ) + uint32_t m_nFrameIndex; + uint32_t m_nNumFramePresents; // number of times this frame was presented + uint32_t m_nNumMisPresented; // number of times this frame was presented on a vsync other than it was originally predicted to + uint32_t m_nNumDroppedFrames; // number of additional times previous frame was scanned out + uint32_t m_nReprojectionFlags; + + /** Absolute time reference for comparing frames. This aligns with the vsync that running start is relative to. */ + double m_flSystemTimeInSeconds; + + /** These times may include work from other processes due to OS scheduling. + * The fewer packets of work these are broken up into, the less likely this will happen. + * GPU work can be broken up by calling Flush. This can sometimes be useful to get the GPU started + * processing that work earlier in the frame. */ + float m_flPreSubmitGpuMs; // time spent rendering the scene (gpu work submitted between WaitGetPoses and second Submit) + float m_flPostSubmitGpuMs; // additional time spent rendering by application (e.g. companion window) + float m_flTotalRenderGpuMs; // time between work submitted immediately after present (ideally vsync) until the end of compositor submitted work + float m_flCompositorRenderGpuMs; // time spend performing distortion correction, rendering chaperone, overlays, etc. + float m_flCompositorRenderCpuMs; // time spent on cpu submitting the above work for this frame + float m_flCompositorIdleCpuMs; // time spent waiting for running start (application could have used this much more time) + + /** Miscellaneous measured intervals. */ + float m_flClientFrameIntervalMs; // time between calls to WaitGetPoses + float m_flPresentCallCpuMs; // time blocked on call to present (usually 0.0, but can go long) + float m_flWaitForPresentCpuMs; // time spent spin-waiting for frame index to change (not near-zero indicates wait object failure) + float m_flSubmitFrameMs; // time spent in IVRCompositor::Submit (not near-zero indicates driver issue) + + /** The following are all relative to this frame's SystemTimeInSeconds */ + float m_flWaitGetPosesCalledMs; + float m_flNewPosesReadyMs; + float m_flNewFrameReadyMs; // second call to IVRCompositor::Submit + float m_flCompositorUpdateStartMs; + float m_flCompositorUpdateEndMs; + float m_flCompositorRenderStartMs; + + vr::TrackedDevicePose_t m_HmdPose; // pose used by app to render this frame +}; + +/** Cumulative stats for current application. These are not cleared until a new app connects, +* but they do stop accumulating once the associated app disconnects. */ +struct Compositor_CumulativeStats +{ + uint32_t m_nPid; // Process id associated with these stats (may no longer be running). + uint32_t m_nNumFramePresents; // total number of times we called present (includes reprojected frames) + uint32_t m_nNumDroppedFrames; // total number of times an old frame was re-scanned out (without reprojection) + uint32_t m_nNumReprojectedFrames; // total number of times a frame was scanned out a second time (with reprojection) + + /** Values recorded at startup before application has fully faded in the first time. */ + uint32_t m_nNumFramePresentsOnStartup; + uint32_t m_nNumDroppedFramesOnStartup; + uint32_t m_nNumReprojectedFramesOnStartup; + + /** Applications may explicitly fade to the compositor. This is usually to handle level transitions, and loading often causes + * system wide hitches. The following stats are collected during this period. Does not include values recorded during startup. */ + uint32_t m_nNumLoading; + uint32_t m_nNumFramePresentsLoading; + uint32_t m_nNumDroppedFramesLoading; + uint32_t m_nNumReprojectedFramesLoading; + + /** 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 + * fading back to the compositor. The following stats are a result of this, and are a subset of those recorded above. + * Does not include values recorded during start up or loading. */ + uint32_t m_nNumTimedOut; + uint32_t m_nNumFramePresentsTimedOut; + uint32_t m_nNumDroppedFramesTimedOut; + uint32_t m_nNumReprojectedFramesTimedOut; +}; + +#pragma pack( pop ) + +/** Allows the application to interact with the compositor */ +class IVRCompositor +{ +public: + /** Sets tracking space returned by WaitGetPoses */ + virtual void SetTrackingSpace( ETrackingUniverseOrigin eOrigin ) = 0; + + /** Gets current tracking space returned by WaitGetPoses */ + virtual ETrackingUniverseOrigin GetTrackingSpace() = 0; + + /** Scene applications should call this function to get poses to render with (and optionally poses predicted an additional frame out to use for gameplay). + * 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 + * start rendering. + * + * Return codes: + * - IsNotSceneApplication (make sure to call VR_Init with VRApplicaiton_Scene) + * - DoNotHaveFocus (some other app has taken focus - this will throttle the call to 10hz to reduce the impact on that app) + */ + virtual EVRCompositorError WaitGetPoses( VR_ARRAY_COUNT(unRenderPoseArrayCount) TrackedDevicePose_t* pRenderPoseArray, uint32_t unRenderPoseArrayCount, + VR_ARRAY_COUNT(unGamePoseArrayCount) TrackedDevicePose_t* pGamePoseArray, uint32_t unGamePoseArrayCount ) = 0; + + /** Get the last set of poses returned by WaitGetPoses. */ + virtual EVRCompositorError GetLastPoses( VR_ARRAY_COUNT( unRenderPoseArrayCount ) TrackedDevicePose_t* pRenderPoseArray, uint32_t unRenderPoseArrayCount, + VR_ARRAY_COUNT( unGamePoseArrayCount ) TrackedDevicePose_t* pGamePoseArray, uint32_t unGamePoseArrayCount ) = 0; + + /** Interface for accessing last set of poses returned by WaitGetPoses one at a time. + * Returns VRCompositorError_IndexOutOfRange if unDeviceIndex not less than k_unMaxTrackedDeviceCount otherwise VRCompositorError_None. + * It is okay to pass NULL for either pose if you only want one of the values. */ + virtual EVRCompositorError GetLastPoseForTrackedDeviceIndex( TrackedDeviceIndex_t unDeviceIndex, TrackedDevicePose_t *pOutputPose, TrackedDevicePose_t *pOutputGamePose ) = 0; + + /** 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 + * 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. + * + * OpenGL dirty state: + * glBindTexture + * + * Return codes: + * - IsNotSceneApplication (make sure to call VR_Init with VRApplicaiton_Scene) + * - DoNotHaveFocus (some other app has taken focus) + * - TextureIsOnWrongDevice (application did not use proper AdapterIndex - see IVRSystem.GetDXGIOutputInfo) + * - SharedTexturesNotSupported (application needs to call CreateDXGIFactory1 or later before creating DX device) + * - TextureUsesUnsupportedFormat (scene textures must be compatible with DXGI sharing rules - e.g. uncompressed, no mips, etc.) + * - InvalidTexture (usually means bad arguments passed in) + * - AlreadySubmitted (app has submitted two left textures or two right textures in a single frame - i.e. before calling WaitGetPoses again) + */ + virtual EVRCompositorError Submit( EVREye eEye, const Texture_t *pTexture, const VRTextureBounds_t* pBounds = 0, EVRSubmitFlags nSubmitFlags = Submit_Default ) = 0; + + /** Clears the frame that was sent with the last call to Submit. This will cause the + * compositor to show the grid until Submit is called again. */ + virtual void ClearLastSubmittedFrame() = 0; + + /** Call immediately after presenting your app's window (i.e. companion window) to unblock the compositor. + * This is an optional call, which only needs to be used if you can't instead call WaitGetPoses immediately after Present. + * 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 + * introduce a deadlock of some sort. This function tells the compositor that you have finished all rendering after having Submitted buffers for both + * eyes, and it is free to start its rendering work. This should only be called from the same thread you are rendering on. */ + virtual void PostPresentHandoff() = 0; + + /** Returns true if timing data is filled it. Sets oldest timing info if nFramesAgo is larger than the stored history. + * Be sure to set timing.size = sizeof(Compositor_FrameTiming) on struct passed in before calling this function. */ + virtual bool GetFrameTiming( Compositor_FrameTiming *pTiming, uint32_t unFramesAgo = 0 ) = 0; + + /** 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. + * 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. */ + virtual uint32_t GetFrameTimings( Compositor_FrameTiming *pTiming, uint32_t nFrames ) = 0; + + /** Returns the time in seconds left in the current (as identified by FrameTiming's frameIndex) frame. + * Due to "running start", this value may roll over to the next frame before ever reaching 0.0. */ + virtual float GetFrameTimeRemaining() = 0; + + /** Fills out stats accumulated for the last connected application. Pass in sizeof( Compositor_CumulativeStats ) as second parameter. */ + virtual void GetCumulativeStats( Compositor_CumulativeStats *pStats, uint32_t nStatsSizeInBytes ) = 0; + + /** Fades the view on the HMD to the specified color. The fade will take fSeconds, and the color values are between + * 0.0 and 1.0. This color is faded on top of the scene based on the alpha parameter. Removing the fade color instantly + * would be FadeToColor( 0.0, 0.0, 0.0, 0.0, 0.0 ). Values are in un-premultiplied alpha space. */ + virtual void FadeToColor( float fSeconds, float fRed, float fGreen, float fBlue, float fAlpha, bool bBackground = false ) = 0; + + /** Get current fade color value. */ + virtual HmdColor_t GetCurrentFadeColor( bool bBackground = false ) = 0; + + /** Fading the Grid in or out in fSeconds */ + virtual void FadeGrid( float fSeconds, bool bFadeIn ) = 0; + + /** Get current alpha value of grid. */ + virtual float GetCurrentGridAlpha() = 0; + + /** Override the skybox used in the compositor (e.g. for during level loads when the app can't feed scene images fast enough) + * Order is Front, Back, Left, Right, Top, Bottom. If only a single texture is passed, it is assumed in lat-long format. + * If two are passed, it is assumed a lat-long stereo pair. */ + virtual EVRCompositorError SetSkyboxOverride( VR_ARRAY_COUNT( unTextureCount ) const Texture_t *pTextures, uint32_t unTextureCount ) = 0; + + /** Resets compositor skybox back to defaults. */ + virtual void ClearSkyboxOverride() = 0; + + /** Brings the compositor window to the front. This is useful for covering any other window that may be on the HMD + * and is obscuring the compositor window. */ + virtual void CompositorBringToFront() = 0; + + /** Pushes the compositor window to the back. This is useful for allowing other applications to draw directly to the HMD. */ + virtual void CompositorGoToBack() = 0; + + /** Tells the compositor process to clean up and exit. You do not need to call this function at shutdown. Under normal + * circumstances the compositor will manage its own life cycle based on what applications are running. */ + virtual void CompositorQuit() = 0; + + /** Return whether the compositor is fullscreen */ + virtual bool IsFullscreen() = 0; + + /** Returns the process ID of the process that is currently rendering the scene */ + virtual uint32_t GetCurrentSceneFocusProcess() = 0; + + /** Returns the process ID of the process that rendered the last frame (or 0 if the compositor itself rendered the frame.) + * Returns 0 when fading out from an app and the app's process Id when fading into an app. */ + virtual uint32_t GetLastFrameRenderer() = 0; + + /** Returns true if the current process has the scene focus */ + virtual bool CanRenderScene() = 0; + + /** Creates a window on the primary monitor to display what is being shown in the headset. */ + virtual void ShowMirrorWindow() = 0; + + /** Closes the mirror window. */ + virtual void HideMirrorWindow() = 0; + + /** Returns true if the mirror window is shown. */ + virtual bool IsMirrorWindowVisible() = 0; + + /** Writes all images that the compositor knows about (including overlays) to a 'screenshots' folder in the SteamVR runtime root. */ + virtual void CompositorDumpImages() = 0; + + /** Let an app know it should be rendering with low resources. */ + virtual bool ShouldAppRenderWithLowResources() = 0; + + /** Override interleaved reprojection logic to force on. */ + virtual void ForceInterleavedReprojectionOn( bool bOverride ) = 0; + + /** Force reconnecting to the compositor process. */ + virtual void ForceReconnectProcess() = 0; + + /** Temporarily suspends rendering (useful for finer control over scene transitions). */ + virtual void SuspendRendering( bool bSuspend ) = 0; + + /** Opens a shared D3D11 texture with the undistorted composited image for each eye. Use ReleaseMirrorTextureD3D11 when finished + * instead of calling Release on the resource itself. */ + virtual vr::EVRCompositorError GetMirrorTextureD3D11( vr::EVREye eEye, void *pD3D11DeviceOrResource, void **ppD3D11ShaderResourceView ) = 0; + virtual void ReleaseMirrorTextureD3D11( void *pD3D11ShaderResourceView ) = 0; + + /** Access to mirror textures from OpenGL. */ + virtual vr::EVRCompositorError GetMirrorTextureGL( vr::EVREye eEye, vr::glUInt_t *pglTextureId, vr::glSharedTextureHandle_t *pglSharedTextureHandle ) = 0; + virtual bool ReleaseSharedGLTexture( vr::glUInt_t glTextureId, vr::glSharedTextureHandle_t glSharedTextureHandle ) = 0; + virtual void LockGLSharedTextureForAccess( vr::glSharedTextureHandle_t glSharedTextureHandle ) = 0; + virtual void UnlockGLSharedTextureForAccess( vr::glSharedTextureHandle_t glSharedTextureHandle ) = 0; + + /** [Vulkan Only] + * return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing + * null. The string will be a space separated list of-required instance extensions to enable in VkCreateInstance */ + virtual uint32_t GetVulkanInstanceExtensionsRequired( VR_OUT_STRING() char *pchValue, uint32_t unBufferSize ) = 0; + + /** [Vulkan only] + * return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing + * null. The string will be a space separated list of required device extensions to enable in VkCreateDevice */ + virtual uint32_t GetVulkanDeviceExtensionsRequired( VkPhysicalDevice_T *pPhysicalDevice, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize ) = 0; + +}; + +static const char * const IVRCompositor_Version = "IVRCompositor_020"; + +} // namespace vr + + + +// ivrnotifications.h +namespace vr +{ + +#pragma pack( push, 8 ) + +// Used for passing graphic data +struct NotificationBitmap_t +{ + NotificationBitmap_t() + : m_pImageData( nullptr ) + , m_nWidth( 0 ) + , m_nHeight( 0 ) + , m_nBytesPerPixel( 0 ) + { + }; + + void *m_pImageData; + int32_t m_nWidth; + int32_t m_nHeight; + int32_t m_nBytesPerPixel; +}; + + +/** Be aware that the notification type is used as 'priority' to pick the next notification */ +enum EVRNotificationType +{ + /** Transient notifications are automatically hidden after a period of time set by the user. + * They are used for things like information and chat messages that do not require user interaction. */ + EVRNotificationType_Transient = 0, + + /** Persistent notifications are shown to the user until they are hidden by calling RemoveNotification(). + * They are used for things like phone calls and alarms that require user interaction. */ + EVRNotificationType_Persistent = 1, + + /** System notifications are shown no matter what. It is expected, that the ulUserValue is used as ID. + * If there is already a system notification in the queue with that ID it is not accepted into the queue + * to prevent spamming with system notification */ + EVRNotificationType_Transient_SystemWithUserValue = 2, +}; + +enum EVRNotificationStyle +{ + /** Creates a notification with minimal external styling. */ + EVRNotificationStyle_None = 0, + + /** Used for notifications about overlay-level status. In Steam this is used for events like downloads completing. */ + EVRNotificationStyle_Application = 100, + + /** Used for notifications about contacts that are unknown or not available. In Steam this is used for friend invitations and offline friends. */ + EVRNotificationStyle_Contact_Disabled = 200, + + /** 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. */ + EVRNotificationStyle_Contact_Enabled = 201, + + /** 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. */ + EVRNotificationStyle_Contact_Active = 202, +}; + +static const uint32_t k_unNotificationTextMaxSize = 256; + +typedef uint32_t VRNotificationId; + + + +#pragma pack( pop ) + +/** Allows notification sources to interact with the VR system + This current interface is not yet implemented. Do not use yet. */ +class IVRNotifications +{ +public: + /** Create a notification and enqueue it to be shown to the user. + * An overlay handle is required to create a notification, as otherwise it would be impossible for a user to act on it. + * To create a two-line notification, use a line break ('\n') to split the text into two lines. + * The pImage argument may be NULL, in which case the specified overlay's icon will be used instead. */ + virtual EVRNotificationError CreateNotification( VROverlayHandle_t ulOverlayHandle, uint64_t ulUserValue, EVRNotificationType type, const char *pchText, EVRNotificationStyle style, const NotificationBitmap_t *pImage, /* out */ VRNotificationId *pNotificationId ) = 0; + + /** Destroy a notification, hiding it first if it currently shown to the user. */ + virtual EVRNotificationError RemoveNotification( VRNotificationId notificationId ) = 0; + +}; + +static const char * const IVRNotifications_Version = "IVRNotifications_002"; + +} // namespace vr + + + +// ivroverlay.h +namespace vr +{ + + /** The maximum length of an overlay key in bytes, counting the terminating null character. */ + static const uint32_t k_unVROverlayMaxKeyLength = 128; + + /** The maximum length of an overlay name in bytes, counting the terminating null character. */ + static const uint32_t k_unVROverlayMaxNameLength = 128; + + /** The maximum number of overlays that can exist in the system at one time. */ + static const uint32_t k_unMaxOverlayCount = 64; + + /** The maximum number of overlay intersection mask primitives per overlay */ + static const uint32_t k_unMaxOverlayIntersectionMaskPrimitivesCount = 32; + + /** Types of input supported by VR Overlays */ + enum VROverlayInputMethod + { + VROverlayInputMethod_None = 0, // No input events will be generated automatically for this overlay + VROverlayInputMethod_Mouse = 1, // Tracked controllers will get mouse events automatically + }; + + /** Allows the caller to figure out which overlay transform getter to call. */ + enum VROverlayTransformType + { + VROverlayTransform_Absolute = 0, + VROverlayTransform_TrackedDeviceRelative = 1, + VROverlayTransform_SystemOverlay = 2, + VROverlayTransform_TrackedComponent = 3, + }; + + /** Overlay control settings */ + enum VROverlayFlags + { + VROverlayFlags_None = 0, + + // The following only take effect when rendered using the high quality render path (see SetHighQualityOverlay). + VROverlayFlags_Curved = 1, + VROverlayFlags_RGSS4X = 2, + + // Set this flag on a dashboard overlay to prevent a tab from showing up for that overlay + VROverlayFlags_NoDashboardTab = 3, + + // Set this flag on a dashboard that is able to deal with gamepad focus events + VROverlayFlags_AcceptsGamepadEvents = 4, + + // Indicates that the overlay should dim/brighten to show gamepad focus + VROverlayFlags_ShowGamepadFocus = 5, + + // When in VROverlayInputMethod_Mouse you can optionally enable sending VRScroll_t + VROverlayFlags_SendVRScrollEvents = 6, + VROverlayFlags_SendVRTouchpadEvents = 7, + + // If set this will render a vertical scroll wheel on the primary controller, + // only needed if not using VROverlayFlags_SendVRScrollEvents but you still want to represent a scroll wheel + VROverlayFlags_ShowTouchPadScrollWheel = 8, + + // If this is set ownership and render access to the overlay are transferred + // to the new scene process on a call to IVRApplications::LaunchInternalProcess + VROverlayFlags_TransferOwnershipToInternalProcess = 9, + + // If set, renders 50% of the texture in each eye, side by side + VROverlayFlags_SideBySide_Parallel = 10, // Texture is left/right + VROverlayFlags_SideBySide_Crossed = 11, // Texture is crossed and right/left + + VROverlayFlags_Panorama = 12, // Texture is a panorama + VROverlayFlags_StereoPanorama = 13, // Texture is a stereo panorama + + // If this is set on an overlay owned by the scene application that overlay + // will be sorted with the "Other" overlays on top of all other scene overlays + VROverlayFlags_SortWithNonSceneOverlays = 14, + + // If set, the overlay will be shown in the dashboard, otherwise it will be hidden. + VROverlayFlags_VisibleInDashboard = 15, + }; + + enum VRMessageOverlayResponse + { + VRMessageOverlayResponse_ButtonPress_0 = 0, + VRMessageOverlayResponse_ButtonPress_1 = 1, + VRMessageOverlayResponse_ButtonPress_2 = 2, + VRMessageOverlayResponse_ButtonPress_3 = 3, + VRMessageOverlayResponse_CouldntFindSystemOverlay = 4, + VRMessageOverlayResponse_CouldntFindOrCreateClientOverlay= 5, + VRMessageOverlayResponse_ApplicationQuit = 6 + }; + + struct VROverlayIntersectionParams_t + { + HmdVector3_t vSource; + HmdVector3_t vDirection; + ETrackingUniverseOrigin eOrigin; + }; + + struct VROverlayIntersectionResults_t + { + HmdVector3_t vPoint; + HmdVector3_t vNormal; + HmdVector2_t vUVs; + float fDistance; + }; + + // Input modes for the Big Picture gamepad text entry + enum EGamepadTextInputMode + { + k_EGamepadTextInputModeNormal = 0, + k_EGamepadTextInputModePassword = 1, + k_EGamepadTextInputModeSubmit = 2, + }; + + // Controls number of allowed lines for the Big Picture gamepad text entry + enum EGamepadTextInputLineMode + { + k_EGamepadTextInputLineModeSingleLine = 0, + k_EGamepadTextInputLineModeMultipleLines = 1 + }; + + /** Directions for changing focus between overlays with the gamepad */ + enum EOverlayDirection + { + OverlayDirection_Up = 0, + OverlayDirection_Down = 1, + OverlayDirection_Left = 2, + OverlayDirection_Right = 3, + + OverlayDirection_Count = 4, + }; + + enum EVROverlayIntersectionMaskPrimitiveType + { + OverlayIntersectionPrimitiveType_Rectangle, + OverlayIntersectionPrimitiveType_Circle, + }; + + struct IntersectionMaskRectangle_t + { + float m_flTopLeftX; + float m_flTopLeftY; + float m_flWidth; + float m_flHeight; + }; + + struct IntersectionMaskCircle_t + { + float m_flCenterX; + float m_flCenterY; + float m_flRadius; + }; + + /** NOTE!!! If you change this you MUST manually update openvr_interop.cs.py and openvr_api_flat.h.py */ + typedef union + { + IntersectionMaskRectangle_t m_Rectangle; + IntersectionMaskCircle_t m_Circle; + } VROverlayIntersectionMaskPrimitive_Data_t; + + struct VROverlayIntersectionMaskPrimitive_t + { + EVROverlayIntersectionMaskPrimitiveType m_nPrimitiveType; + VROverlayIntersectionMaskPrimitive_Data_t m_Primitive; + }; + + class IVROverlay + { + public: + + // --------------------------------------------- + // Overlay management methods + // --------------------------------------------- + + /** Finds an existing overlay with the specified key. */ + virtual EVROverlayError FindOverlay( const char *pchOverlayKey, VROverlayHandle_t * pOverlayHandle ) = 0; + + /** Creates a new named overlay. All overlays start hidden and with default settings. */ + virtual EVROverlayError CreateOverlay( const char *pchOverlayKey, const char *pchOverlayName, VROverlayHandle_t * pOverlayHandle ) = 0; + + /** Destroys the specified overlay. When an application calls VR_Shutdown all overlays created by that app are + * automatically destroyed. */ + virtual EVROverlayError DestroyOverlay( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** Specify which overlay to use the high quality render path. This overlay will be composited in during the distortion pass which + * results in it drawing on top of everything else, but also at a higher quality as it samples the source texture directly rather than + * rasterizing into each eye's render texture first. Because if this, only one of these is supported at any given time. It is most useful + * for overlays that are expected to take up most of the user's view (e.g. streaming video). + * This mode does not support mouse input to your overlay. */ + virtual EVROverlayError SetHighQualityOverlay( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** Returns the overlay handle of the current overlay being rendered using the single high quality overlay render path. + * Otherwise it will return k_ulOverlayHandleInvalid. */ + virtual vr::VROverlayHandle_t GetHighQualityOverlay() = 0; + + /** Fills the provided buffer with the string key of the overlay. Returns the size of buffer required to store the key, including + * the terminating null character. k_unVROverlayMaxKeyLength will be enough bytes to fit the string. */ + virtual uint32_t GetOverlayKey( VROverlayHandle_t ulOverlayHandle, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize, EVROverlayError *pError = 0L ) = 0; + + /** Fills the provided buffer with the friendly name of the overlay. Returns the size of buffer required to store the key, including + * the terminating null character. k_unVROverlayMaxNameLength will be enough bytes to fit the string. */ + virtual uint32_t GetOverlayName( VROverlayHandle_t ulOverlayHandle, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize, EVROverlayError *pError = 0L ) = 0; + + /** set the name to use for this overlay */ + virtual EVROverlayError SetOverlayName( VROverlayHandle_t ulOverlayHandle, const char *pchName ) = 0; + + /** 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 + * will be set and VROverlayError_ArrayTooSmall is returned. */ + virtual EVROverlayError GetOverlayImageData( VROverlayHandle_t ulOverlayHandle, void *pvBuffer, uint32_t unBufferSize, uint32_t *punWidth, uint32_t *punHeight ) = 0; + + /** returns a string that corresponds with the specified overlay error. The string will be the name + * of the error enum value for all valid error codes */ + virtual const char *GetOverlayErrorNameFromEnum( EVROverlayError error ) = 0; + + // --------------------------------------------- + // Overlay rendering methods + // --------------------------------------------- + + /** Sets the pid that is allowed to render to this overlay (the creator pid is always allow to render), + * by default this is the pid of the process that made the overlay */ + virtual EVROverlayError SetOverlayRenderingPid( VROverlayHandle_t ulOverlayHandle, uint32_t unPID ) = 0; + + /** Gets the pid that is allowed to render to this overlay */ + virtual uint32_t GetOverlayRenderingPid( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** Specify flag setting for a given overlay */ + virtual EVROverlayError SetOverlayFlag( VROverlayHandle_t ulOverlayHandle, VROverlayFlags eOverlayFlag, bool bEnabled ) = 0; + + /** Sets flag setting for a given overlay */ + virtual EVROverlayError GetOverlayFlag( VROverlayHandle_t ulOverlayHandle, VROverlayFlags eOverlayFlag, bool *pbEnabled ) = 0; + + /** Sets the color tint of the overlay quad. Use 0.0 to 1.0 per channel. */ + virtual EVROverlayError SetOverlayColor( VROverlayHandle_t ulOverlayHandle, float fRed, float fGreen, float fBlue ) = 0; + + /** Gets the color tint of the overlay quad. */ + virtual EVROverlayError GetOverlayColor( VROverlayHandle_t ulOverlayHandle, float *pfRed, float *pfGreen, float *pfBlue ) = 0; + + /** Sets the alpha of the overlay quad. Use 1.0 for 100 percent opacity to 0.0 for 0 percent opacity. */ + virtual EVROverlayError SetOverlayAlpha( VROverlayHandle_t ulOverlayHandle, float fAlpha ) = 0; + + /** Gets the alpha of the overlay quad. By default overlays are rendering at 100 percent alpha (1.0). */ + virtual EVROverlayError GetOverlayAlpha( VROverlayHandle_t ulOverlayHandle, float *pfAlpha ) = 0; + + /** Sets the aspect ratio of the texels in the overlay. 1.0 means the texels are square. 2.0 means the texels + * are twice as wide as they are tall. Defaults to 1.0. */ + virtual EVROverlayError SetOverlayTexelAspect( VROverlayHandle_t ulOverlayHandle, float fTexelAspect ) = 0; + + /** Gets the aspect ratio of the texels in the overlay. Defaults to 1.0 */ + virtual EVROverlayError GetOverlayTexelAspect( VROverlayHandle_t ulOverlayHandle, float *pfTexelAspect ) = 0; + + /** Sets the rendering sort order for the overlay. Overlays are rendered this order: + * Overlays owned by the scene application + * Overlays owned by some other application + * + * Within a category overlays are rendered lowest sort order to highest sort order. Overlays with the same + * sort order are rendered back to front base on distance from the HMD. + * + * Sort order defaults to 0. */ + virtual EVROverlayError SetOverlaySortOrder( VROverlayHandle_t ulOverlayHandle, uint32_t unSortOrder ) = 0; + + /** Gets the sort order of the overlay. See SetOverlaySortOrder for how this works. */ + virtual EVROverlayError GetOverlaySortOrder( VROverlayHandle_t ulOverlayHandle, uint32_t *punSortOrder ) = 0; + + /** Sets the width of the overlay quad in meters. By default overlays are rendered on a quad that is 1 meter across */ + virtual EVROverlayError SetOverlayWidthInMeters( VROverlayHandle_t ulOverlayHandle, float fWidthInMeters ) = 0; + + /** Returns the width of the overlay quad in meters. By default overlays are rendered on a quad that is 1 meter across */ + virtual EVROverlayError GetOverlayWidthInMeters( VROverlayHandle_t ulOverlayHandle, float *pfWidthInMeters ) = 0; + + /** For high-quality curved overlays only, sets the distance range in meters from the overlay used to automatically curve + * the surface around the viewer. Min is distance is when the surface will be most curved. Max is when least curved. */ + virtual EVROverlayError SetOverlayAutoCurveDistanceRangeInMeters( VROverlayHandle_t ulOverlayHandle, float fMinDistanceInMeters, float fMaxDistanceInMeters ) = 0; + + /** For high-quality curved overlays only, gets the distance range in meters from the overlay used to automatically curve + * the surface around the viewer. Min is distance is when the surface will be most curved. Max is when least curved. */ + virtual EVROverlayError GetOverlayAutoCurveDistanceRangeInMeters( VROverlayHandle_t ulOverlayHandle, float *pfMinDistanceInMeters, float *pfMaxDistanceInMeters ) = 0; + + /** Sets the colorspace the overlay texture's data is in. Defaults to 'auto'. + * If the texture needs to be resolved, you should call SetOverlayTexture with the appropriate colorspace instead. */ + virtual EVROverlayError SetOverlayTextureColorSpace( VROverlayHandle_t ulOverlayHandle, EColorSpace eTextureColorSpace ) = 0; + + /** Gets the overlay's current colorspace setting. */ + virtual EVROverlayError GetOverlayTextureColorSpace( VROverlayHandle_t ulOverlayHandle, EColorSpace *peTextureColorSpace ) = 0; + + /** 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. */ + virtual EVROverlayError SetOverlayTextureBounds( VROverlayHandle_t ulOverlayHandle, const VRTextureBounds_t *pOverlayTextureBounds ) = 0; + + /** 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. */ + virtual EVROverlayError GetOverlayTextureBounds( VROverlayHandle_t ulOverlayHandle, VRTextureBounds_t *pOverlayTextureBounds ) = 0; + + /** Gets render model to draw behind this overlay */ + virtual uint32_t GetOverlayRenderModel( vr::VROverlayHandle_t ulOverlayHandle, char *pchValue, uint32_t unBufferSize, HmdColor_t *pColor, vr::EVROverlayError *pError ) = 0; + + /** Sets render model to draw behind this overlay and the vertex color to use, pass null for pColor to match the overlays vertex color. + The model is scaled by the same amount as the overlay, with a default of 1m. */ + virtual vr::EVROverlayError SetOverlayRenderModel( vr::VROverlayHandle_t ulOverlayHandle, const char *pchRenderModel, const HmdColor_t *pColor ) = 0; + + /** Returns the transform type of this overlay. */ + virtual EVROverlayError GetOverlayTransformType( VROverlayHandle_t ulOverlayHandle, VROverlayTransformType *peTransformType ) = 0; + + /** Sets the transform to absolute tracking origin. */ + virtual EVROverlayError SetOverlayTransformAbsolute( VROverlayHandle_t ulOverlayHandle, ETrackingUniverseOrigin eTrackingOrigin, const HmdMatrix34_t *pmatTrackingOriginToOverlayTransform ) = 0; + + /** Gets the transform if it is absolute. Returns an error if the transform is some other type. */ + virtual EVROverlayError GetOverlayTransformAbsolute( VROverlayHandle_t ulOverlayHandle, ETrackingUniverseOrigin *peTrackingOrigin, HmdMatrix34_t *pmatTrackingOriginToOverlayTransform ) = 0; + + /** Sets the transform to relative to the transform of the specified tracked device. */ + virtual EVROverlayError SetOverlayTransformTrackedDeviceRelative( VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t unTrackedDevice, const HmdMatrix34_t *pmatTrackedDeviceToOverlayTransform ) = 0; + + /** Gets the transform if it is relative to a tracked device. Returns an error if the transform is some other type. */ + virtual EVROverlayError GetOverlayTransformTrackedDeviceRelative( VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t *punTrackedDevice, HmdMatrix34_t *pmatTrackedDeviceToOverlayTransform ) = 0; + + /** Sets the transform to draw the overlay on a rendermodel component mesh instead of a quad. This will only draw when the system is + * drawing the device. Overlays with this transform type cannot receive mouse events. */ + virtual EVROverlayError SetOverlayTransformTrackedDeviceComponent( VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t unDeviceIndex, const char *pchComponentName ) = 0; + + /** Gets the transform information when the overlay is rendering on a component. */ + virtual EVROverlayError GetOverlayTransformTrackedDeviceComponent( VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t *punDeviceIndex, char *pchComponentName, uint32_t unComponentNameSize ) = 0; + + /** Gets the transform if it is relative to another overlay. Returns an error if the transform is some other type. */ + virtual vr::EVROverlayError GetOverlayTransformOverlayRelative( VROverlayHandle_t ulOverlayHandle, VROverlayHandle_t *ulOverlayHandleParent, HmdMatrix34_t *pmatParentOverlayToOverlayTransform ) = 0; + + /** Sets the transform to relative to the transform of the specified overlay. This overlays visibility will also track the parents visibility */ + virtual vr::EVROverlayError SetOverlayTransformOverlayRelative( VROverlayHandle_t ulOverlayHandle, VROverlayHandle_t ulOverlayHandleParent, const HmdMatrix34_t *pmatParentOverlayToOverlayTransform ) = 0; + + /** Shows the VR overlay. For dashboard overlays, only the Dashboard Manager is allowed to call this. */ + virtual EVROverlayError ShowOverlay( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** Hides the VR overlay. For dashboard overlays, only the Dashboard Manager is allowed to call this. */ + virtual EVROverlayError HideOverlay( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** Returns true if the overlay is visible. */ + virtual bool IsOverlayVisible( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** 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 */ + virtual EVROverlayError GetTransformForOverlayCoordinates( VROverlayHandle_t ulOverlayHandle, ETrackingUniverseOrigin eTrackingOrigin, HmdVector2_t coordinatesInOverlay, HmdMatrix34_t *pmatTransform ) = 0; + + // --------------------------------------------- + // Overlay input methods + // --------------------------------------------- + + /** Returns true and fills the event with the next event on the overlay's event queue, if there is one. + * If there are no events this method returns false. uncbVREvent should be the size in bytes of the VREvent_t struct */ + virtual bool PollNextOverlayEvent( VROverlayHandle_t ulOverlayHandle, VREvent_t *pEvent, uint32_t uncbVREvent ) = 0; + + /** Returns the current input settings for the specified overlay. */ + virtual EVROverlayError GetOverlayInputMethod( VROverlayHandle_t ulOverlayHandle, VROverlayInputMethod *peInputMethod ) = 0; + + /** Sets the input settings for the specified overlay. */ + virtual EVROverlayError SetOverlayInputMethod( VROverlayHandle_t ulOverlayHandle, VROverlayInputMethod eInputMethod ) = 0; + + /** Gets the mouse scaling factor that is used for mouse events. The actual texture may be a different size, but this is + * typically the size of the underlying UI in pixels. */ + virtual EVROverlayError GetOverlayMouseScale( VROverlayHandle_t ulOverlayHandle, HmdVector2_t *pvecMouseScale ) = 0; + + /** Sets the mouse scaling factor that is used for mouse events. The actual texture may be a different size, but this is + * typically the size of the underlying UI in pixels (not in world space). */ + virtual EVROverlayError SetOverlayMouseScale( VROverlayHandle_t ulOverlayHandle, const HmdVector2_t *pvecMouseScale ) = 0; + + /** Computes the overlay-space pixel coordinates of where the ray intersects the overlay with the + * specified settings. Returns false if there is no intersection. */ + virtual bool ComputeOverlayIntersection( VROverlayHandle_t ulOverlayHandle, const VROverlayIntersectionParams_t *pParams, VROverlayIntersectionResults_t *pResults ) = 0; + + /** Processes mouse input from the specified controller as though it were a mouse pointed at a compositor overlay with the + * specified settings. The controller is treated like a laser pointer on the -z axis. The point where the laser pointer would + * intersect with the overlay is the mouse position, the trigger is left mouse, and the track pad is right mouse. + * + * Return true if the controller is pointed at the overlay and an event was generated. */ + virtual bool HandleControllerOverlayInteractionAsMouse( VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t unControllerDeviceIndex ) = 0; + + /** Returns true if the specified overlay is the hover target. An overlay is the hover target when it is the last overlay "moused over" + * by the virtual mouse pointer */ + virtual bool IsHoverTargetOverlay( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** Returns the current Gamepad focus overlay */ + virtual vr::VROverlayHandle_t GetGamepadFocusOverlay() = 0; + + /** Sets the current Gamepad focus overlay */ + virtual EVROverlayError SetGamepadFocusOverlay( VROverlayHandle_t ulNewFocusOverlay ) = 0; + + /** Sets an overlay's neighbor. This will also set the neighbor of the "to" overlay + * to point back to the "from" overlay. If an overlay's neighbor is set to invalid both + * ends will be cleared */ + virtual EVROverlayError SetOverlayNeighbor( EOverlayDirection eDirection, VROverlayHandle_t ulFrom, VROverlayHandle_t ulTo ) = 0; + + /** Changes the Gamepad focus from one overlay to one of its neighbors. Returns VROverlayError_NoNeighbor if there is no + * neighbor in that direction */ + virtual EVROverlayError MoveGamepadFocusToNeighbor( EOverlayDirection eDirection, VROverlayHandle_t ulFrom ) = 0; + + // --------------------------------------------- + // Overlay texture methods + // --------------------------------------------- + + /** Texture to draw for the overlay. This function can only be called by the overlay's creator or renderer process (see SetOverlayRenderingPid) . + * + * OpenGL dirty state: + * glBindTexture + */ + virtual EVROverlayError SetOverlayTexture( VROverlayHandle_t ulOverlayHandle, const Texture_t *pTexture ) = 0; + + /** Use this to tell the overlay system to release the texture set for this overlay. */ + virtual EVROverlayError ClearOverlayTexture( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** Separate interface for providing the data as a stream of bytes, but there is an upper bound on data + * that can be sent. This function can only be called by the overlay's renderer process. */ + virtual EVROverlayError SetOverlayRaw( VROverlayHandle_t ulOverlayHandle, void *pvBuffer, uint32_t unWidth, uint32_t unHeight, uint32_t unDepth ) = 0; + + /** Separate interface for providing the image through a filename: can be png or jpg, and should not be bigger than 1920x1080. + * This function can only be called by the overlay's renderer process */ + virtual EVROverlayError SetOverlayFromFile( VROverlayHandle_t ulOverlayHandle, const char *pchFilePath ) = 0; + + /** Get the native texture handle/device for an overlay you have created. + * On windows this handle will be a ID3D11ShaderResourceView with a ID3D11Texture2D bound. + * + * The texture will always be sized to match the backing texture you supplied in SetOverlayTexture above. + * + * You MUST call ReleaseNativeOverlayHandle() with pNativeTextureHandle once you are done with this texture. + * + * pNativeTextureHandle is an OUTPUT, it will be a pointer to a ID3D11ShaderResourceView *. + * pNativeTextureRef is an INPUT and should be a ID3D11Resource *. The device used by pNativeTextureRef will be used to bind pNativeTextureHandle. + */ + 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; + + /** Release the pNativeTextureHandle provided from the GetOverlayTexture call, this allows the system to free the underlying GPU resources for this object, + * so only do it once you stop rendering this texture. + */ + virtual EVROverlayError ReleaseNativeOverlayHandle( VROverlayHandle_t ulOverlayHandle, void *pNativeTextureHandle ) = 0; + + /** Get the size of the overlay texture */ + virtual EVROverlayError GetOverlayTextureSize( VROverlayHandle_t ulOverlayHandle, uint32_t *pWidth, uint32_t *pHeight ) = 0; + + // ---------------------------------------------- + // Dashboard Overlay Methods + // ---------------------------------------------- + + /** Creates a dashboard overlay and returns its handle */ + virtual EVROverlayError CreateDashboardOverlay( const char *pchOverlayKey, const char *pchOverlayFriendlyName, VROverlayHandle_t * pMainHandle, VROverlayHandle_t *pThumbnailHandle ) = 0; + + /** Returns true if the dashboard is visible */ + virtual bool IsDashboardVisible() = 0; + + /** returns true if the dashboard is visible and the specified overlay is the active system Overlay */ + virtual bool IsActiveDashboardOverlay( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** Sets the dashboard overlay to only appear when the specified process ID has scene focus */ + virtual EVROverlayError SetDashboardOverlaySceneProcess( VROverlayHandle_t ulOverlayHandle, uint32_t unProcessId ) = 0; + + /** Gets the process ID that this dashboard overlay requires to have scene focus */ + virtual EVROverlayError GetDashboardOverlaySceneProcess( VROverlayHandle_t ulOverlayHandle, uint32_t *punProcessId ) = 0; + + /** Shows the dashboard. */ + virtual void ShowDashboard( const char *pchOverlayToShow ) = 0; + + /** Returns the tracked device that has the laser pointer in the dashboard */ + virtual vr::TrackedDeviceIndex_t GetPrimaryDashboardDevice() = 0; + + // --------------------------------------------- + // Keyboard methods + // --------------------------------------------- + + /** Show the virtual keyboard to accept input **/ + virtual EVROverlayError ShowKeyboard( EGamepadTextInputMode eInputMode, EGamepadTextInputLineMode eLineInputMode, const char *pchDescription, uint32_t unCharMax, const char *pchExistingText, bool bUseMinimalMode, uint64_t uUserValue ) = 0; + + virtual EVROverlayError ShowKeyboardForOverlay( VROverlayHandle_t ulOverlayHandle, EGamepadTextInputMode eInputMode, EGamepadTextInputLineMode eLineInputMode, const char *pchDescription, uint32_t unCharMax, const char *pchExistingText, bool bUseMinimalMode, uint64_t uUserValue ) = 0; + + /** Get the text that was entered into the text input **/ + virtual uint32_t GetKeyboardText( VR_OUT_STRING() char *pchText, uint32_t cchText ) = 0; + + /** Hide the virtual keyboard **/ + virtual void HideKeyboard() = 0; + + /** Set the position of the keyboard in world space **/ + virtual void SetKeyboardTransformAbsolute( ETrackingUniverseOrigin eTrackingOrigin, const HmdMatrix34_t *pmatTrackingOriginToKeyboardTransform ) = 0; + + /** 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 **/ + virtual void SetKeyboardPositionForOverlay( VROverlayHandle_t ulOverlayHandle, HmdRect2_t avoidRect ) = 0; + + // --------------------------------------------- + // Overlay input methods + // --------------------------------------------- + + /** Sets a list of primitives to be used for controller ray intersection + * typically the size of the underlying UI in pixels (not in world space). */ + virtual EVROverlayError SetOverlayIntersectionMask( VROverlayHandle_t ulOverlayHandle, VROverlayIntersectionMaskPrimitive_t *pMaskPrimitives, uint32_t unNumMaskPrimitives, uint32_t unPrimitiveSize = sizeof( VROverlayIntersectionMaskPrimitive_t ) ) = 0; + + virtual EVROverlayError GetOverlayFlags( VROverlayHandle_t ulOverlayHandle, uint32_t *pFlags ) = 0; + + // --------------------------------------------- + // Message box methods + // --------------------------------------------- + + /** Show the message overlay. This will block and return you a result. **/ + 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; + }; + + static const char * const IVROverlay_Version = "IVROverlay_016"; + +} // namespace vr + +// ivrrendermodels.h +namespace vr +{ + +static const char * const k_pch_Controller_Component_GDC2015 = "gdc2015"; // Canonical coordinate system of the gdc 2015 wired controller, provided for backwards compatibility +static const char * const k_pch_Controller_Component_Base = "base"; // For controllers with an unambiguous 'base'. +static const char * const k_pch_Controller_Component_Tip = "tip"; // For controllers with an unambiguous 'tip' (used for 'laser-pointing') +static 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 +static const char * const k_pch_Controller_Component_Status = "status"; // 1:1 aspect ratio status area, with canonical [0,1] uv mapping + +#pragma pack( push, 8 ) + +/** Errors that can occur with the VR compositor */ +enum EVRRenderModelError +{ + VRRenderModelError_None = 0, + VRRenderModelError_Loading = 100, + VRRenderModelError_NotSupported = 200, + VRRenderModelError_InvalidArg = 300, + VRRenderModelError_InvalidModel = 301, + VRRenderModelError_NoShapes = 302, + VRRenderModelError_MultipleShapes = 303, + VRRenderModelError_TooManyVertices = 304, + VRRenderModelError_MultipleTextures = 305, + VRRenderModelError_BufferTooSmall = 306, + VRRenderModelError_NotEnoughNormals = 307, + VRRenderModelError_NotEnoughTexCoords = 308, + + VRRenderModelError_InvalidTexture = 400, +}; + +typedef uint32_t VRComponentProperties; + +enum EVRComponentProperty +{ + VRComponentProperty_IsStatic = (1 << 0), + VRComponentProperty_IsVisible = (1 << 1), + VRComponentProperty_IsTouched = (1 << 2), + VRComponentProperty_IsPressed = (1 << 3), + VRComponentProperty_IsScrolled = (1 << 4), +}; + +/** Describes state information about a render-model component, including transforms and other dynamic properties */ +struct RenderModel_ComponentState_t +{ + HmdMatrix34_t mTrackingToComponentRenderModel; // Transform required when drawing the component render model + HmdMatrix34_t mTrackingToComponentLocal; // Transform available for attaching to a local component coordinate system (-Z out from surface ) + VRComponentProperties uProperties; +}; + +/** A single vertex in a render model */ +struct RenderModel_Vertex_t +{ + HmdVector3_t vPosition; // position in meters in device space + HmdVector3_t vNormal; + float rfTextureCoord[2]; +}; + +/** A texture map for use on a render model */ +#if defined(__linux__) || defined(__APPLE__) +// This structure was originally defined mis-packed on Linux, preserved for +// compatibility. +#pragma pack( push, 4 ) +#endif + +struct RenderModel_TextureMap_t +{ + uint16_t unWidth, unHeight; // width and height of the texture map in pixels + const uint8_t *rubTextureMapData; // Map texture data. All textures are RGBA with 8 bits per channel per pixel. Data size is width * height * 4ub +}; +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( pop ) +#endif + +/** Session unique texture identifier. Rendermodels which share the same texture will have the same id. +IDs <0 denote the texture is not present */ + +typedef int32_t TextureID_t; + +const TextureID_t INVALID_TEXTURE_ID = -1; + +#if defined(__linux__) || defined(__APPLE__) +// This structure was originally defined mis-packed on Linux, preserved for +// compatibility. +#pragma pack( push, 4 ) +#endif + +struct RenderModel_t +{ + const RenderModel_Vertex_t *rVertexData; // Vertex data for the mesh + uint32_t unVertexCount; // Number of vertices in the vertex data + const uint16_t *rIndexData; // Indices into the vertex data for each triangle + uint32_t unTriangleCount; // Number of triangles in the mesh. Index count is 3 * TriangleCount + TextureID_t diffuseTextureId; // Session unique texture identifier. Rendermodels which share the same texture will have the same id. <0 == texture not present +}; +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( pop ) +#endif + + +struct RenderModel_ControllerMode_State_t +{ + bool bScrollWheelVisible; // is this controller currently set to be in a scroll wheel mode +}; + +#pragma pack( pop ) + +class IVRRenderModels +{ +public: + + /** Loads and returns a render model for use in the application. pchRenderModelName should be a render model name + * from the Prop_RenderModelName_String property or an absolute path name to a render model on disk. + * + * The resulting render model is valid until VR_Shutdown() is called or until FreeRenderModel() is called. When the + * application is finished with the render model it should call FreeRenderModel() to free the memory associated + * with the model. + * + * The method returns VRRenderModelError_Loading while the render model is still being loaded. + * The method returns VRRenderModelError_None once loaded successfully, otherwise will return an error. */ + virtual EVRRenderModelError LoadRenderModel_Async( const char *pchRenderModelName, RenderModel_t **ppRenderModel ) = 0; + + /** Frees a previously returned render model + * It is safe to call this on a null ptr. */ + virtual void FreeRenderModel( RenderModel_t *pRenderModel ) = 0; + + /** Loads and returns a texture for use in the application. */ + virtual EVRRenderModelError LoadTexture_Async( TextureID_t textureId, RenderModel_TextureMap_t **ppTexture ) = 0; + + /** Frees a previously returned texture + * It is safe to call this on a null ptr. */ + virtual void FreeTexture( RenderModel_TextureMap_t *pTexture ) = 0; + + /** Creates a D3D11 texture and loads data into it. */ + virtual EVRRenderModelError LoadTextureD3D11_Async( TextureID_t textureId, void *pD3D11Device, void **ppD3D11Texture2D ) = 0; + + /** Helper function to copy the bits into an existing texture. */ + virtual EVRRenderModelError LoadIntoTextureD3D11_Async( TextureID_t textureId, void *pDstTexture ) = 0; + + /** Use this to free textures created with LoadTextureD3D11_Async instead of calling Release on them. */ + virtual void FreeTextureD3D11( void *pD3D11Texture2D ) = 0; + + /** Use this to get the names of available render models. Index does not correlate to a tracked device index, but + * is only used for iterating over all available render models. If the index is out of range, this function will return 0. + * Otherwise, it will return the size of the buffer required for the name. */ + virtual uint32_t GetRenderModelName( uint32_t unRenderModelIndex, VR_OUT_STRING() char *pchRenderModelName, uint32_t unRenderModelNameLen ) = 0; + + /** Returns the number of available render models. */ + virtual uint32_t GetRenderModelCount() = 0; + + + /** Returns the number of components of the specified render model. + * Components are useful when client application wish to draw, label, or otherwise interact with components of tracked objects. + * Examples controller components: + * renderable things such as triggers, buttons + * non-renderable things which include coordinate systems such as 'tip', 'base', a neutral controller agnostic hand-pose + * If all controller components are enumerated and rendered, it will be equivalent to drawing the traditional render model + * Returns 0 if components not supported, >0 otherwise */ + virtual uint32_t GetComponentCount( const char *pchRenderModelName ) = 0; + + /** Use this to get the names of available components. Index does not correlate to a tracked device index, but + * is only used for iterating over all available components. If the index is out of range, this function will return 0. + * Otherwise, it will return the size of the buffer required for the name. */ + virtual uint32_t GetComponentName( const char *pchRenderModelName, uint32_t unComponentIndex, VR_OUT_STRING( ) char *pchComponentName, uint32_t unComponentNameLen ) = 0; + + /** Get the button mask for all buttons associated with this component + * If no buttons (or axes) are associated with this component, return 0 + * Note: multiple components may be associated with the same button. Ex: two grip buttons on a single controller. + * Note: A single component may be associated with multiple buttons. Ex: A trackpad which also provides "D-pad" functionality */ + virtual uint64_t GetComponentButtonMask( const char *pchRenderModelName, const char *pchComponentName ) = 0; + + /** Use this to get the render model name for the specified rendermode/component combination, to be passed to LoadRenderModel. + * If the component name is out of range, this function will return 0. + * Otherwise, it will return the size of the buffer required for the name. */ + virtual uint32_t GetComponentRenderModelName( const char *pchRenderModelName, const char *pchComponentName, VR_OUT_STRING( ) char *pchComponentRenderModelName, uint32_t unComponentRenderModelNameLen ) = 0; + + /** Use this to query information about the component, as a function of the controller state. + * + * For dynamic controller components (ex: trigger) values will reflect component motions + * For static components this will return a consistent value independent of the VRControllerState_t + * + * If the pchRenderModelName or pchComponentName is invalid, this will return false (and transforms will be set to identity). + * Otherwise, return true + * Note: For dynamic objects, visibility may be dynamic. (I.e., true/false will be returned based on controller state and controller mode state ) */ + 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; + + /** Returns true if the render model has a component with the specified name */ + virtual bool RenderModelHasComponent( const char *pchRenderModelName, const char *pchComponentName ) = 0; + + /** Returns the URL of the thumbnail image for this rendermodel */ + virtual uint32_t GetRenderModelThumbnailURL( const char *pchRenderModelName, VR_OUT_STRING() char *pchThumbnailURL, uint32_t unThumbnailURLLen, vr::EVRRenderModelError *peError ) = 0; + + /** 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 + * 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 + * model. */ + virtual uint32_t GetRenderModelOriginalPath( const char *pchRenderModelName, VR_OUT_STRING() char *pchOriginalPath, uint32_t unOriginalPathLen, vr::EVRRenderModelError *peError ) = 0; + + /** Returns a string for a render model error */ + virtual const char *GetRenderModelErrorNameFromEnum( vr::EVRRenderModelError error ) = 0; +}; + +static const char * const IVRRenderModels_Version = "IVRRenderModels_005"; + +} + + +// ivrextendeddisplay.h +namespace vr +{ + + /** NOTE: Use of this interface is not recommended in production applications. It will not work for displays which use + * direct-to-display mode. Creating our own window is also incompatible with the VR compositor and is not available when the compositor is running. */ + class IVRExtendedDisplay + { + public: + + /** Size and position that the window needs to be on the VR display. */ + virtual void GetWindowBounds( int32_t *pnX, int32_t *pnY, uint32_t *pnWidth, uint32_t *pnHeight ) = 0; + + /** Gets the viewport in the frame buffer to draw the output of the distortion into */ + virtual void GetEyeOutputViewport( EVREye eEye, uint32_t *pnX, uint32_t *pnY, uint32_t *pnWidth, uint32_t *pnHeight ) = 0; + + /** [D3D10/11 Only] + * Returns the adapter index and output index that the user should pass into EnumAdapters and EnumOutputs + * to create the device and swap chain in DX10 and DX11. If an error occurs both indices will be set to -1. + */ + virtual void GetDXGIOutputInfo( int32_t *pnAdapterIndex, int32_t *pnAdapterOutputIndex ) = 0; + + }; + + static const char * const IVRExtendedDisplay_Version = "IVRExtendedDisplay_001"; + +} + + +// ivrtrackedcamera.h +namespace vr +{ + +class IVRTrackedCamera +{ +public: + /** Returns a string for an error */ + virtual const char *GetCameraErrorNameFromEnum( vr::EVRTrackedCameraError eCameraError ) = 0; + + /** For convenience, same as tracked property request Prop_HasCamera_Bool */ + virtual vr::EVRTrackedCameraError HasCamera( vr::TrackedDeviceIndex_t nDeviceIndex, bool *pHasCamera ) = 0; + + /** Gets size of the image frame. */ + virtual vr::EVRTrackedCameraError GetCameraFrameSize( vr::TrackedDeviceIndex_t nDeviceIndex, vr::EVRTrackedCameraFrameType eFrameType, uint32_t *pnWidth, uint32_t *pnHeight, uint32_t *pnFrameBufferSize ) = 0; + + virtual vr::EVRTrackedCameraError GetCameraIntrinsics( vr::TrackedDeviceIndex_t nDeviceIndex, vr::EVRTrackedCameraFrameType eFrameType, vr::HmdVector2_t *pFocalLength, vr::HmdVector2_t *pCenter ) = 0; + + virtual vr::EVRTrackedCameraError GetCameraProjection( vr::TrackedDeviceIndex_t nDeviceIndex, vr::EVRTrackedCameraFrameType eFrameType, float flZNear, float flZFar, vr::HmdMatrix44_t *pProjection ) = 0; + + /** 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. + * 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. + * The camera should be considered a global resource accessible for shared consumption but not exclusive to any caller. + * The camera may go inactive due to lack of active consumers or headset idleness. */ + virtual vr::EVRTrackedCameraError AcquireVideoStreamingService( vr::TrackedDeviceIndex_t nDeviceIndex, vr::TrackedCameraHandle_t *pHandle ) = 0; + virtual vr::EVRTrackedCameraError ReleaseVideoStreamingService( vr::TrackedCameraHandle_t hTrackedCamera ) = 0; + + /** Copies the image frame into a caller's provided buffer. The image data is currently provided as RGBA data, 4 bytes per pixel. + * A caller can provide null for the framebuffer or frameheader if not desired. Requesting the frame header first, followed by the frame buffer allows + * the caller to determine if the frame as advanced per the frame header sequence. + * If there is no frame available yet, due to initial camera spinup or re-activation, the error will be VRTrackedCameraError_NoFrameAvailable. + * Ideally a caller should be polling at ~16ms intervals */ + virtual vr::EVRTrackedCameraError GetVideoStreamFrameBuffer( vr::TrackedCameraHandle_t hTrackedCamera, vr::EVRTrackedCameraFrameType eFrameType, void *pFrameBuffer, uint32_t nFrameBufferSize, vr::CameraVideoStreamFrameHeader_t *pFrameHeader, uint32_t nFrameHeaderSize ) = 0; + + /** Gets size of the image frame. */ + virtual vr::EVRTrackedCameraError GetVideoStreamTextureSize( vr::TrackedDeviceIndex_t nDeviceIndex, vr::EVRTrackedCameraFrameType eFrameType, vr::VRTextureBounds_t *pTextureBounds, uint32_t *pnWidth, uint32_t *pnHeight ) = 0; + + /** Access a shared D3D11 texture for the specified tracked camera stream. + * 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. + * Instead, use GetVideoStreamTextureSize() with VRTrackedCameraFrameType_Undistorted to determine the proper interior subregion bounds along with GetVideoStreamTextureD3D11() with + * VRTrackedCameraFrameType_MaximumUndistorted to provide the texture. The VRTrackedCameraFrameType_MaximumUndistorted will yield an image where the invalid regions are decoded + * 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 + * guarantees a rectangle where all pixels are valid. */ + virtual vr::EVRTrackedCameraError GetVideoStreamTextureD3D11( vr::TrackedCameraHandle_t hTrackedCamera, vr::EVRTrackedCameraFrameType eFrameType, void *pD3D11DeviceOrResource, void **ppD3D11ShaderResourceView, vr::CameraVideoStreamFrameHeader_t *pFrameHeader, uint32_t nFrameHeaderSize ) = 0; + + /** Access a shared GL texture for the specified tracked camera stream */ + virtual vr::EVRTrackedCameraError GetVideoStreamTextureGL( vr::TrackedCameraHandle_t hTrackedCamera, vr::EVRTrackedCameraFrameType eFrameType, vr::glUInt_t *pglTextureId, vr::CameraVideoStreamFrameHeader_t *pFrameHeader, uint32_t nFrameHeaderSize ) = 0; + virtual vr::EVRTrackedCameraError ReleaseVideoStreamTextureGL( vr::TrackedCameraHandle_t hTrackedCamera, vr::glUInt_t glTextureId ) = 0; +}; + +static const char * const IVRTrackedCamera_Version = "IVRTrackedCamera_003"; + +} // namespace vr + + +// ivrscreenshots.h +namespace vr +{ + +/** Errors that can occur with the VR compositor */ +enum EVRScreenshotError +{ + VRScreenshotError_None = 0, + VRScreenshotError_RequestFailed = 1, + VRScreenshotError_IncompatibleVersion = 100, + VRScreenshotError_NotFound = 101, + VRScreenshotError_BufferTooSmall = 102, + VRScreenshotError_ScreenshotAlreadyInProgress = 108, +}; + +/** Allows the application to generate screenshots */ +class IVRScreenshots +{ +public: + /** Request a screenshot of the requested type. + * A request of the VRScreenshotType_Stereo type will always + * work. Other types will depend on the underlying application + * support. + * The first file name is for the preview image and should be a + * regular screenshot (ideally from the left eye). The second + * is the VR screenshot in the correct format. They should be + * in the same aspect ratio. Formats per type: + * VRScreenshotType_Mono: the VR filename is ignored (can be + * nullptr), this is a normal flat single shot. + * VRScreenshotType_Stereo: The VR image should be a + * side-by-side with the left eye image on the left. + * VRScreenshotType_Cubemap: The VR image should be six square + * images composited horizontally. + * VRScreenshotType_StereoPanorama: above/below with left eye + * panorama being the above image. Image is typically square + * with the panorama being 2x horizontal. + * + * Note that the VR dashboard will call this function when + * the user presses the screenshot binding (currently System + * Button + Trigger). If Steam is running, the destination + * file names will be in %TEMP% and will be copied into + * Steam's screenshot library for the running application + * once SubmitScreenshot() is called. + * If Steam is not running, the paths will be in the user's + * documents folder under Documents\SteamVR\Screenshots. + * Other VR applications can call this to initiate a + * screenshot outside of user control. + * The destination file names do not need an extension, + * will be replaced with the correct one for the format + * which is currently .png. */ + virtual vr::EVRScreenshotError RequestScreenshot( vr::ScreenshotHandle_t *pOutScreenshotHandle, vr::EVRScreenshotType type, const char *pchPreviewFilename, const char *pchVRFilename ) = 0; + + /** Called by the running VR application to indicate that it + * wishes to be in charge of screenshots. If the + * application does not call this, the Compositor will only + * support VRScreenshotType_Stereo screenshots that will be + * captured without notification to the running app. + * Once hooked your application will receive a + * VREvent_RequestScreenshot event when the user presses the + * buttons to take a screenshot. */ + virtual vr::EVRScreenshotError HookScreenshot( VR_ARRAY_COUNT( numTypes ) const vr::EVRScreenshotType *pSupportedTypes, int numTypes ) = 0; + + /** When your application receives a + * VREvent_RequestScreenshot event, call these functions to get + * the details of the screenshot request. */ + virtual vr::EVRScreenshotType GetScreenshotPropertyType( vr::ScreenshotHandle_t screenshotHandle, vr::EVRScreenshotError *pError ) = 0; + + /** Get the filename for the preview or vr image (see + * vr::EScreenshotPropertyFilenames). The return value is + * the size of the string. */ + virtual uint32_t GetScreenshotPropertyFilename( vr::ScreenshotHandle_t screenshotHandle, vr::EVRScreenshotPropertyFilenames filenameType, VR_OUT_STRING() char *pchFilename, uint32_t cchFilename, vr::EVRScreenshotError *pError ) = 0; + + /** Call this if the application is taking the screen shot + * will take more than a few ms processing. This will result + * in an overlay being presented that shows a completion + * bar. */ + virtual vr::EVRScreenshotError UpdateScreenshotProgress( vr::ScreenshotHandle_t screenshotHandle, float flProgress ) = 0; + + /** Tells the compositor to take an internal screenshot of + * type VRScreenshotType_Stereo. It will take the current + * submitted scene textures of the running application and + * write them into the preview image and a side-by-side file + * for the VR image. + * This is similar to request screenshot, but doesn't ever + * talk to the application, just takes the shot and submits. */ + virtual vr::EVRScreenshotError TakeStereoScreenshot( vr::ScreenshotHandle_t *pOutScreenshotHandle, const char *pchPreviewFilename, const char *pchVRFilename ) = 0; + + /** Submit the completed screenshot. If Steam is running + * this will call into the Steam client and upload the + * screenshot to the screenshots section of the library for + * the running application. If Steam is not running, this + * function will display a notification to the user that the + * screenshot was taken. The paths should be full paths with + * extensions. + * File paths should be absolute including extensions. + * screenshotHandle can be k_unScreenshotHandleInvalid if this + * was a new shot taking by the app to be saved and not + * initiated by a user (achievement earned or something) */ + virtual vr::EVRScreenshotError SubmitScreenshot( vr::ScreenshotHandle_t screenshotHandle, vr::EVRScreenshotType type, const char *pchSourcePreviewFilename, const char *pchSourceVRFilename ) = 0; +}; + +static const char * const IVRScreenshots_Version = "IVRScreenshots_001"; + +} // namespace vr + + + +// ivrresources.h +namespace vr +{ + +class IVRResources +{ +public: + + // ------------------------------------ + // Shared Resource Methods + // ------------------------------------ + + /** Loads the specified resource into the provided buffer if large enough. + * Returns the size in bytes of the buffer required to hold the specified resource. */ + virtual uint32_t LoadSharedResource( const char *pchResourceName, char *pchBuffer, uint32_t unBufferLen ) = 0; + + /** Provides the full path to the specified resource. Resource names can include named directories for + * drivers and other things, and this resolves all of those and returns the actual physical path. + * pchResourceTypeDirectory is the subdirectory of resources to look in. */ + virtual uint32_t GetResourceFullPath( const char *pchResourceName, const char *pchResourceTypeDirectory, char *pchPathBuffer, uint32_t unBufferLen ) = 0; +}; + +static const char * const IVRResources_Version = "IVRResources_001"; + + +} +// ivrdrivermanager.h +namespace vr +{ + +class IVRDriverManager +{ +public: + virtual uint32_t GetDriverCount() const = 0; + + /** Returns the length of the number of bytes necessary to hold this string including the trailing null. */ + virtual uint32_t GetDriverName( vr::DriverId_t nDriver, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize ) = 0; +}; + +static const char * const IVRDriverManager_Version = "IVRDriverManager_001"; + +} // namespace vr + + +// End + +#endif // _OPENVR_API + + +namespace vr +{ + /** Finds the active installation of the VR API and initializes it. The provided path must be absolute + * or relative to the current working directory. These are the local install versions of the equivalent + * functions in steamvr.h and will work without a local Steam install. + * + * This path is to the "root" of the VR API install. That's the directory with + * the "drivers" directory and a platform (i.e. "win32") directory in it, not the directory with the DLL itself. + */ + inline IVRSystem *VR_Init( EVRInitError *peError, EVRApplicationType eApplicationType ); + + /** unloads vrclient.dll. Any interface pointers from the interface are + * invalid after this point */ + inline void VR_Shutdown(); + + /** Returns true if there is an HMD attached. This check is as lightweight as possible and + * can be called outside of VR_Init/VR_Shutdown. It should be used when an application wants + * to know if initializing VR is a possibility but isn't ready to take that step yet. + */ + VR_INTERFACE bool VR_CALLTYPE VR_IsHmdPresent(); + + /** Returns true if the OpenVR runtime is installed. */ + VR_INTERFACE bool VR_CALLTYPE VR_IsRuntimeInstalled(); + + /** Returns where the OpenVR runtime is installed. */ + VR_INTERFACE const char *VR_CALLTYPE VR_RuntimePath(); + + /** Returns the name of the enum value for an EVRInitError. This function may be called outside of VR_Init()/VR_Shutdown(). */ + VR_INTERFACE const char *VR_CALLTYPE VR_GetVRInitErrorAsSymbol( EVRInitError error ); + + /** Returns an English string for an EVRInitError. Applications should call VR_GetVRInitErrorAsSymbol instead and + * use that as a key to look up their own localized error message. This function may be called outside of VR_Init()/VR_Shutdown(). */ + VR_INTERFACE const char *VR_CALLTYPE VR_GetVRInitErrorAsEnglishDescription( EVRInitError error ); + + /** Returns the interface of the specified version. This method must be called after VR_Init. The + * pointer returned is valid until VR_Shutdown is called. + */ + VR_INTERFACE void *VR_CALLTYPE VR_GetGenericInterface( const char *pchInterfaceVersion, EVRInitError *peError ); + + /** Returns whether the interface of the specified version exists. + */ + VR_INTERFACE bool VR_CALLTYPE VR_IsInterfaceVersionValid( const char *pchInterfaceVersion ); + + /** Returns a token that represents whether the VR interface handles need to be reloaded */ + VR_INTERFACE uint32_t VR_CALLTYPE VR_GetInitToken(); + + // These typedefs allow old enum names from SDK 0.9.11 to be used in applications. + // They will go away in the future. + typedef EVRInitError HmdError; + typedef EVREye Hmd_Eye; + typedef EColorSpace ColorSpace; + typedef ETrackingResult HmdTrackingResult; + typedef ETrackedDeviceClass TrackedDeviceClass; + typedef ETrackingUniverseOrigin TrackingUniverseOrigin; + typedef ETrackedDeviceProperty TrackedDeviceProperty; + typedef ETrackedPropertyError TrackedPropertyError; + typedef EVRSubmitFlags VRSubmitFlags_t; + typedef EVRState VRState_t; + typedef ECollisionBoundsStyle CollisionBoundsStyle_t; + typedef EVROverlayError VROverlayError; + typedef EVRFirmwareError VRFirmwareError; + typedef EVRCompositorError VRCompositorError; + typedef EVRScreenshotError VRScreenshotsError; + + inline uint32_t &VRToken() + { + static uint32_t token; + return token; + } + + class COpenVRContext + { + public: + COpenVRContext() { Clear(); } + void Clear(); + + inline void CheckClear() + { + if ( VRToken() != VR_GetInitToken() ) + { + Clear(); + VRToken() = VR_GetInitToken(); + } + } + + IVRSystem *VRSystem() + { + CheckClear(); + if ( m_pVRSystem == nullptr ) + { + EVRInitError eError; + m_pVRSystem = ( IVRSystem * )VR_GetGenericInterface( IVRSystem_Version, &eError ); + } + return m_pVRSystem; + } + IVRChaperone *VRChaperone() + { + CheckClear(); + if ( m_pVRChaperone == nullptr ) + { + EVRInitError eError; + m_pVRChaperone = ( IVRChaperone * )VR_GetGenericInterface( IVRChaperone_Version, &eError ); + } + return m_pVRChaperone; + } + + IVRChaperoneSetup *VRChaperoneSetup() + { + CheckClear(); + if ( m_pVRChaperoneSetup == nullptr ) + { + EVRInitError eError; + m_pVRChaperoneSetup = ( IVRChaperoneSetup * )VR_GetGenericInterface( IVRChaperoneSetup_Version, &eError ); + } + return m_pVRChaperoneSetup; + } + + IVRCompositor *VRCompositor() + { + CheckClear(); + if ( m_pVRCompositor == nullptr ) + { + EVRInitError eError; + m_pVRCompositor = ( IVRCompositor * )VR_GetGenericInterface( IVRCompositor_Version, &eError ); + } + return m_pVRCompositor; + } + + IVROverlay *VROverlay() + { + CheckClear(); + if ( m_pVROverlay == nullptr ) + { + EVRInitError eError; + m_pVROverlay = ( IVROverlay * )VR_GetGenericInterface( IVROverlay_Version, &eError ); + } + return m_pVROverlay; + } + + IVRResources *VRResources() + { + CheckClear(); + if ( m_pVRResources == nullptr ) + { + EVRInitError eError; + m_pVRResources = (IVRResources *)VR_GetGenericInterface( IVRResources_Version, &eError ); + } + return m_pVRResources; + } + + IVRScreenshots *VRScreenshots() + { + CheckClear(); + if ( m_pVRScreenshots == nullptr ) + { + EVRInitError eError; + m_pVRScreenshots = ( IVRScreenshots * )VR_GetGenericInterface( IVRScreenshots_Version, &eError ); + } + return m_pVRScreenshots; + } + + IVRRenderModels *VRRenderModels() + { + CheckClear(); + if ( m_pVRRenderModels == nullptr ) + { + EVRInitError eError; + m_pVRRenderModels = ( IVRRenderModels * )VR_GetGenericInterface( IVRRenderModels_Version, &eError ); + } + return m_pVRRenderModels; + } + + IVRExtendedDisplay *VRExtendedDisplay() + { + CheckClear(); + if ( m_pVRExtendedDisplay == nullptr ) + { + EVRInitError eError; + m_pVRExtendedDisplay = ( IVRExtendedDisplay * )VR_GetGenericInterface( IVRExtendedDisplay_Version, &eError ); + } + return m_pVRExtendedDisplay; + } + + IVRSettings *VRSettings() + { + CheckClear(); + if ( m_pVRSettings == nullptr ) + { + EVRInitError eError; + m_pVRSettings = ( IVRSettings * )VR_GetGenericInterface( IVRSettings_Version, &eError ); + } + return m_pVRSettings; + } + + IVRApplications *VRApplications() + { + CheckClear(); + if ( m_pVRApplications == nullptr ) + { + EVRInitError eError; + m_pVRApplications = ( IVRApplications * )VR_GetGenericInterface( IVRApplications_Version, &eError ); + } + return m_pVRApplications; + } + + IVRTrackedCamera *VRTrackedCamera() + { + CheckClear(); + if ( m_pVRTrackedCamera == nullptr ) + { + EVRInitError eError; + m_pVRTrackedCamera = ( IVRTrackedCamera * )VR_GetGenericInterface( IVRTrackedCamera_Version, &eError ); + } + return m_pVRTrackedCamera; + } + + IVRDriverManager *VRDriverManager() + { + CheckClear(); + if ( !m_pVRDriverManager ) + { + EVRInitError eError; + m_pVRDriverManager = ( IVRDriverManager * )VR_GetGenericInterface( IVRDriverManager_Version, &eError ); + } + return m_pVRDriverManager; + } + + private: + IVRSystem *m_pVRSystem; + IVRChaperone *m_pVRChaperone; + IVRChaperoneSetup *m_pVRChaperoneSetup; + IVRCompositor *m_pVRCompositor; + IVROverlay *m_pVROverlay; + IVRResources *m_pVRResources; + IVRRenderModels *m_pVRRenderModels; + IVRExtendedDisplay *m_pVRExtendedDisplay; + IVRSettings *m_pVRSettings; + IVRApplications *m_pVRApplications; + IVRTrackedCamera *m_pVRTrackedCamera; + IVRScreenshots *m_pVRScreenshots; + IVRDriverManager *m_pVRDriverManager; + }; + + inline COpenVRContext &OpenVRInternal_ModuleContext() + { + static void *ctx[ sizeof( COpenVRContext ) / sizeof( void * ) ]; + return *( COpenVRContext * )ctx; // bypass zero-init constructor + } + + inline IVRSystem *VR_CALLTYPE VRSystem() { return OpenVRInternal_ModuleContext().VRSystem(); } + inline IVRChaperone *VR_CALLTYPE VRChaperone() { return OpenVRInternal_ModuleContext().VRChaperone(); } + inline IVRChaperoneSetup *VR_CALLTYPE VRChaperoneSetup() { return OpenVRInternal_ModuleContext().VRChaperoneSetup(); } + inline IVRCompositor *VR_CALLTYPE VRCompositor() { return OpenVRInternal_ModuleContext().VRCompositor(); } + inline IVROverlay *VR_CALLTYPE VROverlay() { return OpenVRInternal_ModuleContext().VROverlay(); } + inline IVRScreenshots *VR_CALLTYPE VRScreenshots() { return OpenVRInternal_ModuleContext().VRScreenshots(); } + inline IVRRenderModels *VR_CALLTYPE VRRenderModels() { return OpenVRInternal_ModuleContext().VRRenderModels(); } + inline IVRApplications *VR_CALLTYPE VRApplications() { return OpenVRInternal_ModuleContext().VRApplications(); } + inline IVRSettings *VR_CALLTYPE VRSettings() { return OpenVRInternal_ModuleContext().VRSettings(); } + inline IVRResources *VR_CALLTYPE VRResources() { return OpenVRInternal_ModuleContext().VRResources(); } + inline IVRExtendedDisplay *VR_CALLTYPE VRExtendedDisplay() { return OpenVRInternal_ModuleContext().VRExtendedDisplay(); } + inline IVRTrackedCamera *VR_CALLTYPE VRTrackedCamera() { return OpenVRInternal_ModuleContext().VRTrackedCamera(); } + inline IVRDriverManager *VR_CALLTYPE VRDriverManager() { return OpenVRInternal_ModuleContext().VRDriverManager(); } + + inline void COpenVRContext::Clear() + { + m_pVRSystem = nullptr; + m_pVRChaperone = nullptr; + m_pVRChaperoneSetup = nullptr; + m_pVRCompositor = nullptr; + m_pVROverlay = nullptr; + m_pVRRenderModels = nullptr; + m_pVRExtendedDisplay = nullptr; + m_pVRSettings = nullptr; + m_pVRApplications = nullptr; + m_pVRTrackedCamera = nullptr; + m_pVRResources = nullptr; + m_pVRScreenshots = nullptr; + m_pVRDriverManager = nullptr; + } + + VR_INTERFACE uint32_t VR_CALLTYPE VR_InitInternal( EVRInitError *peError, EVRApplicationType eApplicationType ); + VR_INTERFACE void VR_CALLTYPE VR_ShutdownInternal(); + + /** Finds the active installation of vrclient.dll and initializes it */ + inline IVRSystem *VR_Init( EVRInitError *peError, EVRApplicationType eApplicationType ) + { + IVRSystem *pVRSystem = nullptr; + + EVRInitError eError; + VRToken() = VR_InitInternal( &eError, eApplicationType ); + COpenVRContext &ctx = OpenVRInternal_ModuleContext(); + ctx.Clear(); + + if ( eError == VRInitError_None ) + { + if ( VR_IsInterfaceVersionValid( IVRSystem_Version ) ) + { + pVRSystem = VRSystem(); + } + else + { + VR_ShutdownInternal(); + eError = VRInitError_Init_InterfaceNotFound; + } + } + + if ( peError ) + *peError = eError; + return pVRSystem; + } + + /** unloads vrclient.dll. Any interface pointers from the interface are + * invalid after this point */ + inline void VR_Shutdown() + { + VR_ShutdownInternal(); + } +} diff --git a/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Headers/openvr_api.cs b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Headers/openvr_api.cs new file mode 100644 index 000000000..2596b3783 --- /dev/null +++ b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Headers/openvr_api.cs @@ -0,0 +1,4997 @@ +//======= Copyright (c) Valve Corporation, All rights reserved. =============== +// +// Purpose: This file contains C#/managed code bindings for the OpenVR interfaces +// This file is auto-generated, do not edit it. +// +//============================================================================= + +using System; +using System.Runtime.InteropServices; +using Valve.VR; + +namespace Valve.VR +{ + +[StructLayout(LayoutKind.Sequential)] +public struct IVRSystem +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetRecommendedRenderTargetSize(ref uint pnWidth, ref uint pnHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRecommendedRenderTargetSize GetRecommendedRenderTargetSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HmdMatrix44_t _GetProjectionMatrix(EVREye eEye, float fNearZ, float fFarZ); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetProjectionMatrix GetProjectionMatrix; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetProjectionRaw(EVREye eEye, ref float pfLeft, ref float pfRight, ref float pfTop, ref float pfBottom); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetProjectionRaw GetProjectionRaw; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ComputeDistortion(EVREye eEye, float fU, float fV, ref DistortionCoordinates_t pDistortionCoordinates); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ComputeDistortion ComputeDistortion; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HmdMatrix34_t _GetEyeToHeadTransform(EVREye eEye); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetEyeToHeadTransform GetEyeToHeadTransform; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetTimeSinceLastVsync(ref float pfSecondsSinceLastVsync, ref ulong pulFrameCounter); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTimeSinceLastVsync GetTimeSinceLastVsync; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate int _GetD3D9AdapterIndex(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetD3D9AdapterIndex GetD3D9AdapterIndex; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetDXGIOutputInfo(ref int pnAdapterIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDXGIOutputInfo GetDXGIOutputInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetOutputDevice(ref ulong pnDevice, ETextureType textureType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOutputDevice GetOutputDevice; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsDisplayOnDesktop(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsDisplayOnDesktop IsDisplayOnDesktop; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _SetDisplayVisibility(bool bIsVisibleOnDesktop); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetDisplayVisibility SetDisplayVisibility; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin eOrigin, float fPredictedSecondsToPhotonsFromNow, [In, Out] TrackedDevicePose_t[] pTrackedDevicePoseArray, uint unTrackedDevicePoseArrayCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDeviceToAbsoluteTrackingPose GetDeviceToAbsoluteTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ResetSeatedZeroPose(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ResetSeatedZeroPose ResetSeatedZeroPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HmdMatrix34_t _GetSeatedZeroPoseToStandingAbsoluteTrackingPose(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetSeatedZeroPoseToStandingAbsoluteTrackingPose GetSeatedZeroPoseToStandingAbsoluteTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HmdMatrix34_t _GetRawZeroPoseToStandingAbsoluteTrackingPose(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRawZeroPoseToStandingAbsoluteTrackingPose GetRawZeroPoseToStandingAbsoluteTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetSortedTrackedDeviceIndicesOfClass(ETrackedDeviceClass eTrackedDeviceClass, [In, Out] uint[] punTrackedDeviceIndexArray, uint unTrackedDeviceIndexArrayCount, uint unRelativeToTrackedDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetSortedTrackedDeviceIndicesOfClass GetSortedTrackedDeviceIndicesOfClass; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EDeviceActivityLevel _GetTrackedDeviceActivityLevel(uint unDeviceId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTrackedDeviceActivityLevel GetTrackedDeviceActivityLevel; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ApplyTransform(ref TrackedDevicePose_t pOutputPose, ref TrackedDevicePose_t pTrackedDevicePose, ref HmdMatrix34_t pTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ApplyTransform ApplyTransform; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole unDeviceType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTrackedDeviceIndexForControllerRole GetTrackedDeviceIndexForControllerRole; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ETrackedControllerRole _GetControllerRoleForTrackedDeviceIndex(uint unDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetControllerRoleForTrackedDeviceIndex GetControllerRoleForTrackedDeviceIndex; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ETrackedDeviceClass _GetTrackedDeviceClass(uint unDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTrackedDeviceClass GetTrackedDeviceClass; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsTrackedDeviceConnected(uint unDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsTrackedDeviceConnected IsTrackedDeviceConnected; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetBoolTrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetBoolTrackedDeviceProperty GetBoolTrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate float _GetFloatTrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetFloatTrackedDeviceProperty GetFloatTrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate int _GetInt32TrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetInt32TrackedDeviceProperty GetInt32TrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _GetUint64TrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetUint64TrackedDeviceProperty GetUint64TrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HmdMatrix34_t _GetMatrix34TrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetMatrix34TrackedDeviceProperty GetMatrix34TrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetStringTrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, System.Text.StringBuilder pchValue, uint unBufferSize, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetStringTrackedDeviceProperty GetStringTrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetPropErrorNameFromEnum(ETrackedPropertyError error); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetPropErrorNameFromEnum GetPropErrorNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _PollNextEvent(ref VREvent_t pEvent, uint uncbVREvent); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PollNextEvent PollNextEvent; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _PollNextEventWithPose(ETrackingUniverseOrigin eOrigin, ref VREvent_t pEvent, uint uncbVREvent, ref TrackedDevicePose_t pTrackedDevicePose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PollNextEventWithPose PollNextEventWithPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetEventTypeNameFromEnum(EVREventType eType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetEventTypeNameFromEnum GetEventTypeNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HiddenAreaMesh_t _GetHiddenAreaMesh(EVREye eEye, EHiddenAreaMeshType type); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetHiddenAreaMesh GetHiddenAreaMesh; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetControllerState(uint unControllerDeviceIndex, ref VRControllerState_t pControllerState, uint unControllerStateSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetControllerState GetControllerState; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetControllerStateWithPose(ETrackingUniverseOrigin eOrigin, uint unControllerDeviceIndex, ref VRControllerState_t pControllerState, uint unControllerStateSize, ref TrackedDevicePose_t pTrackedDevicePose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetControllerStateWithPose GetControllerStateWithPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _TriggerHapticPulse(uint unControllerDeviceIndex, uint unAxisId, char usDurationMicroSec); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _TriggerHapticPulse TriggerHapticPulse; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetButtonIdNameFromEnum(EVRButtonId eButtonId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetButtonIdNameFromEnum GetButtonIdNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetControllerAxisTypeNameFromEnum(EVRControllerAxisType eAxisType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetControllerAxisTypeNameFromEnum GetControllerAxisTypeNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _CaptureInputFocus(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CaptureInputFocus CaptureInputFocus; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ReleaseInputFocus(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseInputFocus ReleaseInputFocus; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsInputFocusCapturedByAnotherProcess(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsInputFocusCapturedByAnotherProcess IsInputFocusCapturedByAnotherProcess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _DriverDebugRequest(uint unDeviceIndex, string pchRequest, string pchResponseBuffer, uint unResponseBufferSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _DriverDebugRequest DriverDebugRequest; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRFirmwareError _PerformFirmwareUpdate(uint unDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PerformFirmwareUpdate PerformFirmwareUpdate; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _AcknowledgeQuit_Exiting(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _AcknowledgeQuit_Exiting AcknowledgeQuit_Exiting; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _AcknowledgeQuit_UserPrompt(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _AcknowledgeQuit_UserPrompt AcknowledgeQuit_UserPrompt; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRExtendedDisplay +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetWindowBounds(ref int pnX, ref int pnY, ref uint pnWidth, ref uint pnHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWindowBounds GetWindowBounds; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetEyeOutputViewport(EVREye eEye, ref uint pnX, ref uint pnY, ref uint pnWidth, ref uint pnHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetEyeOutputViewport GetEyeOutputViewport; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetDXGIOutputInfo(ref int pnAdapterIndex, ref int pnAdapterOutputIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDXGIOutputInfo GetDXGIOutputInfo; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRTrackedCamera +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetCameraErrorNameFromEnum(EVRTrackedCameraError eCameraError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCameraErrorNameFromEnum GetCameraErrorNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _HasCamera(uint nDeviceIndex, ref bool pHasCamera); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HasCamera HasCamera; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetCameraFrameSize(uint nDeviceIndex, EVRTrackedCameraFrameType eFrameType, ref uint pnWidth, ref uint pnHeight, ref uint pnFrameBufferSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCameraFrameSize GetCameraFrameSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetCameraIntrinsics(uint nDeviceIndex, EVRTrackedCameraFrameType eFrameType, ref HmdVector2_t pFocalLength, ref HmdVector2_t pCenter); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCameraIntrinsics GetCameraIntrinsics; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetCameraProjection(uint nDeviceIndex, EVRTrackedCameraFrameType eFrameType, float flZNear, float flZFar, ref HmdMatrix44_t pProjection); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCameraProjection GetCameraProjection; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _AcquireVideoStreamingService(uint nDeviceIndex, ref ulong pHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _AcquireVideoStreamingService AcquireVideoStreamingService; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _ReleaseVideoStreamingService(ulong hTrackedCamera); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseVideoStreamingService ReleaseVideoStreamingService; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetVideoStreamFrameBuffer(ulong hTrackedCamera, EVRTrackedCameraFrameType eFrameType, IntPtr pFrameBuffer, uint nFrameBufferSize, ref CameraVideoStreamFrameHeader_t pFrameHeader, uint nFrameHeaderSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVideoStreamFrameBuffer GetVideoStreamFrameBuffer; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetVideoStreamTextureSize(uint nDeviceIndex, EVRTrackedCameraFrameType eFrameType, ref VRTextureBounds_t pTextureBounds, ref uint pnWidth, ref uint pnHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVideoStreamTextureSize GetVideoStreamTextureSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetVideoStreamTextureD3D11(ulong hTrackedCamera, EVRTrackedCameraFrameType eFrameType, IntPtr pD3D11DeviceOrResource, ref IntPtr ppD3D11ShaderResourceView, ref CameraVideoStreamFrameHeader_t pFrameHeader, uint nFrameHeaderSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVideoStreamTextureD3D11 GetVideoStreamTextureD3D11; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetVideoStreamTextureGL(ulong hTrackedCamera, EVRTrackedCameraFrameType eFrameType, ref uint pglTextureId, ref CameraVideoStreamFrameHeader_t pFrameHeader, uint nFrameHeaderSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVideoStreamTextureGL GetVideoStreamTextureGL; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _ReleaseVideoStreamTextureGL(ulong hTrackedCamera, uint glTextureId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseVideoStreamTextureGL ReleaseVideoStreamTextureGL; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRApplications +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _AddApplicationManifest(string pchApplicationManifestFullPath, bool bTemporary); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _AddApplicationManifest AddApplicationManifest; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _RemoveApplicationManifest(string pchApplicationManifestFullPath); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RemoveApplicationManifest RemoveApplicationManifest; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsApplicationInstalled(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsApplicationInstalled IsApplicationInstalled; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetApplicationCount(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationCount GetApplicationCount; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _GetApplicationKeyByIndex(uint unApplicationIndex, System.Text.StringBuilder pchAppKeyBuffer, uint unAppKeyBufferLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationKeyByIndex GetApplicationKeyByIndex; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _GetApplicationKeyByProcessId(uint unProcessId, string pchAppKeyBuffer, uint unAppKeyBufferLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationKeyByProcessId GetApplicationKeyByProcessId; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _LaunchApplication(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LaunchApplication LaunchApplication; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _LaunchTemplateApplication(string pchTemplateAppKey, string pchNewAppKey, [In, Out] AppOverrideKeys_t[] pKeys, uint unKeys); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LaunchTemplateApplication LaunchTemplateApplication; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _LaunchApplicationFromMimeType(string pchMimeType, string pchArgs); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LaunchApplicationFromMimeType LaunchApplicationFromMimeType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _LaunchDashboardOverlay(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LaunchDashboardOverlay LaunchDashboardOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _CancelApplicationLaunch(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CancelApplicationLaunch CancelApplicationLaunch; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _IdentifyApplication(uint unProcessId, string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IdentifyApplication IdentifyApplication; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetApplicationProcessId(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationProcessId GetApplicationProcessId; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetApplicationsErrorNameFromEnum(EVRApplicationError error); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationsErrorNameFromEnum GetApplicationsErrorNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetApplicationPropertyString(string pchAppKey, EVRApplicationProperty eProperty, System.Text.StringBuilder pchPropertyValueBuffer, uint unPropertyValueBufferLen, ref EVRApplicationError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationPropertyString GetApplicationPropertyString; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetApplicationPropertyBool(string pchAppKey, EVRApplicationProperty eProperty, ref EVRApplicationError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationPropertyBool GetApplicationPropertyBool; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _GetApplicationPropertyUint64(string pchAppKey, EVRApplicationProperty eProperty, ref EVRApplicationError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationPropertyUint64 GetApplicationPropertyUint64; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _SetApplicationAutoLaunch(string pchAppKey, bool bAutoLaunch); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetApplicationAutoLaunch SetApplicationAutoLaunch; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetApplicationAutoLaunch(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationAutoLaunch GetApplicationAutoLaunch; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _SetDefaultApplicationForMimeType(string pchAppKey, string pchMimeType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetDefaultApplicationForMimeType SetDefaultApplicationForMimeType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetDefaultApplicationForMimeType(string pchMimeType, string pchAppKeyBuffer, uint unAppKeyBufferLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDefaultApplicationForMimeType GetDefaultApplicationForMimeType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetApplicationSupportedMimeTypes(string pchAppKey, string pchMimeTypesBuffer, uint unMimeTypesBuffer); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationSupportedMimeTypes GetApplicationSupportedMimeTypes; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetApplicationsThatSupportMimeType(string pchMimeType, string pchAppKeysThatSupportBuffer, uint unAppKeysThatSupportBuffer); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationsThatSupportMimeType GetApplicationsThatSupportMimeType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetApplicationLaunchArguments(uint unHandle, string pchArgs, uint unArgs); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationLaunchArguments GetApplicationLaunchArguments; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _GetStartingApplication(string pchAppKeyBuffer, uint unAppKeyBufferLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetStartingApplication GetStartingApplication; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationTransitionState _GetTransitionState(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTransitionState GetTransitionState; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _PerformApplicationPrelaunchCheck(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PerformApplicationPrelaunchCheck PerformApplicationPrelaunchCheck; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetApplicationsTransitionStateNameFromEnum(EVRApplicationTransitionState state); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationsTransitionStateNameFromEnum GetApplicationsTransitionStateNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsQuitUserPromptRequested(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsQuitUserPromptRequested IsQuitUserPromptRequested; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _LaunchInternalProcess(string pchBinaryPath, string pchArguments, string pchWorkingDirectory); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LaunchInternalProcess LaunchInternalProcess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetCurrentSceneProcessId(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCurrentSceneProcessId GetCurrentSceneProcessId; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRChaperone +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ChaperoneCalibrationState _GetCalibrationState(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCalibrationState GetCalibrationState; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetPlayAreaSize(ref float pSizeX, ref float pSizeZ); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetPlayAreaSize GetPlayAreaSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetPlayAreaRect(ref HmdQuad_t rect); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetPlayAreaRect GetPlayAreaRect; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ReloadInfo(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReloadInfo ReloadInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetSceneColor(HmdColor_t color); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetSceneColor SetSceneColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetBoundsColor(ref HmdColor_t pOutputColorArray, int nNumOutputColors, float flCollisionBoundsFadeDistance, ref HmdColor_t pOutputCameraColor); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetBoundsColor GetBoundsColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _AreBoundsVisible(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _AreBoundsVisible AreBoundsVisible; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ForceBoundsVisible(bool bForce); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ForceBoundsVisible ForceBoundsVisible; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRChaperoneSetup +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _CommitWorkingCopy(EChaperoneConfigFile configFile); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CommitWorkingCopy CommitWorkingCopy; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _RevertWorkingCopy(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RevertWorkingCopy RevertWorkingCopy; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingPlayAreaSize(ref float pSizeX, ref float pSizeZ); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingPlayAreaSize GetWorkingPlayAreaSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingPlayAreaRect(ref HmdQuad_t rect); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingPlayAreaRect GetWorkingPlayAreaRect; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingCollisionBoundsInfo([In, Out] HmdQuad_t[] pQuadsBuffer, ref uint punQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingCollisionBoundsInfo GetWorkingCollisionBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetLiveCollisionBoundsInfo([In, Out] HmdQuad_t[] pQuadsBuffer, ref uint punQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLiveCollisionBoundsInfo GetLiveCollisionBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingSeatedZeroPoseToRawTrackingPose(ref HmdMatrix34_t pmatSeatedZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingSeatedZeroPoseToRawTrackingPose GetWorkingSeatedZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingStandingZeroPoseToRawTrackingPose(ref HmdMatrix34_t pmatStandingZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingStandingZeroPoseToRawTrackingPose GetWorkingStandingZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingPlayAreaSize(float sizeX, float sizeZ); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingPlayAreaSize SetWorkingPlayAreaSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingCollisionBoundsInfo([In, Out] HmdQuad_t[] pQuadsBuffer, uint unQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingCollisionBoundsInfo SetWorkingCollisionBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingSeatedZeroPoseToRawTrackingPose(ref HmdMatrix34_t pMatSeatedZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingSeatedZeroPoseToRawTrackingPose SetWorkingSeatedZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingStandingZeroPoseToRawTrackingPose(ref HmdMatrix34_t pMatStandingZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingStandingZeroPoseToRawTrackingPose SetWorkingStandingZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ReloadFromDisk(EChaperoneConfigFile configFile); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReloadFromDisk ReloadFromDisk; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetLiveSeatedZeroPoseToRawTrackingPose(ref HmdMatrix34_t pmatSeatedZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLiveSeatedZeroPoseToRawTrackingPose GetLiveSeatedZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingCollisionBoundsTagsInfo([In, Out] byte[] pTagsBuffer, uint unTagCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingCollisionBoundsTagsInfo SetWorkingCollisionBoundsTagsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetLiveCollisionBoundsTagsInfo([In, Out] byte[] pTagsBuffer, ref uint punTagCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLiveCollisionBoundsTagsInfo GetLiveCollisionBoundsTagsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _SetWorkingPhysicalBoundsInfo([In, Out] HmdQuad_t[] pQuadsBuffer, uint unQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingPhysicalBoundsInfo SetWorkingPhysicalBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetLivePhysicalBoundsInfo([In, Out] HmdQuad_t[] pQuadsBuffer, ref uint punQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLivePhysicalBoundsInfo GetLivePhysicalBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ExportLiveToBuffer(System.Text.StringBuilder pBuffer, ref uint pnBufferLength); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ExportLiveToBuffer ExportLiveToBuffer; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ImportFromBufferToWorking(string pBuffer, uint nImportFlags); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ImportFromBufferToWorking ImportFromBufferToWorking; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRCompositor +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetTrackingSpace(ETrackingUniverseOrigin eOrigin); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetTrackingSpace SetTrackingSpace; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ETrackingUniverseOrigin _GetTrackingSpace(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTrackingSpace GetTrackingSpace; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _WaitGetPoses([In, Out] TrackedDevicePose_t[] pRenderPoseArray, uint unRenderPoseArrayCount, [In, Out] TrackedDevicePose_t[] pGamePoseArray, uint unGamePoseArrayCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _WaitGetPoses WaitGetPoses; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _GetLastPoses([In, Out] TrackedDevicePose_t[] pRenderPoseArray, uint unRenderPoseArrayCount, [In, Out] TrackedDevicePose_t[] pGamePoseArray, uint unGamePoseArrayCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLastPoses GetLastPoses; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _GetLastPoseForTrackedDeviceIndex(uint unDeviceIndex, ref TrackedDevicePose_t pOutputPose, ref TrackedDevicePose_t pOutputGamePose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLastPoseForTrackedDeviceIndex GetLastPoseForTrackedDeviceIndex; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _Submit(EVREye eEye, ref Texture_t pTexture, ref VRTextureBounds_t pBounds, EVRSubmitFlags nSubmitFlags); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _Submit Submit; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ClearLastSubmittedFrame(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ClearLastSubmittedFrame ClearLastSubmittedFrame; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _PostPresentHandoff(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PostPresentHandoff PostPresentHandoff; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetFrameTiming(ref Compositor_FrameTiming pTiming, uint unFramesAgo); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetFrameTiming GetFrameTiming; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetFrameTimings(ref Compositor_FrameTiming pTiming, uint nFrames); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetFrameTimings GetFrameTimings; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate float _GetFrameTimeRemaining(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetFrameTimeRemaining GetFrameTimeRemaining; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetCumulativeStats(ref Compositor_CumulativeStats pStats, uint nStatsSizeInBytes); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCumulativeStats GetCumulativeStats; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _FadeToColor(float fSeconds, float fRed, float fGreen, float fBlue, float fAlpha, bool bBackground); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FadeToColor FadeToColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HmdColor_t _GetCurrentFadeColor(bool bBackground); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCurrentFadeColor GetCurrentFadeColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _FadeGrid(float fSeconds, bool bFadeIn); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FadeGrid FadeGrid; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate float _GetCurrentGridAlpha(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCurrentGridAlpha GetCurrentGridAlpha; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _SetSkyboxOverride([In, Out] Texture_t[] pTextures, uint unTextureCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetSkyboxOverride SetSkyboxOverride; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ClearSkyboxOverride(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ClearSkyboxOverride ClearSkyboxOverride; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _CompositorBringToFront(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CompositorBringToFront CompositorBringToFront; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _CompositorGoToBack(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CompositorGoToBack CompositorGoToBack; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _CompositorQuit(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CompositorQuit CompositorQuit; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsFullscreen(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsFullscreen IsFullscreen; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetCurrentSceneFocusProcess(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCurrentSceneFocusProcess GetCurrentSceneFocusProcess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetLastFrameRenderer(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLastFrameRenderer GetLastFrameRenderer; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _CanRenderScene(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CanRenderScene CanRenderScene; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ShowMirrorWindow(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowMirrorWindow ShowMirrorWindow; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _HideMirrorWindow(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HideMirrorWindow HideMirrorWindow; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsMirrorWindowVisible(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsMirrorWindowVisible IsMirrorWindowVisible; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _CompositorDumpImages(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CompositorDumpImages CompositorDumpImages; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ShouldAppRenderWithLowResources(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShouldAppRenderWithLowResources ShouldAppRenderWithLowResources; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ForceInterleavedReprojectionOn(bool bOverride); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ForceInterleavedReprojectionOn ForceInterleavedReprojectionOn; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ForceReconnectProcess(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ForceReconnectProcess ForceReconnectProcess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SuspendRendering(bool bSuspend); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SuspendRendering SuspendRendering; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _GetMirrorTextureD3D11(EVREye eEye, IntPtr pD3D11DeviceOrResource, ref IntPtr ppD3D11ShaderResourceView); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetMirrorTextureD3D11 GetMirrorTextureD3D11; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ReleaseMirrorTextureD3D11(IntPtr pD3D11ShaderResourceView); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseMirrorTextureD3D11 ReleaseMirrorTextureD3D11; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _GetMirrorTextureGL(EVREye eEye, ref uint pglTextureId, IntPtr pglSharedTextureHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetMirrorTextureGL GetMirrorTextureGL; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ReleaseSharedGLTexture(uint glTextureId, IntPtr glSharedTextureHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseSharedGLTexture ReleaseSharedGLTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _LockGLSharedTextureForAccess(IntPtr glSharedTextureHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LockGLSharedTextureForAccess LockGLSharedTextureForAccess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _UnlockGLSharedTextureForAccess(IntPtr glSharedTextureHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _UnlockGLSharedTextureForAccess UnlockGLSharedTextureForAccess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetVulkanInstanceExtensionsRequired(System.Text.StringBuilder pchValue, uint unBufferSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVulkanInstanceExtensionsRequired GetVulkanInstanceExtensionsRequired; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetVulkanDeviceExtensionsRequired(IntPtr pPhysicalDevice, System.Text.StringBuilder pchValue, uint unBufferSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVulkanDeviceExtensionsRequired GetVulkanDeviceExtensionsRequired; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVROverlay +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _FindOverlay(string pchOverlayKey, ref ulong pOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FindOverlay FindOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _CreateOverlay(string pchOverlayKey, string pchOverlayName, ref ulong pOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CreateOverlay CreateOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _DestroyOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _DestroyOverlay DestroyOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetHighQualityOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetHighQualityOverlay SetHighQualityOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _GetHighQualityOverlay(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetHighQualityOverlay GetHighQualityOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetOverlayKey(ulong ulOverlayHandle, System.Text.StringBuilder pchValue, uint unBufferSize, ref EVROverlayError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayKey GetOverlayKey; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetOverlayName(ulong ulOverlayHandle, System.Text.StringBuilder pchValue, uint unBufferSize, ref EVROverlayError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayName GetOverlayName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayName(ulong ulOverlayHandle, string pchName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayName SetOverlayName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayImageData(ulong ulOverlayHandle, IntPtr pvBuffer, uint unBufferSize, ref uint punWidth, ref uint punHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayImageData GetOverlayImageData; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetOverlayErrorNameFromEnum(EVROverlayError error); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayErrorNameFromEnum GetOverlayErrorNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayRenderingPid(ulong ulOverlayHandle, uint unPID); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayRenderingPid SetOverlayRenderingPid; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetOverlayRenderingPid(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayRenderingPid GetOverlayRenderingPid; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayFlag(ulong ulOverlayHandle, VROverlayFlags eOverlayFlag, bool bEnabled); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayFlag SetOverlayFlag; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayFlag(ulong ulOverlayHandle, VROverlayFlags eOverlayFlag, ref bool pbEnabled); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayFlag GetOverlayFlag; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayColor(ulong ulOverlayHandle, float fRed, float fGreen, float fBlue); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayColor SetOverlayColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayColor(ulong ulOverlayHandle, ref float pfRed, ref float pfGreen, ref float pfBlue); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayColor GetOverlayColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayAlpha(ulong ulOverlayHandle, float fAlpha); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayAlpha SetOverlayAlpha; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayAlpha(ulong ulOverlayHandle, ref float pfAlpha); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayAlpha GetOverlayAlpha; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTexelAspect(ulong ulOverlayHandle, float fTexelAspect); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTexelAspect SetOverlayTexelAspect; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTexelAspect(ulong ulOverlayHandle, ref float pfTexelAspect); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTexelAspect GetOverlayTexelAspect; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlaySortOrder(ulong ulOverlayHandle, uint unSortOrder); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlaySortOrder SetOverlaySortOrder; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlaySortOrder(ulong ulOverlayHandle, ref uint punSortOrder); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlaySortOrder GetOverlaySortOrder; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayWidthInMeters(ulong ulOverlayHandle, float fWidthInMeters); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayWidthInMeters SetOverlayWidthInMeters; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayWidthInMeters(ulong ulOverlayHandle, ref float pfWidthInMeters); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayWidthInMeters GetOverlayWidthInMeters; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayAutoCurveDistanceRangeInMeters(ulong ulOverlayHandle, float fMinDistanceInMeters, float fMaxDistanceInMeters); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayAutoCurveDistanceRangeInMeters SetOverlayAutoCurveDistanceRangeInMeters; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayAutoCurveDistanceRangeInMeters(ulong ulOverlayHandle, ref float pfMinDistanceInMeters, ref float pfMaxDistanceInMeters); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayAutoCurveDistanceRangeInMeters GetOverlayAutoCurveDistanceRangeInMeters; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTextureColorSpace(ulong ulOverlayHandle, EColorSpace eTextureColorSpace); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTextureColorSpace SetOverlayTextureColorSpace; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTextureColorSpace(ulong ulOverlayHandle, ref EColorSpace peTextureColorSpace); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTextureColorSpace GetOverlayTextureColorSpace; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTextureBounds(ulong ulOverlayHandle, ref VRTextureBounds_t pOverlayTextureBounds); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTextureBounds SetOverlayTextureBounds; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTextureBounds(ulong ulOverlayHandle, ref VRTextureBounds_t pOverlayTextureBounds); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTextureBounds GetOverlayTextureBounds; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetOverlayRenderModel(ulong ulOverlayHandle, string pchValue, uint unBufferSize, ref HmdColor_t pColor, ref EVROverlayError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayRenderModel GetOverlayRenderModel; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayRenderModel(ulong ulOverlayHandle, string pchRenderModel, ref HmdColor_t pColor); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayRenderModel SetOverlayRenderModel; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTransformType(ulong ulOverlayHandle, ref VROverlayTransformType peTransformType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTransformType GetOverlayTransformType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTransformAbsolute(ulong ulOverlayHandle, ETrackingUniverseOrigin eTrackingOrigin, ref HmdMatrix34_t pmatTrackingOriginToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTransformAbsolute SetOverlayTransformAbsolute; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTransformAbsolute(ulong ulOverlayHandle, ref ETrackingUniverseOrigin peTrackingOrigin, ref HmdMatrix34_t pmatTrackingOriginToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTransformAbsolute GetOverlayTransformAbsolute; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTransformTrackedDeviceRelative(ulong ulOverlayHandle, uint unTrackedDevice, ref HmdMatrix34_t pmatTrackedDeviceToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTransformTrackedDeviceRelative SetOverlayTransformTrackedDeviceRelative; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTransformTrackedDeviceRelative(ulong ulOverlayHandle, ref uint punTrackedDevice, ref HmdMatrix34_t pmatTrackedDeviceToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTransformTrackedDeviceRelative GetOverlayTransformTrackedDeviceRelative; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTransformTrackedDeviceComponent(ulong ulOverlayHandle, uint unDeviceIndex, string pchComponentName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTransformTrackedDeviceComponent SetOverlayTransformTrackedDeviceComponent; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTransformTrackedDeviceComponent(ulong ulOverlayHandle, ref uint punDeviceIndex, string pchComponentName, uint unComponentNameSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTransformTrackedDeviceComponent GetOverlayTransformTrackedDeviceComponent; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTransformOverlayRelative(ulong ulOverlayHandle, ref ulong ulOverlayHandleParent, ref HmdMatrix34_t pmatParentOverlayToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTransformOverlayRelative GetOverlayTransformOverlayRelative; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTransformOverlayRelative(ulong ulOverlayHandle, ulong ulOverlayHandleParent, ref HmdMatrix34_t pmatParentOverlayToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTransformOverlayRelative SetOverlayTransformOverlayRelative; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _ShowOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowOverlay ShowOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _HideOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HideOverlay HideOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsOverlayVisible(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsOverlayVisible IsOverlayVisible; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetTransformForOverlayCoordinates(ulong ulOverlayHandle, ETrackingUniverseOrigin eTrackingOrigin, HmdVector2_t coordinatesInOverlay, ref HmdMatrix34_t pmatTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTransformForOverlayCoordinates GetTransformForOverlayCoordinates; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _PollNextOverlayEvent(ulong ulOverlayHandle, ref VREvent_t pEvent, uint uncbVREvent); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PollNextOverlayEvent PollNextOverlayEvent; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayInputMethod(ulong ulOverlayHandle, ref VROverlayInputMethod peInputMethod); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayInputMethod GetOverlayInputMethod; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayInputMethod(ulong ulOverlayHandle, VROverlayInputMethod eInputMethod); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayInputMethod SetOverlayInputMethod; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayMouseScale(ulong ulOverlayHandle, ref HmdVector2_t pvecMouseScale); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayMouseScale GetOverlayMouseScale; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayMouseScale(ulong ulOverlayHandle, ref HmdVector2_t pvecMouseScale); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayMouseScale SetOverlayMouseScale; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ComputeOverlayIntersection(ulong ulOverlayHandle, ref VROverlayIntersectionParams_t pParams, ref VROverlayIntersectionResults_t pResults); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ComputeOverlayIntersection ComputeOverlayIntersection; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _HandleControllerOverlayInteractionAsMouse(ulong ulOverlayHandle, uint unControllerDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HandleControllerOverlayInteractionAsMouse HandleControllerOverlayInteractionAsMouse; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsHoverTargetOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsHoverTargetOverlay IsHoverTargetOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _GetGamepadFocusOverlay(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetGamepadFocusOverlay GetGamepadFocusOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetGamepadFocusOverlay(ulong ulNewFocusOverlay); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetGamepadFocusOverlay SetGamepadFocusOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayNeighbor(EOverlayDirection eDirection, ulong ulFrom, ulong ulTo); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayNeighbor SetOverlayNeighbor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _MoveGamepadFocusToNeighbor(EOverlayDirection eDirection, ulong ulFrom); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _MoveGamepadFocusToNeighbor MoveGamepadFocusToNeighbor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTexture(ulong ulOverlayHandle, ref Texture_t pTexture); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTexture SetOverlayTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _ClearOverlayTexture(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ClearOverlayTexture ClearOverlayTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayRaw(ulong ulOverlayHandle, IntPtr pvBuffer, uint unWidth, uint unHeight, uint unDepth); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayRaw SetOverlayRaw; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayFromFile(ulong ulOverlayHandle, string pchFilePath); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayFromFile SetOverlayFromFile; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTexture(ulong ulOverlayHandle, ref IntPtr pNativeTextureHandle, IntPtr pNativeTextureRef, ref uint pWidth, ref uint pHeight, ref uint pNativeFormat, ref ETextureType pAPIType, ref EColorSpace pColorSpace, ref VRTextureBounds_t pTextureBounds); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTexture GetOverlayTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _ReleaseNativeOverlayHandle(ulong ulOverlayHandle, IntPtr pNativeTextureHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseNativeOverlayHandle ReleaseNativeOverlayHandle; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTextureSize(ulong ulOverlayHandle, ref uint pWidth, ref uint pHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTextureSize GetOverlayTextureSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _CreateDashboardOverlay(string pchOverlayKey, string pchOverlayFriendlyName, ref ulong pMainHandle, ref ulong pThumbnailHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CreateDashboardOverlay CreateDashboardOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsDashboardVisible(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsDashboardVisible IsDashboardVisible; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsActiveDashboardOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsActiveDashboardOverlay IsActiveDashboardOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetDashboardOverlaySceneProcess(ulong ulOverlayHandle, uint unProcessId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetDashboardOverlaySceneProcess SetDashboardOverlaySceneProcess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetDashboardOverlaySceneProcess(ulong ulOverlayHandle, ref uint punProcessId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDashboardOverlaySceneProcess GetDashboardOverlaySceneProcess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ShowDashboard(string pchOverlayToShow); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowDashboard ShowDashboard; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetPrimaryDashboardDevice(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetPrimaryDashboardDevice GetPrimaryDashboardDevice; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _ShowKeyboard(int eInputMode, int eLineInputMode, string pchDescription, uint unCharMax, string pchExistingText, bool bUseMinimalMode, ulong uUserValue); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowKeyboard ShowKeyboard; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _ShowKeyboardForOverlay(ulong ulOverlayHandle, int eInputMode, int eLineInputMode, string pchDescription, uint unCharMax, string pchExistingText, bool bUseMinimalMode, ulong uUserValue); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowKeyboardForOverlay ShowKeyboardForOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetKeyboardText(System.Text.StringBuilder pchText, uint cchText); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetKeyboardText GetKeyboardText; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _HideKeyboard(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HideKeyboard HideKeyboard; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetKeyboardTransformAbsolute(ETrackingUniverseOrigin eTrackingOrigin, ref HmdMatrix34_t pmatTrackingOriginToKeyboardTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetKeyboardTransformAbsolute SetKeyboardTransformAbsolute; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetKeyboardPositionForOverlay(ulong ulOverlayHandle, HmdRect2_t avoidRect); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetKeyboardPositionForOverlay SetKeyboardPositionForOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayIntersectionMask(ulong ulOverlayHandle, ref VROverlayIntersectionMaskPrimitive_t pMaskPrimitives, uint unNumMaskPrimitives, uint unPrimitiveSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayIntersectionMask SetOverlayIntersectionMask; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayFlags(ulong ulOverlayHandle, ref uint pFlags); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayFlags GetOverlayFlags; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate VRMessageOverlayResponse _ShowMessageOverlay(string pchText, string pchCaption, string pchButton0Text, string pchButton1Text, string pchButton2Text, string pchButton3Text); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowMessageOverlay ShowMessageOverlay; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRRenderModels +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRRenderModelError _LoadRenderModel_Async(string pchRenderModelName, ref IntPtr ppRenderModel); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LoadRenderModel_Async LoadRenderModel_Async; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _FreeRenderModel(IntPtr pRenderModel); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FreeRenderModel FreeRenderModel; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRRenderModelError _LoadTexture_Async(int textureId, ref IntPtr ppTexture); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LoadTexture_Async LoadTexture_Async; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _FreeTexture(IntPtr pTexture); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FreeTexture FreeTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRRenderModelError _LoadTextureD3D11_Async(int textureId, IntPtr pD3D11Device, ref IntPtr ppD3D11Texture2D); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LoadTextureD3D11_Async LoadTextureD3D11_Async; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRRenderModelError _LoadIntoTextureD3D11_Async(int textureId, IntPtr pDstTexture); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LoadIntoTextureD3D11_Async LoadIntoTextureD3D11_Async; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _FreeTextureD3D11(IntPtr pD3D11Texture2D); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FreeTextureD3D11 FreeTextureD3D11; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetRenderModelName(uint unRenderModelIndex, System.Text.StringBuilder pchRenderModelName, uint unRenderModelNameLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelName GetRenderModelName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetRenderModelCount(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelCount GetRenderModelCount; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetComponentCount(string pchRenderModelName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentCount GetComponentCount; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetComponentName(string pchRenderModelName, uint unComponentIndex, System.Text.StringBuilder pchComponentName, uint unComponentNameLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentName GetComponentName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _GetComponentButtonMask(string pchRenderModelName, string pchComponentName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentButtonMask GetComponentButtonMask; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetComponentRenderModelName(string pchRenderModelName, string pchComponentName, System.Text.StringBuilder pchComponentRenderModelName, uint unComponentRenderModelNameLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentRenderModelName GetComponentRenderModelName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetComponentState(string pchRenderModelName, string pchComponentName, ref VRControllerState_t pControllerState, ref RenderModel_ControllerMode_State_t pState, ref RenderModel_ComponentState_t pComponentState); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentState GetComponentState; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _RenderModelHasComponent(string pchRenderModelName, string pchComponentName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RenderModelHasComponent RenderModelHasComponent; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetRenderModelThumbnailURL(string pchRenderModelName, System.Text.StringBuilder pchThumbnailURL, uint unThumbnailURLLen, ref EVRRenderModelError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelThumbnailURL GetRenderModelThumbnailURL; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetRenderModelOriginalPath(string pchRenderModelName, System.Text.StringBuilder pchOriginalPath, uint unOriginalPathLen, ref EVRRenderModelError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelOriginalPath GetRenderModelOriginalPath; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetRenderModelErrorNameFromEnum(EVRRenderModelError error); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelErrorNameFromEnum GetRenderModelErrorNameFromEnum; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRNotifications +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRNotificationError _CreateNotification(ulong ulOverlayHandle, ulong ulUserValue, EVRNotificationType type, string pchText, EVRNotificationStyle style, ref NotificationBitmap_t pImage, ref uint pNotificationId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CreateNotification CreateNotification; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRNotificationError _RemoveNotification(uint notificationId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RemoveNotification RemoveNotification; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRSettings +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetSettingsErrorNameFromEnum(EVRSettingsError eError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetSettingsErrorNameFromEnum GetSettingsErrorNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _Sync(bool bForce, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _Sync Sync; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetBool(string pchSection, string pchSettingsKey, bool bValue, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetBool SetBool; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetInt32(string pchSection, string pchSettingsKey, int nValue, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetInt32 SetInt32; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetFloat(string pchSection, string pchSettingsKey, float flValue, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetFloat SetFloat; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetString(string pchSection, string pchSettingsKey, string pchValue, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetString SetString; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetBool(string pchSection, string pchSettingsKey, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetBool GetBool; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate int _GetInt32(string pchSection, string pchSettingsKey, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetInt32 GetInt32; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate float _GetFloat(string pchSection, string pchSettingsKey, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetFloat GetFloat; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetString(string pchSection, string pchSettingsKey, System.Text.StringBuilder pchValue, uint unValueLen, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetString GetString; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _RemoveSection(string pchSection, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RemoveSection RemoveSection; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _RemoveKeyInSection(string pchSection, string pchSettingsKey, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RemoveKeyInSection RemoveKeyInSection; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRScreenshots +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRScreenshotError _RequestScreenshot(ref uint pOutScreenshotHandle, EVRScreenshotType type, string pchPreviewFilename, string pchVRFilename); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RequestScreenshot RequestScreenshot; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRScreenshotError _HookScreenshot([In, Out] EVRScreenshotType[] pSupportedTypes, int numTypes); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HookScreenshot HookScreenshot; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRScreenshotType _GetScreenshotPropertyType(uint screenshotHandle, ref EVRScreenshotError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetScreenshotPropertyType GetScreenshotPropertyType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetScreenshotPropertyFilename(uint screenshotHandle, EVRScreenshotPropertyFilenames filenameType, System.Text.StringBuilder pchFilename, uint cchFilename, ref EVRScreenshotError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetScreenshotPropertyFilename GetScreenshotPropertyFilename; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRScreenshotError _UpdateScreenshotProgress(uint screenshotHandle, float flProgress); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _UpdateScreenshotProgress UpdateScreenshotProgress; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRScreenshotError _TakeStereoScreenshot(ref uint pOutScreenshotHandle, string pchPreviewFilename, string pchVRFilename); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _TakeStereoScreenshot TakeStereoScreenshot; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRScreenshotError _SubmitScreenshot(uint screenshotHandle, EVRScreenshotType type, string pchSourcePreviewFilename, string pchSourceVRFilename); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SubmitScreenshot SubmitScreenshot; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRResources +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _LoadSharedResource(string pchResourceName, string pchBuffer, uint unBufferLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LoadSharedResource LoadSharedResource; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetResourceFullPath(string pchResourceName, string pchResourceTypeDirectory, string pchPathBuffer, uint unBufferLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetResourceFullPath GetResourceFullPath; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRDriverManager +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetDriverCount(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDriverCount GetDriverCount; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetDriverName(uint nDriver, System.Text.StringBuilder pchValue, uint unBufferSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDriverName GetDriverName; + +} + + +public class CVRSystem +{ + IVRSystem FnTable; + internal CVRSystem(IntPtr pInterface) + { + FnTable = (IVRSystem)Marshal.PtrToStructure(pInterface, typeof(IVRSystem)); + } + public void GetRecommendedRenderTargetSize(ref uint pnWidth,ref uint pnHeight) + { + pnWidth = 0; + pnHeight = 0; + FnTable.GetRecommendedRenderTargetSize(ref pnWidth,ref pnHeight); + } + public HmdMatrix44_t GetProjectionMatrix(EVREye eEye,float fNearZ,float fFarZ) + { + HmdMatrix44_t result = FnTable.GetProjectionMatrix(eEye,fNearZ,fFarZ); + return result; + } + public void GetProjectionRaw(EVREye eEye,ref float pfLeft,ref float pfRight,ref float pfTop,ref float pfBottom) + { + pfLeft = 0; + pfRight = 0; + pfTop = 0; + pfBottom = 0; + FnTable.GetProjectionRaw(eEye,ref pfLeft,ref pfRight,ref pfTop,ref pfBottom); + } + public bool ComputeDistortion(EVREye eEye,float fU,float fV,ref DistortionCoordinates_t pDistortionCoordinates) + { + bool result = FnTable.ComputeDistortion(eEye,fU,fV,ref pDistortionCoordinates); + return result; + } + public HmdMatrix34_t GetEyeToHeadTransform(EVREye eEye) + { + HmdMatrix34_t result = FnTable.GetEyeToHeadTransform(eEye); + return result; + } + public bool GetTimeSinceLastVsync(ref float pfSecondsSinceLastVsync,ref ulong pulFrameCounter) + { + pfSecondsSinceLastVsync = 0; + pulFrameCounter = 0; + bool result = FnTable.GetTimeSinceLastVsync(ref pfSecondsSinceLastVsync,ref pulFrameCounter); + return result; + } + public int GetD3D9AdapterIndex() + { + int result = FnTable.GetD3D9AdapterIndex(); + return result; + } + public void GetDXGIOutputInfo(ref int pnAdapterIndex) + { + pnAdapterIndex = 0; + FnTable.GetDXGIOutputInfo(ref pnAdapterIndex); + } + public void GetOutputDevice(ref ulong pnDevice,ETextureType textureType) + { + pnDevice = 0; + FnTable.GetOutputDevice(ref pnDevice,textureType); + } + public bool IsDisplayOnDesktop() + { + bool result = FnTable.IsDisplayOnDesktop(); + return result; + } + public bool SetDisplayVisibility(bool bIsVisibleOnDesktop) + { + bool result = FnTable.SetDisplayVisibility(bIsVisibleOnDesktop); + return result; + } + public void GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin eOrigin,float fPredictedSecondsToPhotonsFromNow,TrackedDevicePose_t [] pTrackedDevicePoseArray) + { + FnTable.GetDeviceToAbsoluteTrackingPose(eOrigin,fPredictedSecondsToPhotonsFromNow,pTrackedDevicePoseArray,(uint) pTrackedDevicePoseArray.Length); + } + public void ResetSeatedZeroPose() + { + FnTable.ResetSeatedZeroPose(); + } + public HmdMatrix34_t GetSeatedZeroPoseToStandingAbsoluteTrackingPose() + { + HmdMatrix34_t result = FnTable.GetSeatedZeroPoseToStandingAbsoluteTrackingPose(); + return result; + } + public HmdMatrix34_t GetRawZeroPoseToStandingAbsoluteTrackingPose() + { + HmdMatrix34_t result = FnTable.GetRawZeroPoseToStandingAbsoluteTrackingPose(); + return result; + } + public uint GetSortedTrackedDeviceIndicesOfClass(ETrackedDeviceClass eTrackedDeviceClass,uint [] punTrackedDeviceIndexArray,uint unRelativeToTrackedDeviceIndex) + { + uint result = FnTable.GetSortedTrackedDeviceIndicesOfClass(eTrackedDeviceClass,punTrackedDeviceIndexArray,(uint) punTrackedDeviceIndexArray.Length,unRelativeToTrackedDeviceIndex); + return result; + } + public EDeviceActivityLevel GetTrackedDeviceActivityLevel(uint unDeviceId) + { + EDeviceActivityLevel result = FnTable.GetTrackedDeviceActivityLevel(unDeviceId); + return result; + } + public void ApplyTransform(ref TrackedDevicePose_t pOutputPose,ref TrackedDevicePose_t pTrackedDevicePose,ref HmdMatrix34_t pTransform) + { + FnTable.ApplyTransform(ref pOutputPose,ref pTrackedDevicePose,ref pTransform); + } + public uint GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole unDeviceType) + { + uint result = FnTable.GetTrackedDeviceIndexForControllerRole(unDeviceType); + return result; + } + public ETrackedControllerRole GetControllerRoleForTrackedDeviceIndex(uint unDeviceIndex) + { + ETrackedControllerRole result = FnTable.GetControllerRoleForTrackedDeviceIndex(unDeviceIndex); + return result; + } + public ETrackedDeviceClass GetTrackedDeviceClass(uint unDeviceIndex) + { + ETrackedDeviceClass result = FnTable.GetTrackedDeviceClass(unDeviceIndex); + return result; + } + public bool IsTrackedDeviceConnected(uint unDeviceIndex) + { + bool result = FnTable.IsTrackedDeviceConnected(unDeviceIndex); + return result; + } + public bool GetBoolTrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,ref ETrackedPropertyError pError) + { + bool result = FnTable.GetBoolTrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public float GetFloatTrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,ref ETrackedPropertyError pError) + { + float result = FnTable.GetFloatTrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public int GetInt32TrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,ref ETrackedPropertyError pError) + { + int result = FnTable.GetInt32TrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public ulong GetUint64TrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,ref ETrackedPropertyError pError) + { + ulong result = FnTable.GetUint64TrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public HmdMatrix34_t GetMatrix34TrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,ref ETrackedPropertyError pError) + { + HmdMatrix34_t result = FnTable.GetMatrix34TrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public uint GetStringTrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,System.Text.StringBuilder pchValue,uint unBufferSize,ref ETrackedPropertyError pError) + { + uint result = FnTable.GetStringTrackedDeviceProperty(unDeviceIndex,prop,pchValue,unBufferSize,ref pError); + return result; + } + public string GetPropErrorNameFromEnum(ETrackedPropertyError error) + { + IntPtr result = FnTable.GetPropErrorNameFromEnum(error); + return Marshal.PtrToStringAnsi(result); + } +// This is a terrible hack to workaround the fact that VRControllerState_t and VREvent_t were +// originally mis-compiled with the wrong packing for Linux and OSX. + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _PollNextEventPacked(ref VREvent_t_Packed pEvent,uint uncbVREvent); + [StructLayout(LayoutKind.Explicit)] + struct PollNextEventUnion + { + [FieldOffset(0)] + public IVRSystem._PollNextEvent pPollNextEvent; + [FieldOffset(0)] + public _PollNextEventPacked pPollNextEventPacked; + } + public bool PollNextEvent(ref VREvent_t pEvent,uint uncbVREvent) + { + if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || + (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) + { + PollNextEventUnion u; + VREvent_t_Packed event_packed = new VREvent_t_Packed(); + u.pPollNextEventPacked = null; + u.pPollNextEvent = FnTable.PollNextEvent; + bool packed_result = u.pPollNextEventPacked(ref event_packed,(uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VREvent_t_Packed))); + + event_packed.Unpack(ref pEvent); + return packed_result; + } + bool result = FnTable.PollNextEvent(ref pEvent,uncbVREvent); + return result; + } + public bool PollNextEventWithPose(ETrackingUniverseOrigin eOrigin,ref VREvent_t pEvent,uint uncbVREvent,ref TrackedDevicePose_t pTrackedDevicePose) + { + bool result = FnTable.PollNextEventWithPose(eOrigin,ref pEvent,uncbVREvent,ref pTrackedDevicePose); + return result; + } + public string GetEventTypeNameFromEnum(EVREventType eType) + { + IntPtr result = FnTable.GetEventTypeNameFromEnum(eType); + return Marshal.PtrToStringAnsi(result); + } + public HiddenAreaMesh_t GetHiddenAreaMesh(EVREye eEye,EHiddenAreaMeshType type) + { + HiddenAreaMesh_t result = FnTable.GetHiddenAreaMesh(eEye,type); + return result; + } +// This is a terrible hack to workaround the fact that VRControllerState_t and VREvent_t were +// originally mis-compiled with the wrong packing for Linux and OSX. + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetControllerStatePacked(uint unControllerDeviceIndex,ref VRControllerState_t_Packed pControllerState,uint unControllerStateSize); + [StructLayout(LayoutKind.Explicit)] + struct GetControllerStateUnion + { + [FieldOffset(0)] + public IVRSystem._GetControllerState pGetControllerState; + [FieldOffset(0)] + public _GetControllerStatePacked pGetControllerStatePacked; + } + public bool GetControllerState(uint unControllerDeviceIndex,ref VRControllerState_t pControllerState,uint unControllerStateSize) + { + if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || + (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) + { + GetControllerStateUnion u; + VRControllerState_t_Packed state_packed = new VRControllerState_t_Packed(pControllerState); + u.pGetControllerStatePacked = null; + u.pGetControllerState = FnTable.GetControllerState; + bool packed_result = u.pGetControllerStatePacked(unControllerDeviceIndex,ref state_packed,(uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VRControllerState_t_Packed))); + + state_packed.Unpack(ref pControllerState); + return packed_result; + } + bool result = FnTable.GetControllerState(unControllerDeviceIndex,ref pControllerState,unControllerStateSize); + return result; + } +// This is a terrible hack to workaround the fact that VRControllerState_t and VREvent_t were +// originally mis-compiled with the wrong packing for Linux and OSX. + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetControllerStateWithPosePacked(ETrackingUniverseOrigin eOrigin,uint unControllerDeviceIndex,ref VRControllerState_t_Packed pControllerState,uint unControllerStateSize,ref TrackedDevicePose_t pTrackedDevicePose); + [StructLayout(LayoutKind.Explicit)] + struct GetControllerStateWithPoseUnion + { + [FieldOffset(0)] + public IVRSystem._GetControllerStateWithPose pGetControllerStateWithPose; + [FieldOffset(0)] + public _GetControllerStateWithPosePacked pGetControllerStateWithPosePacked; + } + public bool GetControllerStateWithPose(ETrackingUniverseOrigin eOrigin,uint unControllerDeviceIndex,ref VRControllerState_t pControllerState,uint unControllerStateSize,ref TrackedDevicePose_t pTrackedDevicePose) + { + if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || + (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) + { + GetControllerStateWithPoseUnion u; + VRControllerState_t_Packed state_packed = new VRControllerState_t_Packed(pControllerState); + u.pGetControllerStateWithPosePacked = null; + u.pGetControllerStateWithPose = FnTable.GetControllerStateWithPose; + bool packed_result = u.pGetControllerStateWithPosePacked(eOrigin,unControllerDeviceIndex,ref state_packed,(uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VRControllerState_t_Packed)),ref pTrackedDevicePose); + + state_packed.Unpack(ref pControllerState); + return packed_result; + } + bool result = FnTable.GetControllerStateWithPose(eOrigin,unControllerDeviceIndex,ref pControllerState,unControllerStateSize,ref pTrackedDevicePose); + return result; + } + public void TriggerHapticPulse(uint unControllerDeviceIndex,uint unAxisId,char usDurationMicroSec) + { + FnTable.TriggerHapticPulse(unControllerDeviceIndex,unAxisId,usDurationMicroSec); + } + public string GetButtonIdNameFromEnum(EVRButtonId eButtonId) + { + IntPtr result = FnTable.GetButtonIdNameFromEnum(eButtonId); + return Marshal.PtrToStringAnsi(result); + } + public string GetControllerAxisTypeNameFromEnum(EVRControllerAxisType eAxisType) + { + IntPtr result = FnTable.GetControllerAxisTypeNameFromEnum(eAxisType); + return Marshal.PtrToStringAnsi(result); + } + public bool CaptureInputFocus() + { + bool result = FnTable.CaptureInputFocus(); + return result; + } + public void ReleaseInputFocus() + { + FnTable.ReleaseInputFocus(); + } + public bool IsInputFocusCapturedByAnotherProcess() + { + bool result = FnTable.IsInputFocusCapturedByAnotherProcess(); + return result; + } + public uint DriverDebugRequest(uint unDeviceIndex,string pchRequest,string pchResponseBuffer,uint unResponseBufferSize) + { + uint result = FnTable.DriverDebugRequest(unDeviceIndex,pchRequest,pchResponseBuffer,unResponseBufferSize); + return result; + } + public EVRFirmwareError PerformFirmwareUpdate(uint unDeviceIndex) + { + EVRFirmwareError result = FnTable.PerformFirmwareUpdate(unDeviceIndex); + return result; + } + public void AcknowledgeQuit_Exiting() + { + FnTable.AcknowledgeQuit_Exiting(); + } + public void AcknowledgeQuit_UserPrompt() + { + FnTable.AcknowledgeQuit_UserPrompt(); + } +} + + +public class CVRExtendedDisplay +{ + IVRExtendedDisplay FnTable; + internal CVRExtendedDisplay(IntPtr pInterface) + { + FnTable = (IVRExtendedDisplay)Marshal.PtrToStructure(pInterface, typeof(IVRExtendedDisplay)); + } + public void GetWindowBounds(ref int pnX,ref int pnY,ref uint pnWidth,ref uint pnHeight) + { + pnX = 0; + pnY = 0; + pnWidth = 0; + pnHeight = 0; + FnTable.GetWindowBounds(ref pnX,ref pnY,ref pnWidth,ref pnHeight); + } + public void GetEyeOutputViewport(EVREye eEye,ref uint pnX,ref uint pnY,ref uint pnWidth,ref uint pnHeight) + { + pnX = 0; + pnY = 0; + pnWidth = 0; + pnHeight = 0; + FnTable.GetEyeOutputViewport(eEye,ref pnX,ref pnY,ref pnWidth,ref pnHeight); + } + public void GetDXGIOutputInfo(ref int pnAdapterIndex,ref int pnAdapterOutputIndex) + { + pnAdapterIndex = 0; + pnAdapterOutputIndex = 0; + FnTable.GetDXGIOutputInfo(ref pnAdapterIndex,ref pnAdapterOutputIndex); + } +} + + +public class CVRTrackedCamera +{ + IVRTrackedCamera FnTable; + internal CVRTrackedCamera(IntPtr pInterface) + { + FnTable = (IVRTrackedCamera)Marshal.PtrToStructure(pInterface, typeof(IVRTrackedCamera)); + } + public string GetCameraErrorNameFromEnum(EVRTrackedCameraError eCameraError) + { + IntPtr result = FnTable.GetCameraErrorNameFromEnum(eCameraError); + return Marshal.PtrToStringAnsi(result); + } + public EVRTrackedCameraError HasCamera(uint nDeviceIndex,ref bool pHasCamera) + { + pHasCamera = false; + EVRTrackedCameraError result = FnTable.HasCamera(nDeviceIndex,ref pHasCamera); + return result; + } + public EVRTrackedCameraError GetCameraFrameSize(uint nDeviceIndex,EVRTrackedCameraFrameType eFrameType,ref uint pnWidth,ref uint pnHeight,ref uint pnFrameBufferSize) + { + pnWidth = 0; + pnHeight = 0; + pnFrameBufferSize = 0; + EVRTrackedCameraError result = FnTable.GetCameraFrameSize(nDeviceIndex,eFrameType,ref pnWidth,ref pnHeight,ref pnFrameBufferSize); + return result; + } + public EVRTrackedCameraError GetCameraIntrinsics(uint nDeviceIndex,EVRTrackedCameraFrameType eFrameType,ref HmdVector2_t pFocalLength,ref HmdVector2_t pCenter) + { + EVRTrackedCameraError result = FnTable.GetCameraIntrinsics(nDeviceIndex,eFrameType,ref pFocalLength,ref pCenter); + return result; + } + public EVRTrackedCameraError GetCameraProjection(uint nDeviceIndex,EVRTrackedCameraFrameType eFrameType,float flZNear,float flZFar,ref HmdMatrix44_t pProjection) + { + EVRTrackedCameraError result = FnTable.GetCameraProjection(nDeviceIndex,eFrameType,flZNear,flZFar,ref pProjection); + return result; + } + public EVRTrackedCameraError AcquireVideoStreamingService(uint nDeviceIndex,ref ulong pHandle) + { + pHandle = 0; + EVRTrackedCameraError result = FnTable.AcquireVideoStreamingService(nDeviceIndex,ref pHandle); + return result; + } + public EVRTrackedCameraError ReleaseVideoStreamingService(ulong hTrackedCamera) + { + EVRTrackedCameraError result = FnTable.ReleaseVideoStreamingService(hTrackedCamera); + return result; + } + public EVRTrackedCameraError GetVideoStreamFrameBuffer(ulong hTrackedCamera,EVRTrackedCameraFrameType eFrameType,IntPtr pFrameBuffer,uint nFrameBufferSize,ref CameraVideoStreamFrameHeader_t pFrameHeader,uint nFrameHeaderSize) + { + EVRTrackedCameraError result = FnTable.GetVideoStreamFrameBuffer(hTrackedCamera,eFrameType,pFrameBuffer,nFrameBufferSize,ref pFrameHeader,nFrameHeaderSize); + return result; + } + public EVRTrackedCameraError GetVideoStreamTextureSize(uint nDeviceIndex,EVRTrackedCameraFrameType eFrameType,ref VRTextureBounds_t pTextureBounds,ref uint pnWidth,ref uint pnHeight) + { + pnWidth = 0; + pnHeight = 0; + EVRTrackedCameraError result = FnTable.GetVideoStreamTextureSize(nDeviceIndex,eFrameType,ref pTextureBounds,ref pnWidth,ref pnHeight); + return result; + } + public EVRTrackedCameraError GetVideoStreamTextureD3D11(ulong hTrackedCamera,EVRTrackedCameraFrameType eFrameType,IntPtr pD3D11DeviceOrResource,ref IntPtr ppD3D11ShaderResourceView,ref CameraVideoStreamFrameHeader_t pFrameHeader,uint nFrameHeaderSize) + { + EVRTrackedCameraError result = FnTable.GetVideoStreamTextureD3D11(hTrackedCamera,eFrameType,pD3D11DeviceOrResource,ref ppD3D11ShaderResourceView,ref pFrameHeader,nFrameHeaderSize); + return result; + } + public EVRTrackedCameraError GetVideoStreamTextureGL(ulong hTrackedCamera,EVRTrackedCameraFrameType eFrameType,ref uint pglTextureId,ref CameraVideoStreamFrameHeader_t pFrameHeader,uint nFrameHeaderSize) + { + pglTextureId = 0; + EVRTrackedCameraError result = FnTable.GetVideoStreamTextureGL(hTrackedCamera,eFrameType,ref pglTextureId,ref pFrameHeader,nFrameHeaderSize); + return result; + } + public EVRTrackedCameraError ReleaseVideoStreamTextureGL(ulong hTrackedCamera,uint glTextureId) + { + EVRTrackedCameraError result = FnTable.ReleaseVideoStreamTextureGL(hTrackedCamera,glTextureId); + return result; + } +} + + +public class CVRApplications +{ + IVRApplications FnTable; + internal CVRApplications(IntPtr pInterface) + { + FnTable = (IVRApplications)Marshal.PtrToStructure(pInterface, typeof(IVRApplications)); + } + public EVRApplicationError AddApplicationManifest(string pchApplicationManifestFullPath,bool bTemporary) + { + EVRApplicationError result = FnTable.AddApplicationManifest(pchApplicationManifestFullPath,bTemporary); + return result; + } + public EVRApplicationError RemoveApplicationManifest(string pchApplicationManifestFullPath) + { + EVRApplicationError result = FnTable.RemoveApplicationManifest(pchApplicationManifestFullPath); + return result; + } + public bool IsApplicationInstalled(string pchAppKey) + { + bool result = FnTable.IsApplicationInstalled(pchAppKey); + return result; + } + public uint GetApplicationCount() + { + uint result = FnTable.GetApplicationCount(); + return result; + } + public EVRApplicationError GetApplicationKeyByIndex(uint unApplicationIndex,System.Text.StringBuilder pchAppKeyBuffer,uint unAppKeyBufferLen) + { + EVRApplicationError result = FnTable.GetApplicationKeyByIndex(unApplicationIndex,pchAppKeyBuffer,unAppKeyBufferLen); + return result; + } + public EVRApplicationError GetApplicationKeyByProcessId(uint unProcessId,string pchAppKeyBuffer,uint unAppKeyBufferLen) + { + EVRApplicationError result = FnTable.GetApplicationKeyByProcessId(unProcessId,pchAppKeyBuffer,unAppKeyBufferLen); + return result; + } + public EVRApplicationError LaunchApplication(string pchAppKey) + { + EVRApplicationError result = FnTable.LaunchApplication(pchAppKey); + return result; + } + public EVRApplicationError LaunchTemplateApplication(string pchTemplateAppKey,string pchNewAppKey,AppOverrideKeys_t [] pKeys) + { + EVRApplicationError result = FnTable.LaunchTemplateApplication(pchTemplateAppKey,pchNewAppKey,pKeys,(uint) pKeys.Length); + return result; + } + public EVRApplicationError LaunchApplicationFromMimeType(string pchMimeType,string pchArgs) + { + EVRApplicationError result = FnTable.LaunchApplicationFromMimeType(pchMimeType,pchArgs); + return result; + } + public EVRApplicationError LaunchDashboardOverlay(string pchAppKey) + { + EVRApplicationError result = FnTable.LaunchDashboardOverlay(pchAppKey); + return result; + } + public bool CancelApplicationLaunch(string pchAppKey) + { + bool result = FnTable.CancelApplicationLaunch(pchAppKey); + return result; + } + public EVRApplicationError IdentifyApplication(uint unProcessId,string pchAppKey) + { + EVRApplicationError result = FnTable.IdentifyApplication(unProcessId,pchAppKey); + return result; + } + public uint GetApplicationProcessId(string pchAppKey) + { + uint result = FnTable.GetApplicationProcessId(pchAppKey); + return result; + } + public string GetApplicationsErrorNameFromEnum(EVRApplicationError error) + { + IntPtr result = FnTable.GetApplicationsErrorNameFromEnum(error); + return Marshal.PtrToStringAnsi(result); + } + public uint GetApplicationPropertyString(string pchAppKey,EVRApplicationProperty eProperty,System.Text.StringBuilder pchPropertyValueBuffer,uint unPropertyValueBufferLen,ref EVRApplicationError peError) + { + uint result = FnTable.GetApplicationPropertyString(pchAppKey,eProperty,pchPropertyValueBuffer,unPropertyValueBufferLen,ref peError); + return result; + } + public bool GetApplicationPropertyBool(string pchAppKey,EVRApplicationProperty eProperty,ref EVRApplicationError peError) + { + bool result = FnTable.GetApplicationPropertyBool(pchAppKey,eProperty,ref peError); + return result; + } + public ulong GetApplicationPropertyUint64(string pchAppKey,EVRApplicationProperty eProperty,ref EVRApplicationError peError) + { + ulong result = FnTable.GetApplicationPropertyUint64(pchAppKey,eProperty,ref peError); + return result; + } + public EVRApplicationError SetApplicationAutoLaunch(string pchAppKey,bool bAutoLaunch) + { + EVRApplicationError result = FnTable.SetApplicationAutoLaunch(pchAppKey,bAutoLaunch); + return result; + } + public bool GetApplicationAutoLaunch(string pchAppKey) + { + bool result = FnTable.GetApplicationAutoLaunch(pchAppKey); + return result; + } + public EVRApplicationError SetDefaultApplicationForMimeType(string pchAppKey,string pchMimeType) + { + EVRApplicationError result = FnTable.SetDefaultApplicationForMimeType(pchAppKey,pchMimeType); + return result; + } + public bool GetDefaultApplicationForMimeType(string pchMimeType,string pchAppKeyBuffer,uint unAppKeyBufferLen) + { + bool result = FnTable.GetDefaultApplicationForMimeType(pchMimeType,pchAppKeyBuffer,unAppKeyBufferLen); + return result; + } + public bool GetApplicationSupportedMimeTypes(string pchAppKey,string pchMimeTypesBuffer,uint unMimeTypesBuffer) + { + bool result = FnTable.GetApplicationSupportedMimeTypes(pchAppKey,pchMimeTypesBuffer,unMimeTypesBuffer); + return result; + } + public uint GetApplicationsThatSupportMimeType(string pchMimeType,string pchAppKeysThatSupportBuffer,uint unAppKeysThatSupportBuffer) + { + uint result = FnTable.GetApplicationsThatSupportMimeType(pchMimeType,pchAppKeysThatSupportBuffer,unAppKeysThatSupportBuffer); + return result; + } + public uint GetApplicationLaunchArguments(uint unHandle,string pchArgs,uint unArgs) + { + uint result = FnTable.GetApplicationLaunchArguments(unHandle,pchArgs,unArgs); + return result; + } + public EVRApplicationError GetStartingApplication(string pchAppKeyBuffer,uint unAppKeyBufferLen) + { + EVRApplicationError result = FnTable.GetStartingApplication(pchAppKeyBuffer,unAppKeyBufferLen); + return result; + } + public EVRApplicationTransitionState GetTransitionState() + { + EVRApplicationTransitionState result = FnTable.GetTransitionState(); + return result; + } + public EVRApplicationError PerformApplicationPrelaunchCheck(string pchAppKey) + { + EVRApplicationError result = FnTable.PerformApplicationPrelaunchCheck(pchAppKey); + return result; + } + public string GetApplicationsTransitionStateNameFromEnum(EVRApplicationTransitionState state) + { + IntPtr result = FnTable.GetApplicationsTransitionStateNameFromEnum(state); + return Marshal.PtrToStringAnsi(result); + } + public bool IsQuitUserPromptRequested() + { + bool result = FnTable.IsQuitUserPromptRequested(); + return result; + } + public EVRApplicationError LaunchInternalProcess(string pchBinaryPath,string pchArguments,string pchWorkingDirectory) + { + EVRApplicationError result = FnTable.LaunchInternalProcess(pchBinaryPath,pchArguments,pchWorkingDirectory); + return result; + } + public uint GetCurrentSceneProcessId() + { + uint result = FnTable.GetCurrentSceneProcessId(); + return result; + } +} + + +public class CVRChaperone +{ + IVRChaperone FnTable; + internal CVRChaperone(IntPtr pInterface) + { + FnTable = (IVRChaperone)Marshal.PtrToStructure(pInterface, typeof(IVRChaperone)); + } + public ChaperoneCalibrationState GetCalibrationState() + { + ChaperoneCalibrationState result = FnTable.GetCalibrationState(); + return result; + } + public bool GetPlayAreaSize(ref float pSizeX,ref float pSizeZ) + { + pSizeX = 0; + pSizeZ = 0; + bool result = FnTable.GetPlayAreaSize(ref pSizeX,ref pSizeZ); + return result; + } + public bool GetPlayAreaRect(ref HmdQuad_t rect) + { + bool result = FnTable.GetPlayAreaRect(ref rect); + return result; + } + public void ReloadInfo() + { + FnTable.ReloadInfo(); + } + public void SetSceneColor(HmdColor_t color) + { + FnTable.SetSceneColor(color); + } + public void GetBoundsColor(ref HmdColor_t pOutputColorArray,int nNumOutputColors,float flCollisionBoundsFadeDistance,ref HmdColor_t pOutputCameraColor) + { + FnTable.GetBoundsColor(ref pOutputColorArray,nNumOutputColors,flCollisionBoundsFadeDistance,ref pOutputCameraColor); + } + public bool AreBoundsVisible() + { + bool result = FnTable.AreBoundsVisible(); + return result; + } + public void ForceBoundsVisible(bool bForce) + { + FnTable.ForceBoundsVisible(bForce); + } +} + + +public class CVRChaperoneSetup +{ + IVRChaperoneSetup FnTable; + internal CVRChaperoneSetup(IntPtr pInterface) + { + FnTable = (IVRChaperoneSetup)Marshal.PtrToStructure(pInterface, typeof(IVRChaperoneSetup)); + } + public bool CommitWorkingCopy(EChaperoneConfigFile configFile) + { + bool result = FnTable.CommitWorkingCopy(configFile); + return result; + } + public void RevertWorkingCopy() + { + FnTable.RevertWorkingCopy(); + } + public bool GetWorkingPlayAreaSize(ref float pSizeX,ref float pSizeZ) + { + pSizeX = 0; + pSizeZ = 0; + bool result = FnTable.GetWorkingPlayAreaSize(ref pSizeX,ref pSizeZ); + return result; + } + public bool GetWorkingPlayAreaRect(ref HmdQuad_t rect) + { + bool result = FnTable.GetWorkingPlayAreaRect(ref rect); + return result; + } + public bool GetWorkingCollisionBoundsInfo(out HmdQuad_t [] pQuadsBuffer) + { + uint punQuadsCount = 0; + bool result = FnTable.GetWorkingCollisionBoundsInfo(null,ref punQuadsCount); + pQuadsBuffer= new HmdQuad_t[punQuadsCount]; + result = FnTable.GetWorkingCollisionBoundsInfo(pQuadsBuffer,ref punQuadsCount); + return result; + } + public bool GetLiveCollisionBoundsInfo(out HmdQuad_t [] pQuadsBuffer) + { + uint punQuadsCount = 0; + bool result = FnTable.GetLiveCollisionBoundsInfo(null,ref punQuadsCount); + pQuadsBuffer= new HmdQuad_t[punQuadsCount]; + result = FnTable.GetLiveCollisionBoundsInfo(pQuadsBuffer,ref punQuadsCount); + return result; + } + public bool GetWorkingSeatedZeroPoseToRawTrackingPose(ref HmdMatrix34_t pmatSeatedZeroPoseToRawTrackingPose) + { + bool result = FnTable.GetWorkingSeatedZeroPoseToRawTrackingPose(ref pmatSeatedZeroPoseToRawTrackingPose); + return result; + } + public bool GetWorkingStandingZeroPoseToRawTrackingPose(ref HmdMatrix34_t pmatStandingZeroPoseToRawTrackingPose) + { + bool result = FnTable.GetWorkingStandingZeroPoseToRawTrackingPose(ref pmatStandingZeroPoseToRawTrackingPose); + return result; + } + public void SetWorkingPlayAreaSize(float sizeX,float sizeZ) + { + FnTable.SetWorkingPlayAreaSize(sizeX,sizeZ); + } + public void SetWorkingCollisionBoundsInfo(HmdQuad_t [] pQuadsBuffer) + { + FnTable.SetWorkingCollisionBoundsInfo(pQuadsBuffer,(uint) pQuadsBuffer.Length); + } + public void SetWorkingSeatedZeroPoseToRawTrackingPose(ref HmdMatrix34_t pMatSeatedZeroPoseToRawTrackingPose) + { + FnTable.SetWorkingSeatedZeroPoseToRawTrackingPose(ref pMatSeatedZeroPoseToRawTrackingPose); + } + public void SetWorkingStandingZeroPoseToRawTrackingPose(ref HmdMatrix34_t pMatStandingZeroPoseToRawTrackingPose) + { + FnTable.SetWorkingStandingZeroPoseToRawTrackingPose(ref pMatStandingZeroPoseToRawTrackingPose); + } + public void ReloadFromDisk(EChaperoneConfigFile configFile) + { + FnTable.ReloadFromDisk(configFile); + } + public bool GetLiveSeatedZeroPoseToRawTrackingPose(ref HmdMatrix34_t pmatSeatedZeroPoseToRawTrackingPose) + { + bool result = FnTable.GetLiveSeatedZeroPoseToRawTrackingPose(ref pmatSeatedZeroPoseToRawTrackingPose); + return result; + } + public void SetWorkingCollisionBoundsTagsInfo(byte [] pTagsBuffer) + { + FnTable.SetWorkingCollisionBoundsTagsInfo(pTagsBuffer,(uint) pTagsBuffer.Length); + } + public bool GetLiveCollisionBoundsTagsInfo(out byte [] pTagsBuffer) + { + uint punTagCount = 0; + bool result = FnTable.GetLiveCollisionBoundsTagsInfo(null,ref punTagCount); + pTagsBuffer= new byte[punTagCount]; + result = FnTable.GetLiveCollisionBoundsTagsInfo(pTagsBuffer,ref punTagCount); + return result; + } + public bool SetWorkingPhysicalBoundsInfo(HmdQuad_t [] pQuadsBuffer) + { + bool result = FnTable.SetWorkingPhysicalBoundsInfo(pQuadsBuffer,(uint) pQuadsBuffer.Length); + return result; + } + public bool GetLivePhysicalBoundsInfo(out HmdQuad_t [] pQuadsBuffer) + { + uint punQuadsCount = 0; + bool result = FnTable.GetLivePhysicalBoundsInfo(null,ref punQuadsCount); + pQuadsBuffer= new HmdQuad_t[punQuadsCount]; + result = FnTable.GetLivePhysicalBoundsInfo(pQuadsBuffer,ref punQuadsCount); + return result; + } + public bool ExportLiveToBuffer(System.Text.StringBuilder pBuffer,ref uint pnBufferLength) + { + pnBufferLength = 0; + bool result = FnTable.ExportLiveToBuffer(pBuffer,ref pnBufferLength); + return result; + } + public bool ImportFromBufferToWorking(string pBuffer,uint nImportFlags) + { + bool result = FnTable.ImportFromBufferToWorking(pBuffer,nImportFlags); + return result; + } +} + + +public class CVRCompositor +{ + IVRCompositor FnTable; + internal CVRCompositor(IntPtr pInterface) + { + FnTable = (IVRCompositor)Marshal.PtrToStructure(pInterface, typeof(IVRCompositor)); + } + public void SetTrackingSpace(ETrackingUniverseOrigin eOrigin) + { + FnTable.SetTrackingSpace(eOrigin); + } + public ETrackingUniverseOrigin GetTrackingSpace() + { + ETrackingUniverseOrigin result = FnTable.GetTrackingSpace(); + return result; + } + public EVRCompositorError WaitGetPoses(TrackedDevicePose_t [] pRenderPoseArray,TrackedDevicePose_t [] pGamePoseArray) + { + EVRCompositorError result = FnTable.WaitGetPoses(pRenderPoseArray,(uint) pRenderPoseArray.Length,pGamePoseArray,(uint) pGamePoseArray.Length); + return result; + } + public EVRCompositorError GetLastPoses(TrackedDevicePose_t [] pRenderPoseArray,TrackedDevicePose_t [] pGamePoseArray) + { + EVRCompositorError result = FnTable.GetLastPoses(pRenderPoseArray,(uint) pRenderPoseArray.Length,pGamePoseArray,(uint) pGamePoseArray.Length); + return result; + } + public EVRCompositorError GetLastPoseForTrackedDeviceIndex(uint unDeviceIndex,ref TrackedDevicePose_t pOutputPose,ref TrackedDevicePose_t pOutputGamePose) + { + EVRCompositorError result = FnTable.GetLastPoseForTrackedDeviceIndex(unDeviceIndex,ref pOutputPose,ref pOutputGamePose); + return result; + } + public EVRCompositorError Submit(EVREye eEye,ref Texture_t pTexture,ref VRTextureBounds_t pBounds,EVRSubmitFlags nSubmitFlags) + { + EVRCompositorError result = FnTable.Submit(eEye,ref pTexture,ref pBounds,nSubmitFlags); + return result; + } + public void ClearLastSubmittedFrame() + { + FnTable.ClearLastSubmittedFrame(); + } + public void PostPresentHandoff() + { + FnTable.PostPresentHandoff(); + } + public bool GetFrameTiming(ref Compositor_FrameTiming pTiming,uint unFramesAgo) + { + bool result = FnTable.GetFrameTiming(ref pTiming,unFramesAgo); + return result; + } + public uint GetFrameTimings(ref Compositor_FrameTiming pTiming,uint nFrames) + { + uint result = FnTable.GetFrameTimings(ref pTiming,nFrames); + return result; + } + public float GetFrameTimeRemaining() + { + float result = FnTable.GetFrameTimeRemaining(); + return result; + } + public void GetCumulativeStats(ref Compositor_CumulativeStats pStats,uint nStatsSizeInBytes) + { + FnTable.GetCumulativeStats(ref pStats,nStatsSizeInBytes); + } + public void FadeToColor(float fSeconds,float fRed,float fGreen,float fBlue,float fAlpha,bool bBackground) + { + FnTable.FadeToColor(fSeconds,fRed,fGreen,fBlue,fAlpha,bBackground); + } + public HmdColor_t GetCurrentFadeColor(bool bBackground) + { + HmdColor_t result = FnTable.GetCurrentFadeColor(bBackground); + return result; + } + public void FadeGrid(float fSeconds,bool bFadeIn) + { + FnTable.FadeGrid(fSeconds,bFadeIn); + } + public float GetCurrentGridAlpha() + { + float result = FnTable.GetCurrentGridAlpha(); + return result; + } + public EVRCompositorError SetSkyboxOverride(Texture_t [] pTextures) + { + EVRCompositorError result = FnTable.SetSkyboxOverride(pTextures,(uint) pTextures.Length); + return result; + } + public void ClearSkyboxOverride() + { + FnTable.ClearSkyboxOverride(); + } + public void CompositorBringToFront() + { + FnTable.CompositorBringToFront(); + } + public void CompositorGoToBack() + { + FnTable.CompositorGoToBack(); + } + public void CompositorQuit() + { + FnTable.CompositorQuit(); + } + public bool IsFullscreen() + { + bool result = FnTable.IsFullscreen(); + return result; + } + public uint GetCurrentSceneFocusProcess() + { + uint result = FnTable.GetCurrentSceneFocusProcess(); + return result; + } + public uint GetLastFrameRenderer() + { + uint result = FnTable.GetLastFrameRenderer(); + return result; + } + public bool CanRenderScene() + { + bool result = FnTable.CanRenderScene(); + return result; + } + public void ShowMirrorWindow() + { + FnTable.ShowMirrorWindow(); + } + public void HideMirrorWindow() + { + FnTable.HideMirrorWindow(); + } + public bool IsMirrorWindowVisible() + { + bool result = FnTable.IsMirrorWindowVisible(); + return result; + } + public void CompositorDumpImages() + { + FnTable.CompositorDumpImages(); + } + public bool ShouldAppRenderWithLowResources() + { + bool result = FnTable.ShouldAppRenderWithLowResources(); + return result; + } + public void ForceInterleavedReprojectionOn(bool bOverride) + { + FnTable.ForceInterleavedReprojectionOn(bOverride); + } + public void ForceReconnectProcess() + { + FnTable.ForceReconnectProcess(); + } + public void SuspendRendering(bool bSuspend) + { + FnTable.SuspendRendering(bSuspend); + } + public EVRCompositorError GetMirrorTextureD3D11(EVREye eEye,IntPtr pD3D11DeviceOrResource,ref IntPtr ppD3D11ShaderResourceView) + { + EVRCompositorError result = FnTable.GetMirrorTextureD3D11(eEye,pD3D11DeviceOrResource,ref ppD3D11ShaderResourceView); + return result; + } + public void ReleaseMirrorTextureD3D11(IntPtr pD3D11ShaderResourceView) + { + FnTable.ReleaseMirrorTextureD3D11(pD3D11ShaderResourceView); + } + public EVRCompositorError GetMirrorTextureGL(EVREye eEye,ref uint pglTextureId,IntPtr pglSharedTextureHandle) + { + pglTextureId = 0; + EVRCompositorError result = FnTable.GetMirrorTextureGL(eEye,ref pglTextureId,pglSharedTextureHandle); + return result; + } + public bool ReleaseSharedGLTexture(uint glTextureId,IntPtr glSharedTextureHandle) + { + bool result = FnTable.ReleaseSharedGLTexture(glTextureId,glSharedTextureHandle); + return result; + } + public void LockGLSharedTextureForAccess(IntPtr glSharedTextureHandle) + { + FnTable.LockGLSharedTextureForAccess(glSharedTextureHandle); + } + public void UnlockGLSharedTextureForAccess(IntPtr glSharedTextureHandle) + { + FnTable.UnlockGLSharedTextureForAccess(glSharedTextureHandle); + } + public uint GetVulkanInstanceExtensionsRequired(System.Text.StringBuilder pchValue,uint unBufferSize) + { + uint result = FnTable.GetVulkanInstanceExtensionsRequired(pchValue,unBufferSize); + return result; + } + public uint GetVulkanDeviceExtensionsRequired(IntPtr pPhysicalDevice,System.Text.StringBuilder pchValue,uint unBufferSize) + { + uint result = FnTable.GetVulkanDeviceExtensionsRequired(pPhysicalDevice,pchValue,unBufferSize); + return result; + } +} + + +public class CVROverlay +{ + IVROverlay FnTable; + internal CVROverlay(IntPtr pInterface) + { + FnTable = (IVROverlay)Marshal.PtrToStructure(pInterface, typeof(IVROverlay)); + } + public EVROverlayError FindOverlay(string pchOverlayKey,ref ulong pOverlayHandle) + { + pOverlayHandle = 0; + EVROverlayError result = FnTable.FindOverlay(pchOverlayKey,ref pOverlayHandle); + return result; + } + public EVROverlayError CreateOverlay(string pchOverlayKey,string pchOverlayName,ref ulong pOverlayHandle) + { + pOverlayHandle = 0; + EVROverlayError result = FnTable.CreateOverlay(pchOverlayKey,pchOverlayName,ref pOverlayHandle); + return result; + } + public EVROverlayError DestroyOverlay(ulong ulOverlayHandle) + { + EVROverlayError result = FnTable.DestroyOverlay(ulOverlayHandle); + return result; + } + public EVROverlayError SetHighQualityOverlay(ulong ulOverlayHandle) + { + EVROverlayError result = FnTable.SetHighQualityOverlay(ulOverlayHandle); + return result; + } + public ulong GetHighQualityOverlay() + { + ulong result = FnTable.GetHighQualityOverlay(); + return result; + } + public uint GetOverlayKey(ulong ulOverlayHandle,System.Text.StringBuilder pchValue,uint unBufferSize,ref EVROverlayError pError) + { + uint result = FnTable.GetOverlayKey(ulOverlayHandle,pchValue,unBufferSize,ref pError); + return result; + } + public uint GetOverlayName(ulong ulOverlayHandle,System.Text.StringBuilder pchValue,uint unBufferSize,ref EVROverlayError pError) + { + uint result = FnTable.GetOverlayName(ulOverlayHandle,pchValue,unBufferSize,ref pError); + return result; + } + public EVROverlayError SetOverlayName(ulong ulOverlayHandle,string pchName) + { + EVROverlayError result = FnTable.SetOverlayName(ulOverlayHandle,pchName); + return result; + } + public EVROverlayError GetOverlayImageData(ulong ulOverlayHandle,IntPtr pvBuffer,uint unBufferSize,ref uint punWidth,ref uint punHeight) + { + punWidth = 0; + punHeight = 0; + EVROverlayError result = FnTable.GetOverlayImageData(ulOverlayHandle,pvBuffer,unBufferSize,ref punWidth,ref punHeight); + return result; + } + public string GetOverlayErrorNameFromEnum(EVROverlayError error) + { + IntPtr result = FnTable.GetOverlayErrorNameFromEnum(error); + return Marshal.PtrToStringAnsi(result); + } + public EVROverlayError SetOverlayRenderingPid(ulong ulOverlayHandle,uint unPID) + { + EVROverlayError result = FnTable.SetOverlayRenderingPid(ulOverlayHandle,unPID); + return result; + } + public uint GetOverlayRenderingPid(ulong ulOverlayHandle) + { + uint result = FnTable.GetOverlayRenderingPid(ulOverlayHandle); + return result; + } + public EVROverlayError SetOverlayFlag(ulong ulOverlayHandle,VROverlayFlags eOverlayFlag,bool bEnabled) + { + EVROverlayError result = FnTable.SetOverlayFlag(ulOverlayHandle,eOverlayFlag,bEnabled); + return result; + } + public EVROverlayError GetOverlayFlag(ulong ulOverlayHandle,VROverlayFlags eOverlayFlag,ref bool pbEnabled) + { + pbEnabled = false; + EVROverlayError result = FnTable.GetOverlayFlag(ulOverlayHandle,eOverlayFlag,ref pbEnabled); + return result; + } + public EVROverlayError SetOverlayColor(ulong ulOverlayHandle,float fRed,float fGreen,float fBlue) + { + EVROverlayError result = FnTable.SetOverlayColor(ulOverlayHandle,fRed,fGreen,fBlue); + return result; + } + public EVROverlayError GetOverlayColor(ulong ulOverlayHandle,ref float pfRed,ref float pfGreen,ref float pfBlue) + { + pfRed = 0; + pfGreen = 0; + pfBlue = 0; + EVROverlayError result = FnTable.GetOverlayColor(ulOverlayHandle,ref pfRed,ref pfGreen,ref pfBlue); + return result; + } + public EVROverlayError SetOverlayAlpha(ulong ulOverlayHandle,float fAlpha) + { + EVROverlayError result = FnTable.SetOverlayAlpha(ulOverlayHandle,fAlpha); + return result; + } + public EVROverlayError GetOverlayAlpha(ulong ulOverlayHandle,ref float pfAlpha) + { + pfAlpha = 0; + EVROverlayError result = FnTable.GetOverlayAlpha(ulOverlayHandle,ref pfAlpha); + return result; + } + public EVROverlayError SetOverlayTexelAspect(ulong ulOverlayHandle,float fTexelAspect) + { + EVROverlayError result = FnTable.SetOverlayTexelAspect(ulOverlayHandle,fTexelAspect); + return result; + } + public EVROverlayError GetOverlayTexelAspect(ulong ulOverlayHandle,ref float pfTexelAspect) + { + pfTexelAspect = 0; + EVROverlayError result = FnTable.GetOverlayTexelAspect(ulOverlayHandle,ref pfTexelAspect); + return result; + } + public EVROverlayError SetOverlaySortOrder(ulong ulOverlayHandle,uint unSortOrder) + { + EVROverlayError result = FnTable.SetOverlaySortOrder(ulOverlayHandle,unSortOrder); + return result; + } + public EVROverlayError GetOverlaySortOrder(ulong ulOverlayHandle,ref uint punSortOrder) + { + punSortOrder = 0; + EVROverlayError result = FnTable.GetOverlaySortOrder(ulOverlayHandle,ref punSortOrder); + return result; + } + public EVROverlayError SetOverlayWidthInMeters(ulong ulOverlayHandle,float fWidthInMeters) + { + EVROverlayError result = FnTable.SetOverlayWidthInMeters(ulOverlayHandle,fWidthInMeters); + return result; + } + public EVROverlayError GetOverlayWidthInMeters(ulong ulOverlayHandle,ref float pfWidthInMeters) + { + pfWidthInMeters = 0; + EVROverlayError result = FnTable.GetOverlayWidthInMeters(ulOverlayHandle,ref pfWidthInMeters); + return result; + } + public EVROverlayError SetOverlayAutoCurveDistanceRangeInMeters(ulong ulOverlayHandle,float fMinDistanceInMeters,float fMaxDistanceInMeters) + { + EVROverlayError result = FnTable.SetOverlayAutoCurveDistanceRangeInMeters(ulOverlayHandle,fMinDistanceInMeters,fMaxDistanceInMeters); + return result; + } + public EVROverlayError GetOverlayAutoCurveDistanceRangeInMeters(ulong ulOverlayHandle,ref float pfMinDistanceInMeters,ref float pfMaxDistanceInMeters) + { + pfMinDistanceInMeters = 0; + pfMaxDistanceInMeters = 0; + EVROverlayError result = FnTable.GetOverlayAutoCurveDistanceRangeInMeters(ulOverlayHandle,ref pfMinDistanceInMeters,ref pfMaxDistanceInMeters); + return result; + } + public EVROverlayError SetOverlayTextureColorSpace(ulong ulOverlayHandle,EColorSpace eTextureColorSpace) + { + EVROverlayError result = FnTable.SetOverlayTextureColorSpace(ulOverlayHandle,eTextureColorSpace); + return result; + } + public EVROverlayError GetOverlayTextureColorSpace(ulong ulOverlayHandle,ref EColorSpace peTextureColorSpace) + { + EVROverlayError result = FnTable.GetOverlayTextureColorSpace(ulOverlayHandle,ref peTextureColorSpace); + return result; + } + public EVROverlayError SetOverlayTextureBounds(ulong ulOverlayHandle,ref VRTextureBounds_t pOverlayTextureBounds) + { + EVROverlayError result = FnTable.SetOverlayTextureBounds(ulOverlayHandle,ref pOverlayTextureBounds); + return result; + } + public EVROverlayError GetOverlayTextureBounds(ulong ulOverlayHandle,ref VRTextureBounds_t pOverlayTextureBounds) + { + EVROverlayError result = FnTable.GetOverlayTextureBounds(ulOverlayHandle,ref pOverlayTextureBounds); + return result; + } + public uint GetOverlayRenderModel(ulong ulOverlayHandle,string pchValue,uint unBufferSize,ref HmdColor_t pColor,ref EVROverlayError pError) + { + uint result = FnTable.GetOverlayRenderModel(ulOverlayHandle,pchValue,unBufferSize,ref pColor,ref pError); + return result; + } + public EVROverlayError SetOverlayRenderModel(ulong ulOverlayHandle,string pchRenderModel,ref HmdColor_t pColor) + { + EVROverlayError result = FnTable.SetOverlayRenderModel(ulOverlayHandle,pchRenderModel,ref pColor); + return result; + } + public EVROverlayError GetOverlayTransformType(ulong ulOverlayHandle,ref VROverlayTransformType peTransformType) + { + EVROverlayError result = FnTable.GetOverlayTransformType(ulOverlayHandle,ref peTransformType); + return result; + } + public EVROverlayError SetOverlayTransformAbsolute(ulong ulOverlayHandle,ETrackingUniverseOrigin eTrackingOrigin,ref HmdMatrix34_t pmatTrackingOriginToOverlayTransform) + { + EVROverlayError result = FnTable.SetOverlayTransformAbsolute(ulOverlayHandle,eTrackingOrigin,ref pmatTrackingOriginToOverlayTransform); + return result; + } + public EVROverlayError GetOverlayTransformAbsolute(ulong ulOverlayHandle,ref ETrackingUniverseOrigin peTrackingOrigin,ref HmdMatrix34_t pmatTrackingOriginToOverlayTransform) + { + EVROverlayError result = FnTable.GetOverlayTransformAbsolute(ulOverlayHandle,ref peTrackingOrigin,ref pmatTrackingOriginToOverlayTransform); + return result; + } + public EVROverlayError SetOverlayTransformTrackedDeviceRelative(ulong ulOverlayHandle,uint unTrackedDevice,ref HmdMatrix34_t pmatTrackedDeviceToOverlayTransform) + { + EVROverlayError result = FnTable.SetOverlayTransformTrackedDeviceRelative(ulOverlayHandle,unTrackedDevice,ref pmatTrackedDeviceToOverlayTransform); + return result; + } + public EVROverlayError GetOverlayTransformTrackedDeviceRelative(ulong ulOverlayHandle,ref uint punTrackedDevice,ref HmdMatrix34_t pmatTrackedDeviceToOverlayTransform) + { + punTrackedDevice = 0; + EVROverlayError result = FnTable.GetOverlayTransformTrackedDeviceRelative(ulOverlayHandle,ref punTrackedDevice,ref pmatTrackedDeviceToOverlayTransform); + return result; + } + public EVROverlayError SetOverlayTransformTrackedDeviceComponent(ulong ulOverlayHandle,uint unDeviceIndex,string pchComponentName) + { + EVROverlayError result = FnTable.SetOverlayTransformTrackedDeviceComponent(ulOverlayHandle,unDeviceIndex,pchComponentName); + return result; + } + public EVROverlayError GetOverlayTransformTrackedDeviceComponent(ulong ulOverlayHandle,ref uint punDeviceIndex,string pchComponentName,uint unComponentNameSize) + { + punDeviceIndex = 0; + EVROverlayError result = FnTable.GetOverlayTransformTrackedDeviceComponent(ulOverlayHandle,ref punDeviceIndex,pchComponentName,unComponentNameSize); + return result; + } + public EVROverlayError GetOverlayTransformOverlayRelative(ulong ulOverlayHandle,ref ulong ulOverlayHandleParent,ref HmdMatrix34_t pmatParentOverlayToOverlayTransform) + { + ulOverlayHandleParent = 0; + EVROverlayError result = FnTable.GetOverlayTransformOverlayRelative(ulOverlayHandle,ref ulOverlayHandleParent,ref pmatParentOverlayToOverlayTransform); + return result; + } + public EVROverlayError SetOverlayTransformOverlayRelative(ulong ulOverlayHandle,ulong ulOverlayHandleParent,ref HmdMatrix34_t pmatParentOverlayToOverlayTransform) + { + EVROverlayError result = FnTable.SetOverlayTransformOverlayRelative(ulOverlayHandle,ulOverlayHandleParent,ref pmatParentOverlayToOverlayTransform); + return result; + } + public EVROverlayError ShowOverlay(ulong ulOverlayHandle) + { + EVROverlayError result = FnTable.ShowOverlay(ulOverlayHandle); + return result; + } + public EVROverlayError HideOverlay(ulong ulOverlayHandle) + { + EVROverlayError result = FnTable.HideOverlay(ulOverlayHandle); + return result; + } + public bool IsOverlayVisible(ulong ulOverlayHandle) + { + bool result = FnTable.IsOverlayVisible(ulOverlayHandle); + return result; + } + public EVROverlayError GetTransformForOverlayCoordinates(ulong ulOverlayHandle,ETrackingUniverseOrigin eTrackingOrigin,HmdVector2_t coordinatesInOverlay,ref HmdMatrix34_t pmatTransform) + { + EVROverlayError result = FnTable.GetTransformForOverlayCoordinates(ulOverlayHandle,eTrackingOrigin,coordinatesInOverlay,ref pmatTransform); + return result; + } +// This is a terrible hack to workaround the fact that VRControllerState_t and VREvent_t were +// originally mis-compiled with the wrong packing for Linux and OSX. + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _PollNextOverlayEventPacked(ulong ulOverlayHandle,ref VREvent_t_Packed pEvent,uint uncbVREvent); + [StructLayout(LayoutKind.Explicit)] + struct PollNextOverlayEventUnion + { + [FieldOffset(0)] + public IVROverlay._PollNextOverlayEvent pPollNextOverlayEvent; + [FieldOffset(0)] + public _PollNextOverlayEventPacked pPollNextOverlayEventPacked; + } + public bool PollNextOverlayEvent(ulong ulOverlayHandle,ref VREvent_t pEvent,uint uncbVREvent) + { + if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || + (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) + { + PollNextOverlayEventUnion u; + VREvent_t_Packed event_packed = new VREvent_t_Packed(); + u.pPollNextOverlayEventPacked = null; + u.pPollNextOverlayEvent = FnTable.PollNextOverlayEvent; + bool packed_result = u.pPollNextOverlayEventPacked(ulOverlayHandle,ref event_packed,(uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VREvent_t_Packed))); + + event_packed.Unpack(ref pEvent); + return packed_result; + } + bool result = FnTable.PollNextOverlayEvent(ulOverlayHandle,ref pEvent,uncbVREvent); + return result; + } + public EVROverlayError GetOverlayInputMethod(ulong ulOverlayHandle,ref VROverlayInputMethod peInputMethod) + { + EVROverlayError result = FnTable.GetOverlayInputMethod(ulOverlayHandle,ref peInputMethod); + return result; + } + public EVROverlayError SetOverlayInputMethod(ulong ulOverlayHandle,VROverlayInputMethod eInputMethod) + { + EVROverlayError result = FnTable.SetOverlayInputMethod(ulOverlayHandle,eInputMethod); + return result; + } + public EVROverlayError GetOverlayMouseScale(ulong ulOverlayHandle,ref HmdVector2_t pvecMouseScale) + { + EVROverlayError result = FnTable.GetOverlayMouseScale(ulOverlayHandle,ref pvecMouseScale); + return result; + } + public EVROverlayError SetOverlayMouseScale(ulong ulOverlayHandle,ref HmdVector2_t pvecMouseScale) + { + EVROverlayError result = FnTable.SetOverlayMouseScale(ulOverlayHandle,ref pvecMouseScale); + return result; + } + public bool ComputeOverlayIntersection(ulong ulOverlayHandle,ref VROverlayIntersectionParams_t pParams,ref VROverlayIntersectionResults_t pResults) + { + bool result = FnTable.ComputeOverlayIntersection(ulOverlayHandle,ref pParams,ref pResults); + return result; + } + public bool HandleControllerOverlayInteractionAsMouse(ulong ulOverlayHandle,uint unControllerDeviceIndex) + { + bool result = FnTable.HandleControllerOverlayInteractionAsMouse(ulOverlayHandle,unControllerDeviceIndex); + return result; + } + public bool IsHoverTargetOverlay(ulong ulOverlayHandle) + { + bool result = FnTable.IsHoverTargetOverlay(ulOverlayHandle); + return result; + } + public ulong GetGamepadFocusOverlay() + { + ulong result = FnTable.GetGamepadFocusOverlay(); + return result; + } + public EVROverlayError SetGamepadFocusOverlay(ulong ulNewFocusOverlay) + { + EVROverlayError result = FnTable.SetGamepadFocusOverlay(ulNewFocusOverlay); + return result; + } + public EVROverlayError SetOverlayNeighbor(EOverlayDirection eDirection,ulong ulFrom,ulong ulTo) + { + EVROverlayError result = FnTable.SetOverlayNeighbor(eDirection,ulFrom,ulTo); + return result; + } + public EVROverlayError MoveGamepadFocusToNeighbor(EOverlayDirection eDirection,ulong ulFrom) + { + EVROverlayError result = FnTable.MoveGamepadFocusToNeighbor(eDirection,ulFrom); + return result; + } + public EVROverlayError SetOverlayTexture(ulong ulOverlayHandle,ref Texture_t pTexture) + { + EVROverlayError result = FnTable.SetOverlayTexture(ulOverlayHandle,ref pTexture); + return result; + } + public EVROverlayError ClearOverlayTexture(ulong ulOverlayHandle) + { + EVROverlayError result = FnTable.ClearOverlayTexture(ulOverlayHandle); + return result; + } + public EVROverlayError SetOverlayRaw(ulong ulOverlayHandle,IntPtr pvBuffer,uint unWidth,uint unHeight,uint unDepth) + { + EVROverlayError result = FnTable.SetOverlayRaw(ulOverlayHandle,pvBuffer,unWidth,unHeight,unDepth); + return result; + } + public EVROverlayError SetOverlayFromFile(ulong ulOverlayHandle,string pchFilePath) + { + EVROverlayError result = FnTable.SetOverlayFromFile(ulOverlayHandle,pchFilePath); + return result; + } + public EVROverlayError GetOverlayTexture(ulong ulOverlayHandle,ref IntPtr pNativeTextureHandle,IntPtr pNativeTextureRef,ref uint pWidth,ref uint pHeight,ref uint pNativeFormat,ref ETextureType pAPIType,ref EColorSpace pColorSpace,ref VRTextureBounds_t pTextureBounds) + { + pWidth = 0; + pHeight = 0; + pNativeFormat = 0; + EVROverlayError result = FnTable.GetOverlayTexture(ulOverlayHandle,ref pNativeTextureHandle,pNativeTextureRef,ref pWidth,ref pHeight,ref pNativeFormat,ref pAPIType,ref pColorSpace,ref pTextureBounds); + return result; + } + public EVROverlayError ReleaseNativeOverlayHandle(ulong ulOverlayHandle,IntPtr pNativeTextureHandle) + { + EVROverlayError result = FnTable.ReleaseNativeOverlayHandle(ulOverlayHandle,pNativeTextureHandle); + return result; + } + public EVROverlayError GetOverlayTextureSize(ulong ulOverlayHandle,ref uint pWidth,ref uint pHeight) + { + pWidth = 0; + pHeight = 0; + EVROverlayError result = FnTable.GetOverlayTextureSize(ulOverlayHandle,ref pWidth,ref pHeight); + return result; + } + public EVROverlayError CreateDashboardOverlay(string pchOverlayKey,string pchOverlayFriendlyName,ref ulong pMainHandle,ref ulong pThumbnailHandle) + { + pMainHandle = 0; + pThumbnailHandle = 0; + EVROverlayError result = FnTable.CreateDashboardOverlay(pchOverlayKey,pchOverlayFriendlyName,ref pMainHandle,ref pThumbnailHandle); + return result; + } + public bool IsDashboardVisible() + { + bool result = FnTable.IsDashboardVisible(); + return result; + } + public bool IsActiveDashboardOverlay(ulong ulOverlayHandle) + { + bool result = FnTable.IsActiveDashboardOverlay(ulOverlayHandle); + return result; + } + public EVROverlayError SetDashboardOverlaySceneProcess(ulong ulOverlayHandle,uint unProcessId) + { + EVROverlayError result = FnTable.SetDashboardOverlaySceneProcess(ulOverlayHandle,unProcessId); + return result; + } + public EVROverlayError GetDashboardOverlaySceneProcess(ulong ulOverlayHandle,ref uint punProcessId) + { + punProcessId = 0; + EVROverlayError result = FnTable.GetDashboardOverlaySceneProcess(ulOverlayHandle,ref punProcessId); + return result; + } + public void ShowDashboard(string pchOverlayToShow) + { + FnTable.ShowDashboard(pchOverlayToShow); + } + public uint GetPrimaryDashboardDevice() + { + uint result = FnTable.GetPrimaryDashboardDevice(); + return result; + } + public EVROverlayError ShowKeyboard(int eInputMode,int eLineInputMode,string pchDescription,uint unCharMax,string pchExistingText,bool bUseMinimalMode,ulong uUserValue) + { + EVROverlayError result = FnTable.ShowKeyboard(eInputMode,eLineInputMode,pchDescription,unCharMax,pchExistingText,bUseMinimalMode,uUserValue); + return result; + } + public EVROverlayError ShowKeyboardForOverlay(ulong ulOverlayHandle,int eInputMode,int eLineInputMode,string pchDescription,uint unCharMax,string pchExistingText,bool bUseMinimalMode,ulong uUserValue) + { + EVROverlayError result = FnTable.ShowKeyboardForOverlay(ulOverlayHandle,eInputMode,eLineInputMode,pchDescription,unCharMax,pchExistingText,bUseMinimalMode,uUserValue); + return result; + } + public uint GetKeyboardText(System.Text.StringBuilder pchText,uint cchText) + { + uint result = FnTable.GetKeyboardText(pchText,cchText); + return result; + } + public void HideKeyboard() + { + FnTable.HideKeyboard(); + } + public void SetKeyboardTransformAbsolute(ETrackingUniverseOrigin eTrackingOrigin,ref HmdMatrix34_t pmatTrackingOriginToKeyboardTransform) + { + FnTable.SetKeyboardTransformAbsolute(eTrackingOrigin,ref pmatTrackingOriginToKeyboardTransform); + } + public void SetKeyboardPositionForOverlay(ulong ulOverlayHandle,HmdRect2_t avoidRect) + { + FnTable.SetKeyboardPositionForOverlay(ulOverlayHandle,avoidRect); + } + public EVROverlayError SetOverlayIntersectionMask(ulong ulOverlayHandle,ref VROverlayIntersectionMaskPrimitive_t pMaskPrimitives,uint unNumMaskPrimitives,uint unPrimitiveSize) + { + EVROverlayError result = FnTable.SetOverlayIntersectionMask(ulOverlayHandle,ref pMaskPrimitives,unNumMaskPrimitives,unPrimitiveSize); + return result; + } + public EVROverlayError GetOverlayFlags(ulong ulOverlayHandle,ref uint pFlags) + { + pFlags = 0; + EVROverlayError result = FnTable.GetOverlayFlags(ulOverlayHandle,ref pFlags); + return result; + } + public VRMessageOverlayResponse ShowMessageOverlay(string pchText,string pchCaption,string pchButton0Text,string pchButton1Text,string pchButton2Text,string pchButton3Text) + { + VRMessageOverlayResponse result = FnTable.ShowMessageOverlay(pchText,pchCaption,pchButton0Text,pchButton1Text,pchButton2Text,pchButton3Text); + return result; + } +} + + +public class CVRRenderModels +{ + IVRRenderModels FnTable; + internal CVRRenderModels(IntPtr pInterface) + { + FnTable = (IVRRenderModels)Marshal.PtrToStructure(pInterface, typeof(IVRRenderModels)); + } + public EVRRenderModelError LoadRenderModel_Async(string pchRenderModelName,ref IntPtr ppRenderModel) + { + EVRRenderModelError result = FnTable.LoadRenderModel_Async(pchRenderModelName,ref ppRenderModel); + return result; + } + public void FreeRenderModel(IntPtr pRenderModel) + { + FnTable.FreeRenderModel(pRenderModel); + } + public EVRRenderModelError LoadTexture_Async(int textureId,ref IntPtr ppTexture) + { + EVRRenderModelError result = FnTable.LoadTexture_Async(textureId,ref ppTexture); + return result; + } + public void FreeTexture(IntPtr pTexture) + { + FnTable.FreeTexture(pTexture); + } + public EVRRenderModelError LoadTextureD3D11_Async(int textureId,IntPtr pD3D11Device,ref IntPtr ppD3D11Texture2D) + { + EVRRenderModelError result = FnTable.LoadTextureD3D11_Async(textureId,pD3D11Device,ref ppD3D11Texture2D); + return result; + } + public EVRRenderModelError LoadIntoTextureD3D11_Async(int textureId,IntPtr pDstTexture) + { + EVRRenderModelError result = FnTable.LoadIntoTextureD3D11_Async(textureId,pDstTexture); + return result; + } + public void FreeTextureD3D11(IntPtr pD3D11Texture2D) + { + FnTable.FreeTextureD3D11(pD3D11Texture2D); + } + public uint GetRenderModelName(uint unRenderModelIndex,System.Text.StringBuilder pchRenderModelName,uint unRenderModelNameLen) + { + uint result = FnTable.GetRenderModelName(unRenderModelIndex,pchRenderModelName,unRenderModelNameLen); + return result; + } + public uint GetRenderModelCount() + { + uint result = FnTable.GetRenderModelCount(); + return result; + } + public uint GetComponentCount(string pchRenderModelName) + { + uint result = FnTable.GetComponentCount(pchRenderModelName); + return result; + } + public uint GetComponentName(string pchRenderModelName,uint unComponentIndex,System.Text.StringBuilder pchComponentName,uint unComponentNameLen) + { + uint result = FnTable.GetComponentName(pchRenderModelName,unComponentIndex,pchComponentName,unComponentNameLen); + return result; + } + public ulong GetComponentButtonMask(string pchRenderModelName,string pchComponentName) + { + ulong result = FnTable.GetComponentButtonMask(pchRenderModelName,pchComponentName); + return result; + } + public uint GetComponentRenderModelName(string pchRenderModelName,string pchComponentName,System.Text.StringBuilder pchComponentRenderModelName,uint unComponentRenderModelNameLen) + { + uint result = FnTable.GetComponentRenderModelName(pchRenderModelName,pchComponentName,pchComponentRenderModelName,unComponentRenderModelNameLen); + return result; + } +// This is a terrible hack to workaround the fact that VRControllerState_t and VREvent_t were +// originally mis-compiled with the wrong packing for Linux and OSX. + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetComponentStatePacked(string pchRenderModelName,string pchComponentName,ref VRControllerState_t_Packed pControllerState,ref RenderModel_ControllerMode_State_t pState,ref RenderModel_ComponentState_t pComponentState); + [StructLayout(LayoutKind.Explicit)] + struct GetComponentStateUnion + { + [FieldOffset(0)] + public IVRRenderModels._GetComponentState pGetComponentState; + [FieldOffset(0)] + public _GetComponentStatePacked pGetComponentStatePacked; + } + public bool GetComponentState(string pchRenderModelName,string pchComponentName,ref VRControllerState_t pControllerState,ref RenderModel_ControllerMode_State_t pState,ref RenderModel_ComponentState_t pComponentState) + { + if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || + (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) + { + GetComponentStateUnion u; + VRControllerState_t_Packed state_packed = new VRControllerState_t_Packed(pControllerState); + u.pGetComponentStatePacked = null; + u.pGetComponentState = FnTable.GetComponentState; + bool packed_result = u.pGetComponentStatePacked(pchRenderModelName,pchComponentName,ref state_packed,ref pState,ref pComponentState); + + state_packed.Unpack(ref pControllerState); + return packed_result; + } + bool result = FnTable.GetComponentState(pchRenderModelName,pchComponentName,ref pControllerState,ref pState,ref pComponentState); + return result; + } + public bool RenderModelHasComponent(string pchRenderModelName,string pchComponentName) + { + bool result = FnTable.RenderModelHasComponent(pchRenderModelName,pchComponentName); + return result; + } + public uint GetRenderModelThumbnailURL(string pchRenderModelName,System.Text.StringBuilder pchThumbnailURL,uint unThumbnailURLLen,ref EVRRenderModelError peError) + { + uint result = FnTable.GetRenderModelThumbnailURL(pchRenderModelName,pchThumbnailURL,unThumbnailURLLen,ref peError); + return result; + } + public uint GetRenderModelOriginalPath(string pchRenderModelName,System.Text.StringBuilder pchOriginalPath,uint unOriginalPathLen,ref EVRRenderModelError peError) + { + uint result = FnTable.GetRenderModelOriginalPath(pchRenderModelName,pchOriginalPath,unOriginalPathLen,ref peError); + return result; + } + public string GetRenderModelErrorNameFromEnum(EVRRenderModelError error) + { + IntPtr result = FnTable.GetRenderModelErrorNameFromEnum(error); + return Marshal.PtrToStringAnsi(result); + } +} + + +public class CVRNotifications +{ + IVRNotifications FnTable; + internal CVRNotifications(IntPtr pInterface) + { + FnTable = (IVRNotifications)Marshal.PtrToStructure(pInterface, typeof(IVRNotifications)); + } + public EVRNotificationError CreateNotification(ulong ulOverlayHandle,ulong ulUserValue,EVRNotificationType type,string pchText,EVRNotificationStyle style,ref NotificationBitmap_t pImage,ref uint pNotificationId) + { + pNotificationId = 0; + EVRNotificationError result = FnTable.CreateNotification(ulOverlayHandle,ulUserValue,type,pchText,style,ref pImage,ref pNotificationId); + return result; + } + public EVRNotificationError RemoveNotification(uint notificationId) + { + EVRNotificationError result = FnTable.RemoveNotification(notificationId); + return result; + } +} + + +public class CVRSettings +{ + IVRSettings FnTable; + internal CVRSettings(IntPtr pInterface) + { + FnTable = (IVRSettings)Marshal.PtrToStructure(pInterface, typeof(IVRSettings)); + } + public string GetSettingsErrorNameFromEnum(EVRSettingsError eError) + { + IntPtr result = FnTable.GetSettingsErrorNameFromEnum(eError); + return Marshal.PtrToStringAnsi(result); + } + public bool Sync(bool bForce,ref EVRSettingsError peError) + { + bool result = FnTable.Sync(bForce,ref peError); + return result; + } + public void SetBool(string pchSection,string pchSettingsKey,bool bValue,ref EVRSettingsError peError) + { + FnTable.SetBool(pchSection,pchSettingsKey,bValue,ref peError); + } + public void SetInt32(string pchSection,string pchSettingsKey,int nValue,ref EVRSettingsError peError) + { + FnTable.SetInt32(pchSection,pchSettingsKey,nValue,ref peError); + } + public void SetFloat(string pchSection,string pchSettingsKey,float flValue,ref EVRSettingsError peError) + { + FnTable.SetFloat(pchSection,pchSettingsKey,flValue,ref peError); + } + public void SetString(string pchSection,string pchSettingsKey,string pchValue,ref EVRSettingsError peError) + { + FnTable.SetString(pchSection,pchSettingsKey,pchValue,ref peError); + } + public bool GetBool(string pchSection,string pchSettingsKey,ref EVRSettingsError peError) + { + bool result = FnTable.GetBool(pchSection,pchSettingsKey,ref peError); + return result; + } + public int GetInt32(string pchSection,string pchSettingsKey,ref EVRSettingsError peError) + { + int result = FnTable.GetInt32(pchSection,pchSettingsKey,ref peError); + return result; + } + public float GetFloat(string pchSection,string pchSettingsKey,ref EVRSettingsError peError) + { + float result = FnTable.GetFloat(pchSection,pchSettingsKey,ref peError); + return result; + } + public void GetString(string pchSection,string pchSettingsKey,System.Text.StringBuilder pchValue,uint unValueLen,ref EVRSettingsError peError) + { + FnTable.GetString(pchSection,pchSettingsKey,pchValue,unValueLen,ref peError); + } + public void RemoveSection(string pchSection,ref EVRSettingsError peError) + { + FnTable.RemoveSection(pchSection,ref peError); + } + public void RemoveKeyInSection(string pchSection,string pchSettingsKey,ref EVRSettingsError peError) + { + FnTable.RemoveKeyInSection(pchSection,pchSettingsKey,ref peError); + } +} + + +public class CVRScreenshots +{ + IVRScreenshots FnTable; + internal CVRScreenshots(IntPtr pInterface) + { + FnTable = (IVRScreenshots)Marshal.PtrToStructure(pInterface, typeof(IVRScreenshots)); + } + public EVRScreenshotError RequestScreenshot(ref uint pOutScreenshotHandle,EVRScreenshotType type,string pchPreviewFilename,string pchVRFilename) + { + pOutScreenshotHandle = 0; + EVRScreenshotError result = FnTable.RequestScreenshot(ref pOutScreenshotHandle,type,pchPreviewFilename,pchVRFilename); + return result; + } + public EVRScreenshotError HookScreenshot(EVRScreenshotType [] pSupportedTypes) + { + EVRScreenshotError result = FnTable.HookScreenshot(pSupportedTypes,(int) pSupportedTypes.Length); + return result; + } + public EVRScreenshotType GetScreenshotPropertyType(uint screenshotHandle,ref EVRScreenshotError pError) + { + EVRScreenshotType result = FnTable.GetScreenshotPropertyType(screenshotHandle,ref pError); + return result; + } + public uint GetScreenshotPropertyFilename(uint screenshotHandle,EVRScreenshotPropertyFilenames filenameType,System.Text.StringBuilder pchFilename,uint cchFilename,ref EVRScreenshotError pError) + { + uint result = FnTable.GetScreenshotPropertyFilename(screenshotHandle,filenameType,pchFilename,cchFilename,ref pError); + return result; + } + public EVRScreenshotError UpdateScreenshotProgress(uint screenshotHandle,float flProgress) + { + EVRScreenshotError result = FnTable.UpdateScreenshotProgress(screenshotHandle,flProgress); + return result; + } + public EVRScreenshotError TakeStereoScreenshot(ref uint pOutScreenshotHandle,string pchPreviewFilename,string pchVRFilename) + { + pOutScreenshotHandle = 0; + EVRScreenshotError result = FnTable.TakeStereoScreenshot(ref pOutScreenshotHandle,pchPreviewFilename,pchVRFilename); + return result; + } + public EVRScreenshotError SubmitScreenshot(uint screenshotHandle,EVRScreenshotType type,string pchSourcePreviewFilename,string pchSourceVRFilename) + { + EVRScreenshotError result = FnTable.SubmitScreenshot(screenshotHandle,type,pchSourcePreviewFilename,pchSourceVRFilename); + return result; + } +} + + +public class CVRResources +{ + IVRResources FnTable; + internal CVRResources(IntPtr pInterface) + { + FnTable = (IVRResources)Marshal.PtrToStructure(pInterface, typeof(IVRResources)); + } + public uint LoadSharedResource(string pchResourceName,string pchBuffer,uint unBufferLen) + { + uint result = FnTable.LoadSharedResource(pchResourceName,pchBuffer,unBufferLen); + return result; + } + public uint GetResourceFullPath(string pchResourceName,string pchResourceTypeDirectory,string pchPathBuffer,uint unBufferLen) + { + uint result = FnTable.GetResourceFullPath(pchResourceName,pchResourceTypeDirectory,pchPathBuffer,unBufferLen); + return result; + } +} + + +public class CVRDriverManager +{ + IVRDriverManager FnTable; + internal CVRDriverManager(IntPtr pInterface) + { + FnTable = (IVRDriverManager)Marshal.PtrToStructure(pInterface, typeof(IVRDriverManager)); + } + public uint GetDriverCount() + { + uint result = FnTable.GetDriverCount(); + return result; + } + public uint GetDriverName(uint nDriver,System.Text.StringBuilder pchValue,uint unBufferSize) + { + uint result = FnTable.GetDriverName(nDriver,pchValue,unBufferSize); + return result; + } +} + + +public class OpenVRInterop +{ + [DllImportAttribute("openvr_api", EntryPoint = "VR_InitInternal", CallingConvention = CallingConvention.Cdecl)] + internal static extern uint InitInternal(ref EVRInitError peError, EVRApplicationType eApplicationType); + [DllImportAttribute("openvr_api", EntryPoint = "VR_ShutdownInternal", CallingConvention = CallingConvention.Cdecl)] + internal static extern void ShutdownInternal(); + [DllImportAttribute("openvr_api", EntryPoint = "VR_IsHmdPresent", CallingConvention = CallingConvention.Cdecl)] + internal static extern bool IsHmdPresent(); + [DllImportAttribute("openvr_api", EntryPoint = "VR_IsRuntimeInstalled", CallingConvention = CallingConvention.Cdecl)] + internal static extern bool IsRuntimeInstalled(); + [DllImportAttribute("openvr_api", EntryPoint = "VR_GetStringForHmdError", CallingConvention = CallingConvention.Cdecl)] + internal static extern IntPtr GetStringForHmdError(EVRInitError error); + [DllImportAttribute("openvr_api", EntryPoint = "VR_GetGenericInterface", CallingConvention = CallingConvention.Cdecl)] + internal static extern IntPtr GetGenericInterface([In, MarshalAs(UnmanagedType.LPStr)] string pchInterfaceVersion, ref EVRInitError peError); + [DllImportAttribute("openvr_api", EntryPoint = "VR_IsInterfaceVersionValid", CallingConvention = CallingConvention.Cdecl)] + internal static extern bool IsInterfaceVersionValid([In, MarshalAs(UnmanagedType.LPStr)] string pchInterfaceVersion); + [DllImportAttribute("openvr_api", EntryPoint = "VR_GetInitToken", CallingConvention = CallingConvention.Cdecl)] + internal static extern uint GetInitToken(); +} + + +public enum EVREye +{ + Eye_Left = 0, + Eye_Right = 1, +} +public enum ETextureType +{ + DirectX = 0, + OpenGL = 1, + Vulkan = 2, + IOSurface = 3, + DirectX12 = 4, +} +public enum EColorSpace +{ + Auto = 0, + Gamma = 1, + Linear = 2, +} +public enum ETrackingResult +{ + Uninitialized = 1, + Calibrating_InProgress = 100, + Calibrating_OutOfRange = 101, + Running_OK = 200, + Running_OutOfRange = 201, +} +public enum ETrackedDeviceClass +{ + Invalid = 0, + HMD = 1, + Controller = 2, + GenericTracker = 3, + TrackingReference = 4, + DisplayRedirect = 5, +} +public enum ETrackedControllerRole +{ + Invalid = 0, + LeftHand = 1, + RightHand = 2, +} +public enum ETrackingUniverseOrigin +{ + TrackingUniverseSeated = 0, + TrackingUniverseStanding = 1, + TrackingUniverseRawAndUncalibrated = 2, +} +public enum ETrackedDeviceProperty +{ + Prop_Invalid = 0, + Prop_TrackingSystemName_String = 1000, + Prop_ModelNumber_String = 1001, + Prop_SerialNumber_String = 1002, + Prop_RenderModelName_String = 1003, + Prop_WillDriftInYaw_Bool = 1004, + Prop_ManufacturerName_String = 1005, + Prop_TrackingFirmwareVersion_String = 1006, + Prop_HardwareRevision_String = 1007, + Prop_AllWirelessDongleDescriptions_String = 1008, + Prop_ConnectedWirelessDongle_String = 1009, + Prop_DeviceIsWireless_Bool = 1010, + Prop_DeviceIsCharging_Bool = 1011, + Prop_DeviceBatteryPercentage_Float = 1012, + Prop_StatusDisplayTransform_Matrix34 = 1013, + Prop_Firmware_UpdateAvailable_Bool = 1014, + Prop_Firmware_ManualUpdate_Bool = 1015, + Prop_Firmware_ManualUpdateURL_String = 1016, + Prop_HardwareRevision_Uint64 = 1017, + Prop_FirmwareVersion_Uint64 = 1018, + Prop_FPGAVersion_Uint64 = 1019, + Prop_VRCVersion_Uint64 = 1020, + Prop_RadioVersion_Uint64 = 1021, + Prop_DongleVersion_Uint64 = 1022, + Prop_BlockServerShutdown_Bool = 1023, + Prop_CanUnifyCoordinateSystemWithHmd_Bool = 1024, + Prop_ContainsProximitySensor_Bool = 1025, + Prop_DeviceProvidesBatteryStatus_Bool = 1026, + Prop_DeviceCanPowerOff_Bool = 1027, + Prop_Firmware_ProgrammingTarget_String = 1028, + Prop_DeviceClass_Int32 = 1029, + Prop_HasCamera_Bool = 1030, + Prop_DriverVersion_String = 1031, + Prop_Firmware_ForceUpdateRequired_Bool = 1032, + Prop_ViveSystemButtonFixRequired_Bool = 1033, + Prop_ParentDriver_Uint64 = 1034, + Prop_ResourceRoot_String = 1035, + Prop_ReportsTimeSinceVSync_Bool = 2000, + Prop_SecondsFromVsyncToPhotons_Float = 2001, + Prop_DisplayFrequency_Float = 2002, + Prop_UserIpdMeters_Float = 2003, + Prop_CurrentUniverseId_Uint64 = 2004, + Prop_PreviousUniverseId_Uint64 = 2005, + Prop_DisplayFirmwareVersion_Uint64 = 2006, + Prop_IsOnDesktop_Bool = 2007, + Prop_DisplayMCType_Int32 = 2008, + Prop_DisplayMCOffset_Float = 2009, + Prop_DisplayMCScale_Float = 2010, + Prop_EdidVendorID_Int32 = 2011, + Prop_DisplayMCImageLeft_String = 2012, + Prop_DisplayMCImageRight_String = 2013, + Prop_DisplayGCBlackClamp_Float = 2014, + Prop_EdidProductID_Int32 = 2015, + Prop_CameraToHeadTransform_Matrix34 = 2016, + Prop_DisplayGCType_Int32 = 2017, + Prop_DisplayGCOffset_Float = 2018, + Prop_DisplayGCScale_Float = 2019, + Prop_DisplayGCPrescale_Float = 2020, + Prop_DisplayGCImage_String = 2021, + Prop_LensCenterLeftU_Float = 2022, + Prop_LensCenterLeftV_Float = 2023, + Prop_LensCenterRightU_Float = 2024, + Prop_LensCenterRightV_Float = 2025, + Prop_UserHeadToEyeDepthMeters_Float = 2026, + Prop_CameraFirmwareVersion_Uint64 = 2027, + Prop_CameraFirmwareDescription_String = 2028, + Prop_DisplayFPGAVersion_Uint64 = 2029, + Prop_DisplayBootloaderVersion_Uint64 = 2030, + Prop_DisplayHardwareVersion_Uint64 = 2031, + Prop_AudioFirmwareVersion_Uint64 = 2032, + Prop_CameraCompatibilityMode_Int32 = 2033, + Prop_ScreenshotHorizontalFieldOfViewDegrees_Float = 2034, + Prop_ScreenshotVerticalFieldOfViewDegrees_Float = 2035, + Prop_DisplaySuppressed_Bool = 2036, + Prop_DisplayAllowNightMode_Bool = 2037, + Prop_DisplayMCImageWidth_Int32 = 2038, + Prop_DisplayMCImageHeight_Int32 = 2039, + Prop_DisplayMCImageNumChannels_Int32 = 2040, + Prop_DisplayMCImageData_Binary = 2041, + Prop_SecondsFromPhotonsToVblank_Float = 2042, + Prop_DriverDirectModeSendsVsyncEvents_Bool = 2043, + Prop_DisplayDebugMode_Bool = 2044, + Prop_GraphicsAdapterLuid_Uint64 = 2045, + Prop_AttachedDeviceId_String = 3000, + Prop_SupportedButtons_Uint64 = 3001, + Prop_Axis0Type_Int32 = 3002, + Prop_Axis1Type_Int32 = 3003, + Prop_Axis2Type_Int32 = 3004, + Prop_Axis3Type_Int32 = 3005, + Prop_Axis4Type_Int32 = 3006, + Prop_ControllerRoleHint_Int32 = 3007, + Prop_FieldOfViewLeftDegrees_Float = 4000, + Prop_FieldOfViewRightDegrees_Float = 4001, + Prop_FieldOfViewTopDegrees_Float = 4002, + Prop_FieldOfViewBottomDegrees_Float = 4003, + Prop_TrackingRangeMinimumMeters_Float = 4004, + Prop_TrackingRangeMaximumMeters_Float = 4005, + Prop_ModeLabel_String = 4006, + Prop_IconPathName_String = 5000, + Prop_NamedIconPathDeviceOff_String = 5001, + Prop_NamedIconPathDeviceSearching_String = 5002, + Prop_NamedIconPathDeviceSearchingAlert_String = 5003, + Prop_NamedIconPathDeviceReady_String = 5004, + Prop_NamedIconPathDeviceReadyAlert_String = 5005, + Prop_NamedIconPathDeviceNotReady_String = 5006, + Prop_NamedIconPathDeviceStandby_String = 5007, + Prop_NamedIconPathDeviceAlertLow_String = 5008, + Prop_DisplayHiddenArea_Binary_Start = 5100, + Prop_DisplayHiddenArea_Binary_End = 5150, + Prop_UserConfigPath_String = 6000, + Prop_InstallPath_String = 6001, + Prop_HasDisplayComponent_Bool = 6002, + Prop_HasControllerComponent_Bool = 6003, + Prop_HasCameraComponent_Bool = 6004, + Prop_HasDriverDirectModeComponent_Bool = 6005, + Prop_HasVirtualDisplayComponent_Bool = 6006, + Prop_VendorSpecific_Reserved_Start = 10000, + Prop_VendorSpecific_Reserved_End = 10999, +} +public enum ETrackedPropertyError +{ + TrackedProp_Success = 0, + TrackedProp_WrongDataType = 1, + TrackedProp_WrongDeviceClass = 2, + TrackedProp_BufferTooSmall = 3, + TrackedProp_UnknownProperty = 4, + TrackedProp_InvalidDevice = 5, + TrackedProp_CouldNotContactServer = 6, + TrackedProp_ValueNotProvidedByDevice = 7, + TrackedProp_StringExceedsMaximumLength = 8, + TrackedProp_NotYetAvailable = 9, + TrackedProp_PermissionDenied = 10, + TrackedProp_InvalidOperation = 11, +} +public enum EVRSubmitFlags +{ + Submit_Default = 0, + Submit_LensDistortionAlreadyApplied = 1, + Submit_GlRenderBuffer = 2, + Submit_Reserved = 4, +} +public enum EVRState +{ + Undefined = -1, + Off = 0, + Searching = 1, + Searching_Alert = 2, + Ready = 3, + Ready_Alert = 4, + NotReady = 5, + Standby = 6, + Ready_Alert_Low = 7, +} +public enum EVREventType +{ + VREvent_None = 0, + VREvent_TrackedDeviceActivated = 100, + VREvent_TrackedDeviceDeactivated = 101, + VREvent_TrackedDeviceUpdated = 102, + VREvent_TrackedDeviceUserInteractionStarted = 103, + VREvent_TrackedDeviceUserInteractionEnded = 104, + VREvent_IpdChanged = 105, + VREvent_EnterStandbyMode = 106, + VREvent_LeaveStandbyMode = 107, + VREvent_TrackedDeviceRoleChanged = 108, + VREvent_WatchdogWakeUpRequested = 109, + VREvent_LensDistortionChanged = 110, + VREvent_PropertyChanged = 111, + VREvent_ButtonPress = 200, + VREvent_ButtonUnpress = 201, + VREvent_ButtonTouch = 202, + VREvent_ButtonUntouch = 203, + VREvent_MouseMove = 300, + VREvent_MouseButtonDown = 301, + VREvent_MouseButtonUp = 302, + VREvent_FocusEnter = 303, + VREvent_FocusLeave = 304, + VREvent_Scroll = 305, + VREvent_TouchPadMove = 306, + VREvent_OverlayFocusChanged = 307, + VREvent_InputFocusCaptured = 400, + VREvent_InputFocusReleased = 401, + VREvent_SceneFocusLost = 402, + VREvent_SceneFocusGained = 403, + VREvent_SceneApplicationChanged = 404, + VREvent_SceneFocusChanged = 405, + VREvent_InputFocusChanged = 406, + VREvent_SceneApplicationSecondaryRenderingStarted = 407, + VREvent_HideRenderModels = 410, + VREvent_ShowRenderModels = 411, + VREvent_OverlayShown = 500, + VREvent_OverlayHidden = 501, + VREvent_DashboardActivated = 502, + VREvent_DashboardDeactivated = 503, + VREvent_DashboardThumbSelected = 504, + VREvent_DashboardRequested = 505, + VREvent_ResetDashboard = 506, + VREvent_RenderToast = 507, + VREvent_ImageLoaded = 508, + VREvent_ShowKeyboard = 509, + VREvent_HideKeyboard = 510, + VREvent_OverlayGamepadFocusGained = 511, + VREvent_OverlayGamepadFocusLost = 512, + VREvent_OverlaySharedTextureChanged = 513, + VREvent_DashboardGuideButtonDown = 514, + VREvent_DashboardGuideButtonUp = 515, + VREvent_ScreenshotTriggered = 516, + VREvent_ImageFailed = 517, + VREvent_DashboardOverlayCreated = 518, + VREvent_RequestScreenshot = 520, + VREvent_ScreenshotTaken = 521, + VREvent_ScreenshotFailed = 522, + VREvent_SubmitScreenshotToDashboard = 523, + VREvent_ScreenshotProgressToDashboard = 524, + VREvent_PrimaryDashboardDeviceChanged = 525, + VREvent_Notification_Shown = 600, + VREvent_Notification_Hidden = 601, + VREvent_Notification_BeginInteraction = 602, + VREvent_Notification_Destroyed = 603, + VREvent_Quit = 700, + VREvent_ProcessQuit = 701, + VREvent_QuitAborted_UserPrompt = 702, + VREvent_QuitAcknowledged = 703, + VREvent_DriverRequestedQuit = 704, + VREvent_ChaperoneDataHasChanged = 800, + VREvent_ChaperoneUniverseHasChanged = 801, + VREvent_ChaperoneTempDataHasChanged = 802, + VREvent_ChaperoneSettingsHaveChanged = 803, + VREvent_SeatedZeroPoseReset = 804, + VREvent_AudioSettingsHaveChanged = 820, + VREvent_BackgroundSettingHasChanged = 850, + VREvent_CameraSettingsHaveChanged = 851, + VREvent_ReprojectionSettingHasChanged = 852, + VREvent_ModelSkinSettingsHaveChanged = 853, + VREvent_EnvironmentSettingsHaveChanged = 854, + VREvent_PowerSettingsHaveChanged = 855, + VREvent_EnableHomeAppSettingsHaveChanged = 856, + VREvent_StatusUpdate = 900, + VREvent_MCImageUpdated = 1000, + VREvent_FirmwareUpdateStarted = 1100, + VREvent_FirmwareUpdateFinished = 1101, + VREvent_KeyboardClosed = 1200, + VREvent_KeyboardCharInput = 1201, + VREvent_KeyboardDone = 1202, + VREvent_ApplicationTransitionStarted = 1300, + VREvent_ApplicationTransitionAborted = 1301, + VREvent_ApplicationTransitionNewAppStarted = 1302, + VREvent_ApplicationListUpdated = 1303, + VREvent_ApplicationMimeTypeLoad = 1304, + VREvent_ApplicationTransitionNewAppLaunchComplete = 1305, + VREvent_ProcessConnected = 1306, + VREvent_ProcessDisconnected = 1307, + VREvent_Compositor_MirrorWindowShown = 1400, + VREvent_Compositor_MirrorWindowHidden = 1401, + VREvent_Compositor_ChaperoneBoundsShown = 1410, + VREvent_Compositor_ChaperoneBoundsHidden = 1411, + VREvent_TrackedCamera_StartVideoStream = 1500, + VREvent_TrackedCamera_StopVideoStream = 1501, + VREvent_TrackedCamera_PauseVideoStream = 1502, + VREvent_TrackedCamera_ResumeVideoStream = 1503, + VREvent_TrackedCamera_EditingSurface = 1550, + VREvent_PerformanceTest_EnableCapture = 1600, + VREvent_PerformanceTest_DisableCapture = 1601, + VREvent_PerformanceTest_FidelityLevel = 1602, + VREvent_MessageOverlay_Closed = 1650, + VREvent_VendorSpecific_Reserved_Start = 10000, + VREvent_VendorSpecific_Reserved_End = 19999, +} +public enum EDeviceActivityLevel +{ + k_EDeviceActivityLevel_Unknown = -1, + k_EDeviceActivityLevel_Idle = 0, + k_EDeviceActivityLevel_UserInteraction = 1, + k_EDeviceActivityLevel_UserInteraction_Timeout = 2, + k_EDeviceActivityLevel_Standby = 3, +} +public enum EVRButtonId +{ + k_EButton_System = 0, + k_EButton_ApplicationMenu = 1, + k_EButton_Grip = 2, + k_EButton_DPad_Left = 3, + k_EButton_DPad_Up = 4, + k_EButton_DPad_Right = 5, + k_EButton_DPad_Down = 6, + k_EButton_A = 7, + k_EButton_ProximitySensor = 31, + k_EButton_Axis0 = 32, + k_EButton_Axis1 = 33, + k_EButton_Axis2 = 34, + k_EButton_Axis3 = 35, + k_EButton_Axis4 = 36, + k_EButton_SteamVR_Touchpad = 32, + k_EButton_SteamVR_Trigger = 33, + k_EButton_Dashboard_Back = 2, + k_EButton_Max = 64, +} +public enum EVRMouseButton +{ + Left = 1, + Right = 2, + Middle = 4, +} +public enum EHiddenAreaMeshType +{ + k_eHiddenAreaMesh_Standard = 0, + k_eHiddenAreaMesh_Inverse = 1, + k_eHiddenAreaMesh_LineLoop = 2, + k_eHiddenAreaMesh_Max = 3, +} +public enum EVRControllerAxisType +{ + k_eControllerAxis_None = 0, + k_eControllerAxis_TrackPad = 1, + k_eControllerAxis_Joystick = 2, + k_eControllerAxis_Trigger = 3, +} +public enum EVRControllerEventOutputType +{ + ControllerEventOutput_OSEvents = 0, + ControllerEventOutput_VREvents = 1, +} +public enum ECollisionBoundsStyle +{ + COLLISION_BOUNDS_STYLE_BEGINNER = 0, + COLLISION_BOUNDS_STYLE_INTERMEDIATE = 1, + COLLISION_BOUNDS_STYLE_SQUARES = 2, + COLLISION_BOUNDS_STYLE_ADVANCED = 3, + COLLISION_BOUNDS_STYLE_NONE = 4, + COLLISION_BOUNDS_STYLE_COUNT = 5, +} +public enum EVROverlayError +{ + None = 0, + UnknownOverlay = 10, + InvalidHandle = 11, + PermissionDenied = 12, + OverlayLimitExceeded = 13, + WrongVisibilityType = 14, + KeyTooLong = 15, + NameTooLong = 16, + KeyInUse = 17, + WrongTransformType = 18, + InvalidTrackedDevice = 19, + InvalidParameter = 20, + ThumbnailCantBeDestroyed = 21, + ArrayTooSmall = 22, + RequestFailed = 23, + InvalidTexture = 24, + UnableToLoadFile = 25, + KeyboardAlreadyInUse = 26, + NoNeighbor = 27, + TooManyMaskPrimitives = 29, + BadMaskPrimitive = 30, +} +public enum EVRApplicationType +{ + VRApplication_Other = 0, + VRApplication_Scene = 1, + VRApplication_Overlay = 2, + VRApplication_Background = 3, + VRApplication_Utility = 4, + VRApplication_VRMonitor = 5, + VRApplication_SteamWatchdog = 6, + VRApplication_Bootstrapper = 7, + VRApplication_Max = 8, +} +public enum EVRFirmwareError +{ + None = 0, + Success = 1, + Fail = 2, +} +public enum EVRNotificationError +{ + OK = 0, + InvalidNotificationId = 100, + NotificationQueueFull = 101, + InvalidOverlayHandle = 102, + SystemWithUserValueAlreadyExists = 103, +} +public enum EVRInitError +{ + None = 0, + Unknown = 1, + Init_InstallationNotFound = 100, + Init_InstallationCorrupt = 101, + Init_VRClientDLLNotFound = 102, + Init_FileNotFound = 103, + Init_FactoryNotFound = 104, + Init_InterfaceNotFound = 105, + Init_InvalidInterface = 106, + Init_UserConfigDirectoryInvalid = 107, + Init_HmdNotFound = 108, + Init_NotInitialized = 109, + Init_PathRegistryNotFound = 110, + Init_NoConfigPath = 111, + Init_NoLogPath = 112, + Init_PathRegistryNotWritable = 113, + Init_AppInfoInitFailed = 114, + Init_Retry = 115, + Init_InitCanceledByUser = 116, + Init_AnotherAppLaunching = 117, + Init_SettingsInitFailed = 118, + Init_ShuttingDown = 119, + Init_TooManyObjects = 120, + Init_NoServerForBackgroundApp = 121, + Init_NotSupportedWithCompositor = 122, + Init_NotAvailableToUtilityApps = 123, + Init_Internal = 124, + Init_HmdDriverIdIsNone = 125, + Init_HmdNotFoundPresenceFailed = 126, + Init_VRMonitorNotFound = 127, + Init_VRMonitorStartupFailed = 128, + Init_LowPowerWatchdogNotSupported = 129, + Init_InvalidApplicationType = 130, + Init_NotAvailableToWatchdogApps = 131, + Init_WatchdogDisabledInSettings = 132, + Init_VRDashboardNotFound = 133, + Init_VRDashboardStartupFailed = 134, + Init_VRHomeNotFound = 135, + Init_VRHomeStartupFailed = 136, + Driver_Failed = 200, + Driver_Unknown = 201, + Driver_HmdUnknown = 202, + Driver_NotLoaded = 203, + Driver_RuntimeOutOfDate = 204, + Driver_HmdInUse = 205, + Driver_NotCalibrated = 206, + Driver_CalibrationInvalid = 207, + Driver_HmdDisplayNotFound = 208, + Driver_TrackedDeviceInterfaceUnknown = 209, + Driver_HmdDriverIdOutOfBounds = 211, + Driver_HmdDisplayMirrored = 212, + IPC_ServerInitFailed = 300, + IPC_ConnectFailed = 301, + IPC_SharedStateInitFailed = 302, + IPC_CompositorInitFailed = 303, + IPC_MutexInitFailed = 304, + IPC_Failed = 305, + IPC_CompositorConnectFailed = 306, + IPC_CompositorInvalidConnectResponse = 307, + IPC_ConnectFailedAfterMultipleAttempts = 308, + Compositor_Failed = 400, + Compositor_D3D11HardwareRequired = 401, + Compositor_FirmwareRequiresUpdate = 402, + Compositor_OverlayInitFailed = 403, + Compositor_ScreenshotsInitFailed = 404, + Compositor_UnableToCreateDevice = 405, + VendorSpecific_UnableToConnectToOculusRuntime = 1000, + VendorSpecific_HmdFound_CantOpenDevice = 1101, + VendorSpecific_HmdFound_UnableToRequestConfigStart = 1102, + VendorSpecific_HmdFound_NoStoredConfig = 1103, + VendorSpecific_HmdFound_ConfigTooBig = 1104, + VendorSpecific_HmdFound_ConfigTooSmall = 1105, + VendorSpecific_HmdFound_UnableToInitZLib = 1106, + VendorSpecific_HmdFound_CantReadFirmwareVersion = 1107, + VendorSpecific_HmdFound_UnableToSendUserDataStart = 1108, + VendorSpecific_HmdFound_UnableToGetUserDataStart = 1109, + VendorSpecific_HmdFound_UnableToGetUserDataNext = 1110, + VendorSpecific_HmdFound_UserDataAddressRange = 1111, + VendorSpecific_HmdFound_UserDataError = 1112, + VendorSpecific_HmdFound_ConfigFailedSanityCheck = 1113, + Steam_SteamInstallationNotFound = 2000, +} +public enum EVRScreenshotType +{ + None = 0, + Mono = 1, + Stereo = 2, + Cubemap = 3, + MonoPanorama = 4, + StereoPanorama = 5, +} +public enum EVRScreenshotPropertyFilenames +{ + Preview = 0, + VR = 1, +} +public enum EVRTrackedCameraError +{ + None = 0, + OperationFailed = 100, + InvalidHandle = 101, + InvalidFrameHeaderVersion = 102, + OutOfHandles = 103, + IPCFailure = 104, + NotSupportedForThisDevice = 105, + SharedMemoryFailure = 106, + FrameBufferingFailure = 107, + StreamSetupFailure = 108, + InvalidGLTextureId = 109, + InvalidSharedTextureHandle = 110, + FailedToGetGLTextureId = 111, + SharedTextureFailure = 112, + NoFrameAvailable = 113, + InvalidArgument = 114, + InvalidFrameBufferSize = 115, +} +public enum EVRTrackedCameraFrameType +{ + Distorted = 0, + Undistorted = 1, + MaximumUndistorted = 2, + MAX_CAMERA_FRAME_TYPES = 3, +} +public enum EVRApplicationError +{ + None = 0, + AppKeyAlreadyExists = 100, + NoManifest = 101, + NoApplication = 102, + InvalidIndex = 103, + UnknownApplication = 104, + IPCFailed = 105, + ApplicationAlreadyRunning = 106, + InvalidManifest = 107, + InvalidApplication = 108, + LaunchFailed = 109, + ApplicationAlreadyStarting = 110, + LaunchInProgress = 111, + OldApplicationQuitting = 112, + TransitionAborted = 113, + IsTemplate = 114, + BufferTooSmall = 200, + PropertyNotSet = 201, + UnknownProperty = 202, + InvalidParameter = 203, +} +public enum EVRApplicationProperty +{ + Name_String = 0, + LaunchType_String = 11, + WorkingDirectory_String = 12, + BinaryPath_String = 13, + Arguments_String = 14, + URL_String = 15, + Description_String = 50, + NewsURL_String = 51, + ImagePath_String = 52, + Source_String = 53, + IsDashboardOverlay_Bool = 60, + IsTemplate_Bool = 61, + IsInstanced_Bool = 62, + IsInternal_Bool = 63, + LastLaunchTime_Uint64 = 70, +} +public enum EVRApplicationTransitionState +{ + VRApplicationTransition_None = 0, + VRApplicationTransition_OldAppQuitSent = 10, + VRApplicationTransition_WaitingForExternalLaunch = 11, + VRApplicationTransition_NewAppLaunched = 20, +} +public enum ChaperoneCalibrationState +{ + OK = 1, + Warning = 100, + Warning_BaseStationMayHaveMoved = 101, + Warning_BaseStationRemoved = 102, + Warning_SeatedBoundsInvalid = 103, + Error = 200, + Error_BaseStationUninitialized = 201, + Error_BaseStationConflict = 202, + Error_PlayAreaInvalid = 203, + Error_CollisionBoundsInvalid = 204, +} +public enum EChaperoneConfigFile +{ + Live = 1, + Temp = 2, +} +public enum EChaperoneImportFlags +{ + EChaperoneImport_BoundsOnly = 1, +} +public enum EVRCompositorError +{ + None = 0, + RequestFailed = 1, + IncompatibleVersion = 100, + DoNotHaveFocus = 101, + InvalidTexture = 102, + IsNotSceneApplication = 103, + TextureIsOnWrongDevice = 104, + TextureUsesUnsupportedFormat = 105, + SharedTexturesNotSupported = 106, + IndexOutOfRange = 107, + AlreadySubmitted = 108, +} +public enum VROverlayInputMethod +{ + None = 0, + Mouse = 1, +} +public enum VROverlayTransformType +{ + VROverlayTransform_Absolute = 0, + VROverlayTransform_TrackedDeviceRelative = 1, + VROverlayTransform_SystemOverlay = 2, + VROverlayTransform_TrackedComponent = 3, +} +public enum VROverlayFlags +{ + None = 0, + Curved = 1, + RGSS4X = 2, + NoDashboardTab = 3, + AcceptsGamepadEvents = 4, + ShowGamepadFocus = 5, + SendVRScrollEvents = 6, + SendVRTouchpadEvents = 7, + ShowTouchPadScrollWheel = 8, + TransferOwnershipToInternalProcess = 9, + SideBySide_Parallel = 10, + SideBySide_Crossed = 11, + Panorama = 12, + StereoPanorama = 13, + SortWithNonSceneOverlays = 14, + VisibleInDashboard = 15, +} +public enum VRMessageOverlayResponse +{ + ButtonPress_0 = 0, + ButtonPress_1 = 1, + ButtonPress_2 = 2, + ButtonPress_3 = 3, + CouldntFindSystemOverlay = 4, + CouldntFindOrCreateClientOverlay = 5, + ApplicationQuit = 6, +} +public enum EGamepadTextInputMode +{ + k_EGamepadTextInputModeNormal = 0, + k_EGamepadTextInputModePassword = 1, + k_EGamepadTextInputModeSubmit = 2, +} +public enum EGamepadTextInputLineMode +{ + k_EGamepadTextInputLineModeSingleLine = 0, + k_EGamepadTextInputLineModeMultipleLines = 1, +} +public enum EOverlayDirection +{ + Up = 0, + Down = 1, + Left = 2, + Right = 3, + Count = 4, +} +public enum EVROverlayIntersectionMaskPrimitiveType +{ + OverlayIntersectionPrimitiveType_Rectangle = 0, + OverlayIntersectionPrimitiveType_Circle = 1, +} +public enum EVRRenderModelError +{ + None = 0, + Loading = 100, + NotSupported = 200, + InvalidArg = 300, + InvalidModel = 301, + NoShapes = 302, + MultipleShapes = 303, + TooManyVertices = 304, + MultipleTextures = 305, + BufferTooSmall = 306, + NotEnoughNormals = 307, + NotEnoughTexCoords = 308, + InvalidTexture = 400, +} +public enum EVRComponentProperty +{ + IsStatic = 1, + IsVisible = 2, + IsTouched = 4, + IsPressed = 8, + IsScrolled = 16, +} +public enum EVRNotificationType +{ + Transient = 0, + Persistent = 1, + Transient_SystemWithUserValue = 2, +} +public enum EVRNotificationStyle +{ + None = 0, + Application = 100, + Contact_Disabled = 200, + Contact_Enabled = 201, + Contact_Active = 202, +} +public enum EVRSettingsError +{ + None = 0, + IPCFailed = 1, + WriteFailed = 2, + ReadFailed = 3, + JsonParseFailed = 4, + UnsetSettingHasNoDefault = 5, +} +public enum EVRScreenshotError +{ + None = 0, + RequestFailed = 1, + IncompatibleVersion = 100, + NotFound = 101, + BufferTooSmall = 102, + ScreenshotAlreadyInProgress = 108, +} + +[StructLayout(LayoutKind.Explicit)] public struct VREvent_Data_t +{ + [FieldOffset(0)] public VREvent_Reserved_t reserved; + [FieldOffset(0)] public VREvent_Controller_t controller; + [FieldOffset(0)] public VREvent_Mouse_t mouse; + [FieldOffset(0)] public VREvent_Scroll_t scroll; + [FieldOffset(0)] public VREvent_Process_t process; + [FieldOffset(0)] public VREvent_Notification_t notification; + [FieldOffset(0)] public VREvent_Overlay_t overlay; + [FieldOffset(0)] public VREvent_Status_t status; + [FieldOffset(0)] public VREvent_Ipd_t ipd; + [FieldOffset(0)] public VREvent_Chaperone_t chaperone; + [FieldOffset(0)] public VREvent_PerformanceTest_t performanceTest; + [FieldOffset(0)] public VREvent_TouchPadMove_t touchPadMove; + [FieldOffset(0)] public VREvent_SeatedZeroPoseReset_t seatedZeroPoseReset; + [FieldOffset(0)] public VREvent_Screenshot_t screenshot; + [FieldOffset(0)] public VREvent_ScreenshotProgress_t screenshotProgress; + [FieldOffset(0)] public VREvent_ApplicationLaunch_t applicationLaunch; + [FieldOffset(0)] public VREvent_EditingCameraSurface_t cameraSurface; + [FieldOffset(0)] public VREvent_MessageOverlay_t messageOverlay; + [FieldOffset(0)] public VREvent_Keyboard_t keyboard; // This has to be at the end due to a mono bug +} + + +[StructLayout(LayoutKind.Explicit)] public struct VROverlayIntersectionMaskPrimitive_Data_t +{ + [FieldOffset(0)] public IntersectionMaskRectangle_t m_Rectangle; + [FieldOffset(0)] public IntersectionMaskCircle_t m_Circle; +} + +[StructLayout(LayoutKind.Sequential)] public struct HmdMatrix34_t +{ + public float m0; //float[3][4] + public float m1; + public float m2; + public float m3; + public float m4; + public float m5; + public float m6; + public float m7; + public float m8; + public float m9; + public float m10; + public float m11; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdMatrix44_t +{ + public float m0; //float[4][4] + public float m1; + public float m2; + public float m3; + public float m4; + public float m5; + public float m6; + public float m7; + public float m8; + public float m9; + public float m10; + public float m11; + public float m12; + public float m13; + public float m14; + public float m15; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdVector3_t +{ + public float v0; //float[3] + public float v1; + public float v2; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdVector4_t +{ + public float v0; //float[4] + public float v1; + public float v2; + public float v3; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdVector3d_t +{ + public double v0; //double[3] + public double v1; + public double v2; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdVector2_t +{ + public float v0; //float[2] + public float v1; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdQuaternion_t +{ + public double w; + public double x; + public double y; + public double z; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdColor_t +{ + public float r; + public float g; + public float b; + public float a; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdQuad_t +{ + public HmdVector3_t vCorners0; //HmdVector3_t[4] + public HmdVector3_t vCorners1; + public HmdVector3_t vCorners2; + public HmdVector3_t vCorners3; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdRect2_t +{ + public HmdVector2_t vTopLeft; + public HmdVector2_t vBottomRight; +} +[StructLayout(LayoutKind.Sequential)] public struct DistortionCoordinates_t +{ + public float rfRed0; //float[2] + public float rfRed1; + public float rfGreen0; //float[2] + public float rfGreen1; + public float rfBlue0; //float[2] + public float rfBlue1; +} +[StructLayout(LayoutKind.Sequential)] public struct Texture_t +{ + public IntPtr handle; // void * + public ETextureType eType; + public EColorSpace eColorSpace; +} +[StructLayout(LayoutKind.Sequential)] public struct TrackedDevicePose_t +{ + public HmdMatrix34_t mDeviceToAbsoluteTracking; + public HmdVector3_t vVelocity; + public HmdVector3_t vAngularVelocity; + public ETrackingResult eTrackingResult; + [MarshalAs(UnmanagedType.I1)] + public bool bPoseIsValid; + [MarshalAs(UnmanagedType.I1)] + public bool bDeviceIsConnected; +} +[StructLayout(LayoutKind.Sequential)] public struct VRTextureBounds_t +{ + public float uMin; + public float vMin; + public float uMax; + public float vMax; +} +[StructLayout(LayoutKind.Sequential)] public struct VRVulkanTextureData_t +{ + public ulong m_nImage; + public IntPtr m_pDevice; // struct VkDevice_T * + public IntPtr m_pPhysicalDevice; // struct VkPhysicalDevice_T * + public IntPtr m_pInstance; // struct VkInstance_T * + public IntPtr m_pQueue; // struct VkQueue_T * + public uint m_nQueueFamilyIndex; + public uint m_nWidth; + public uint m_nHeight; + public uint m_nFormat; + public uint m_nSampleCount; +} +[StructLayout(LayoutKind.Sequential)] public struct D3D12TextureData_t +{ + public IntPtr m_pResource; // struct ID3D12Resource * + public IntPtr m_pCommandQueue; // struct ID3D12CommandQueue * + public uint m_nNodeMask; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Controller_t +{ + public uint button; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Mouse_t +{ + public float x; + public float y; + public uint button; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Scroll_t +{ + public float xdelta; + public float ydelta; + public uint repeatCount; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_TouchPadMove_t +{ + [MarshalAs(UnmanagedType.I1)] + public bool bFingerDown; + public float flSecondsFingerDown; + public float fValueXFirst; + public float fValueYFirst; + public float fValueXRaw; + public float fValueYRaw; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Notification_t +{ + public ulong ulUserValue; + public uint notificationId; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Process_t +{ + public uint pid; + public uint oldPid; + [MarshalAs(UnmanagedType.I1)] + public bool bForced; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Overlay_t +{ + public ulong overlayHandle; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Status_t +{ + public uint statusState; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Keyboard_t +{ + public byte cNewInput0,cNewInput1,cNewInput2,cNewInput3,cNewInput4,cNewInput5,cNewInput6,cNewInput7; + public ulong uUserValue; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Ipd_t +{ + public float ipdMeters; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Chaperone_t +{ + public ulong m_nPreviousUniverse; + public ulong m_nCurrentUniverse; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Reserved_t +{ + public ulong reserved0; + public ulong reserved1; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_PerformanceTest_t +{ + public uint m_nFidelityLevel; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_SeatedZeroPoseReset_t +{ + [MarshalAs(UnmanagedType.I1)] + public bool bResetBySystemMenu; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Screenshot_t +{ + public uint handle; + public uint type; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_ScreenshotProgress_t +{ + public float progress; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_ApplicationLaunch_t +{ + public uint pid; + public uint unArgsHandle; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_EditingCameraSurface_t +{ + public ulong overlayHandle; + public uint nVisualMode; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_MessageOverlay_t +{ + public uint unVRMessageOverlayResponse; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Property_t +{ + public ulong container; + public ETrackedDeviceProperty prop; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_t +{ + public uint eventType; + public uint trackedDeviceIndex; + public float eventAgeSeconds; + public VREvent_Data_t data; +} +// This structure is for backwards binary compatibility on Linux and OSX only +[StructLayout(LayoutKind.Sequential, Pack = 4)] public struct VREvent_t_Packed +{ + public uint eventType; + public uint trackedDeviceIndex; + public float eventAgeSeconds; + public VREvent_Data_t data; + public VREvent_t_Packed(VREvent_t unpacked) + { + this.eventType = unpacked.eventType; + this.trackedDeviceIndex = unpacked.trackedDeviceIndex; + this.eventAgeSeconds = unpacked.eventAgeSeconds; + this.data = unpacked.data; + } + public void Unpack(ref VREvent_t unpacked) + { + unpacked.eventType = this.eventType; + unpacked.trackedDeviceIndex = this.trackedDeviceIndex; + unpacked.eventAgeSeconds = this.eventAgeSeconds; + unpacked.data = this.data; + } +} +[StructLayout(LayoutKind.Sequential)] public struct HiddenAreaMesh_t +{ + public IntPtr pVertexData; // const struct vr::HmdVector2_t * + public uint unTriangleCount; +} +[StructLayout(LayoutKind.Sequential)] public struct VRControllerAxis_t +{ + public float x; + public float y; +} +[StructLayout(LayoutKind.Sequential)] public struct VRControllerState_t +{ + public uint unPacketNum; + public ulong ulButtonPressed; + public ulong ulButtonTouched; + public VRControllerAxis_t rAxis0; //VRControllerAxis_t[5] + public VRControllerAxis_t rAxis1; + public VRControllerAxis_t rAxis2; + public VRControllerAxis_t rAxis3; + public VRControllerAxis_t rAxis4; +} +// This structure is for backwards binary compatibility on Linux and OSX only +[StructLayout(LayoutKind.Sequential, Pack = 4)] public struct VRControllerState_t_Packed +{ + public uint unPacketNum; + public ulong ulButtonPressed; + public ulong ulButtonTouched; + public VRControllerAxis_t rAxis0; //VRControllerAxis_t[5] + public VRControllerAxis_t rAxis1; + public VRControllerAxis_t rAxis2; + public VRControllerAxis_t rAxis3; + public VRControllerAxis_t rAxis4; + public VRControllerState_t_Packed(VRControllerState_t unpacked) + { + this.unPacketNum = unpacked.unPacketNum; + this.ulButtonPressed = unpacked.ulButtonPressed; + this.ulButtonTouched = unpacked.ulButtonTouched; + this.rAxis0 = unpacked.rAxis0; + this.rAxis1 = unpacked.rAxis1; + this.rAxis2 = unpacked.rAxis2; + this.rAxis3 = unpacked.rAxis3; + this.rAxis4 = unpacked.rAxis4; + } + public void Unpack(ref VRControllerState_t unpacked) + { + unpacked.unPacketNum = this.unPacketNum; + unpacked.ulButtonPressed = this.ulButtonPressed; + unpacked.ulButtonTouched = this.ulButtonTouched; + unpacked.rAxis0 = this.rAxis0; + unpacked.rAxis1 = this.rAxis1; + unpacked.rAxis2 = this.rAxis2; + unpacked.rAxis3 = this.rAxis3; + unpacked.rAxis4 = this.rAxis4; + } +} +[StructLayout(LayoutKind.Sequential)] public struct Compositor_OverlaySettings +{ + public uint size; + [MarshalAs(UnmanagedType.I1)] + public bool curved; + [MarshalAs(UnmanagedType.I1)] + public bool antialias; + public float scale; + public float distance; + public float alpha; + public float uOffset; + public float vOffset; + public float uScale; + public float vScale; + public float gridDivs; + public float gridWidth; + public float gridScale; + public HmdMatrix44_t transform; +} +[StructLayout(LayoutKind.Sequential)] public struct CameraVideoStreamFrameHeader_t +{ + public EVRTrackedCameraFrameType eFrameType; + public uint nWidth; + public uint nHeight; + public uint nBytesPerPixel; + public uint nFrameSequence; + public TrackedDevicePose_t standingTrackedDevicePose; +} +[StructLayout(LayoutKind.Sequential)] public struct AppOverrideKeys_t +{ + public IntPtr pchKey; // const char * + public IntPtr pchValue; // const char * +} +[StructLayout(LayoutKind.Sequential)] public struct Compositor_FrameTiming +{ + public uint m_nSize; + public uint m_nFrameIndex; + public uint m_nNumFramePresents; + public uint m_nNumMisPresented; + public uint m_nNumDroppedFrames; + public uint m_nReprojectionFlags; + public double m_flSystemTimeInSeconds; + public float m_flPreSubmitGpuMs; + public float m_flPostSubmitGpuMs; + public float m_flTotalRenderGpuMs; + public float m_flCompositorRenderGpuMs; + public float m_flCompositorRenderCpuMs; + public float m_flCompositorIdleCpuMs; + public float m_flClientFrameIntervalMs; + public float m_flPresentCallCpuMs; + public float m_flWaitForPresentCpuMs; + public float m_flSubmitFrameMs; + public float m_flWaitGetPosesCalledMs; + public float m_flNewPosesReadyMs; + public float m_flNewFrameReadyMs; + public float m_flCompositorUpdateStartMs; + public float m_flCompositorUpdateEndMs; + public float m_flCompositorRenderStartMs; + public TrackedDevicePose_t m_HmdPose; +} +[StructLayout(LayoutKind.Sequential)] public struct Compositor_CumulativeStats +{ + public uint m_nPid; + public uint m_nNumFramePresents; + public uint m_nNumDroppedFrames; + public uint m_nNumReprojectedFrames; + public uint m_nNumFramePresentsOnStartup; + public uint m_nNumDroppedFramesOnStartup; + public uint m_nNumReprojectedFramesOnStartup; + public uint m_nNumLoading; + public uint m_nNumFramePresentsLoading; + public uint m_nNumDroppedFramesLoading; + public uint m_nNumReprojectedFramesLoading; + public uint m_nNumTimedOut; + public uint m_nNumFramePresentsTimedOut; + public uint m_nNumDroppedFramesTimedOut; + public uint m_nNumReprojectedFramesTimedOut; +} +[StructLayout(LayoutKind.Sequential)] public struct VROverlayIntersectionParams_t +{ + public HmdVector3_t vSource; + public HmdVector3_t vDirection; + public ETrackingUniverseOrigin eOrigin; +} +[StructLayout(LayoutKind.Sequential)] public struct VROverlayIntersectionResults_t +{ + public HmdVector3_t vPoint; + public HmdVector3_t vNormal; + public HmdVector2_t vUVs; + public float fDistance; +} +[StructLayout(LayoutKind.Sequential)] public struct IntersectionMaskRectangle_t +{ + public float m_flTopLeftX; + public float m_flTopLeftY; + public float m_flWidth; + public float m_flHeight; +} +[StructLayout(LayoutKind.Sequential)] public struct IntersectionMaskCircle_t +{ + public float m_flCenterX; + public float m_flCenterY; + public float m_flRadius; +} +[StructLayout(LayoutKind.Sequential)] public struct VROverlayIntersectionMaskPrimitive_t +{ + public EVROverlayIntersectionMaskPrimitiveType m_nPrimitiveType; + public VROverlayIntersectionMaskPrimitive_Data_t m_Primitive; +} +[StructLayout(LayoutKind.Sequential)] public struct RenderModel_ComponentState_t +{ + public HmdMatrix34_t mTrackingToComponentRenderModel; + public HmdMatrix34_t mTrackingToComponentLocal; + public uint uProperties; +} +[StructLayout(LayoutKind.Sequential)] public struct RenderModel_Vertex_t +{ + public HmdVector3_t vPosition; + public HmdVector3_t vNormal; + public float rfTextureCoord0; //float[2] + public float rfTextureCoord1; +} +[StructLayout(LayoutKind.Sequential)] public struct RenderModel_TextureMap_t +{ + public char unWidth; + public char unHeight; + public IntPtr rubTextureMapData; // const uint8_t * +} +// This structure is for backwards binary compatibility on Linux and OSX only +[StructLayout(LayoutKind.Sequential, Pack = 4)] public struct RenderModel_TextureMap_t_Packed +{ + public char unWidth; + public char unHeight; + public IntPtr rubTextureMapData; // const uint8_t * + public RenderModel_TextureMap_t_Packed(RenderModel_TextureMap_t unpacked) + { + this.unWidth = unpacked.unWidth; + this.unHeight = unpacked.unHeight; + this.rubTextureMapData = unpacked.rubTextureMapData; + } + public void Unpack(ref RenderModel_TextureMap_t unpacked) + { + unpacked.unWidth = this.unWidth; + unpacked.unHeight = this.unHeight; + unpacked.rubTextureMapData = this.rubTextureMapData; + } +} +[StructLayout(LayoutKind.Sequential)] public struct RenderModel_t +{ + public IntPtr rVertexData; // const struct vr::RenderModel_Vertex_t * + public uint unVertexCount; + public IntPtr rIndexData; // const uint16_t * + public uint unTriangleCount; + public int diffuseTextureId; +} +// This structure is for backwards binary compatibility on Linux and OSX only +[StructLayout(LayoutKind.Sequential, Pack = 4)] public struct RenderModel_t_Packed +{ + public IntPtr rVertexData; // const struct vr::RenderModel_Vertex_t * + public uint unVertexCount; + public IntPtr rIndexData; // const uint16_t * + public uint unTriangleCount; + public int diffuseTextureId; + public RenderModel_t_Packed(RenderModel_t unpacked) + { + this.rVertexData = unpacked.rVertexData; + this.unVertexCount = unpacked.unVertexCount; + this.rIndexData = unpacked.rIndexData; + this.unTriangleCount = unpacked.unTriangleCount; + this.diffuseTextureId = unpacked.diffuseTextureId; + } + public void Unpack(ref RenderModel_t unpacked) + { + unpacked.rVertexData = this.rVertexData; + unpacked.unVertexCount = this.unVertexCount; + unpacked.rIndexData = this.rIndexData; + unpacked.unTriangleCount = this.unTriangleCount; + unpacked.diffuseTextureId = this.diffuseTextureId; + } +} +[StructLayout(LayoutKind.Sequential)] public struct RenderModel_ControllerMode_State_t +{ + [MarshalAs(UnmanagedType.I1)] + public bool bScrollWheelVisible; +} +[StructLayout(LayoutKind.Sequential)] public struct NotificationBitmap_t +{ + public IntPtr m_pImageData; // void * + public int m_nWidth; + public int m_nHeight; + public int m_nBytesPerPixel; +} +[StructLayout(LayoutKind.Sequential)] public struct COpenVRContext +{ + public IntPtr m_pVRSystem; // class vr::IVRSystem * + public IntPtr m_pVRChaperone; // class vr::IVRChaperone * + public IntPtr m_pVRChaperoneSetup; // class vr::IVRChaperoneSetup * + public IntPtr m_pVRCompositor; // class vr::IVRCompositor * + public IntPtr m_pVROverlay; // class vr::IVROverlay * + public IntPtr m_pVRResources; // class vr::IVRResources * + public IntPtr m_pVRRenderModels; // class vr::IVRRenderModels * + public IntPtr m_pVRExtendedDisplay; // class vr::IVRExtendedDisplay * + public IntPtr m_pVRSettings; // class vr::IVRSettings * + public IntPtr m_pVRApplications; // class vr::IVRApplications * + public IntPtr m_pVRTrackedCamera; // class vr::IVRTrackedCamera * + public IntPtr m_pVRScreenshots; // class vr::IVRScreenshots * + public IntPtr m_pVRDriverManager; // class vr::IVRDriverManager * +} + +public class OpenVR +{ + + public static uint InitInternal(ref EVRInitError peError, EVRApplicationType eApplicationType) + { + return OpenVRInterop.InitInternal(ref peError, eApplicationType); + } + + public static void ShutdownInternal() + { + OpenVRInterop.ShutdownInternal(); + } + + public static bool IsHmdPresent() + { + return OpenVRInterop.IsHmdPresent(); + } + + public static bool IsRuntimeInstalled() + { + return OpenVRInterop.IsRuntimeInstalled(); + } + + public static string GetStringForHmdError(EVRInitError error) + { + return Marshal.PtrToStringAnsi(OpenVRInterop.GetStringForHmdError(error)); + } + + public static IntPtr GetGenericInterface(string pchInterfaceVersion, ref EVRInitError peError) + { + return OpenVRInterop.GetGenericInterface(pchInterfaceVersion, ref peError); + } + + public static bool IsInterfaceVersionValid(string pchInterfaceVersion) + { + return OpenVRInterop.IsInterfaceVersionValid(pchInterfaceVersion); + } + + public static uint GetInitToken() + { + return OpenVRInterop.GetInitToken(); + } + + public const uint k_nDriverNone = 4294967295; + public const uint k_unMaxDriverDebugResponseSize = 32768; + public const uint k_unTrackedDeviceIndex_Hmd = 0; + public const uint k_unMaxTrackedDeviceCount = 16; + public const uint k_unTrackedDeviceIndexOther = 4294967294; + public const uint k_unTrackedDeviceIndexInvalid = 4294967295; + public const ulong k_ulInvalidPropertyContainer = 0; + public const uint k_unInvalidPropertyTag = 0; + public const uint k_unFloatPropertyTag = 1; + public const uint k_unInt32PropertyTag = 2; + public const uint k_unUint64PropertyTag = 3; + public const uint k_unBoolPropertyTag = 4; + public const uint k_unStringPropertyTag = 5; + public const uint k_unHmdMatrix34PropertyTag = 20; + public const uint k_unHmdMatrix44PropertyTag = 21; + public const uint k_unHmdVector3PropertyTag = 22; + public const uint k_unHmdVector4PropertyTag = 23; + public const uint k_unHiddenAreaPropertyTag = 30; + public const uint k_unOpenVRInternalReserved_Start = 1000; + public const uint k_unOpenVRInternalReserved_End = 10000; + public const uint k_unMaxPropertyStringSize = 32768; + public const uint k_unControllerStateAxisCount = 5; + public const ulong k_ulOverlayHandleInvalid = 0; + public const uint k_unScreenshotHandleInvalid = 0; + public const string IVRSystem_Version = "IVRSystem_016"; + public const string IVRExtendedDisplay_Version = "IVRExtendedDisplay_001"; + public const string IVRTrackedCamera_Version = "IVRTrackedCamera_003"; + public const uint k_unMaxApplicationKeyLength = 128; + public const string k_pch_MimeType_HomeApp = "vr/home"; + public const string k_pch_MimeType_GameTheater = "vr/game_theater"; + public const string IVRApplications_Version = "IVRApplications_006"; + public const string IVRChaperone_Version = "IVRChaperone_003"; + public const string IVRChaperoneSetup_Version = "IVRChaperoneSetup_005"; + public const string IVRCompositor_Version = "IVRCompositor_020"; + public const uint k_unVROverlayMaxKeyLength = 128; + public const uint k_unVROverlayMaxNameLength = 128; + public const uint k_unMaxOverlayCount = 64; + public const uint k_unMaxOverlayIntersectionMaskPrimitivesCount = 32; + public const string IVROverlay_Version = "IVROverlay_016"; + public const string k_pch_Controller_Component_GDC2015 = "gdc2015"; + public const string k_pch_Controller_Component_Base = "base"; + public const string k_pch_Controller_Component_Tip = "tip"; + public const string k_pch_Controller_Component_HandGrip = "handgrip"; + public const string k_pch_Controller_Component_Status = "status"; + public const string IVRRenderModels_Version = "IVRRenderModels_005"; + public const uint k_unNotificationTextMaxSize = 256; + public const string IVRNotifications_Version = "IVRNotifications_002"; + public const uint k_unMaxSettingsKeyLength = 128; + public const string IVRSettings_Version = "IVRSettings_002"; + public const string k_pch_SteamVR_Section = "steamvr"; + public const string k_pch_SteamVR_RequireHmd_String = "requireHmd"; + public const string k_pch_SteamVR_ForcedDriverKey_String = "forcedDriver"; + public const string k_pch_SteamVR_ForcedHmdKey_String = "forcedHmd"; + public const string k_pch_SteamVR_DisplayDebug_Bool = "displayDebug"; + public const string k_pch_SteamVR_DebugProcessPipe_String = "debugProcessPipe"; + public const string k_pch_SteamVR_DisplayDebugX_Int32 = "displayDebugX"; + public const string k_pch_SteamVR_DisplayDebugY_Int32 = "displayDebugY"; + public const string k_pch_SteamVR_SendSystemButtonToAllApps_Bool = "sendSystemButtonToAllApps"; + public const string k_pch_SteamVR_LogLevel_Int32 = "loglevel"; + public const string k_pch_SteamVR_IPD_Float = "ipd"; + public const string k_pch_SteamVR_Background_String = "background"; + public const string k_pch_SteamVR_BackgroundUseDomeProjection_Bool = "backgroundUseDomeProjection"; + public const string k_pch_SteamVR_BackgroundCameraHeight_Float = "backgroundCameraHeight"; + public const string k_pch_SteamVR_BackgroundDomeRadius_Float = "backgroundDomeRadius"; + public const string k_pch_SteamVR_GridColor_String = "gridColor"; + public const string k_pch_SteamVR_PlayAreaColor_String = "playAreaColor"; + public const string k_pch_SteamVR_ShowStage_Bool = "showStage"; + public const string k_pch_SteamVR_ActivateMultipleDrivers_Bool = "activateMultipleDrivers"; + public const string k_pch_SteamVR_DirectMode_Bool = "directMode"; + public const string k_pch_SteamVR_DirectModeEdidVid_Int32 = "directModeEdidVid"; + public const string k_pch_SteamVR_DirectModeEdidPid_Int32 = "directModeEdidPid"; + public const string k_pch_SteamVR_UsingSpeakers_Bool = "usingSpeakers"; + public const string k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float = "speakersForwardYawOffsetDegrees"; + public const string k_pch_SteamVR_BaseStationPowerManagement_Bool = "basestationPowerManagement"; + public const string k_pch_SteamVR_NeverKillProcesses_Bool = "neverKillProcesses"; + public const string k_pch_SteamVR_SupersampleScale_Float = "supersampleScale"; + public const string k_pch_SteamVR_AllowAsyncReprojection_Bool = "allowAsyncReprojection"; + public const string k_pch_SteamVR_AllowReprojection_Bool = "allowInterleavedReprojection"; + public const string k_pch_SteamVR_ForceReprojection_Bool = "forceReprojection"; + public const string k_pch_SteamVR_ForceFadeOnBadTracking_Bool = "forceFadeOnBadTracking"; + public const string k_pch_SteamVR_DefaultMirrorView_Int32 = "defaultMirrorView"; + public const string k_pch_SteamVR_ShowMirrorView_Bool = "showMirrorView"; + public const string k_pch_SteamVR_MirrorViewGeometry_String = "mirrorViewGeometry"; + public const string k_pch_SteamVR_StartMonitorFromAppLaunch = "startMonitorFromAppLaunch"; + public const string k_pch_SteamVR_StartCompositorFromAppLaunch_Bool = "startCompositorFromAppLaunch"; + public const string k_pch_SteamVR_StartDashboardFromAppLaunch_Bool = "startDashboardFromAppLaunch"; + public const string k_pch_SteamVR_StartOverlayAppsFromDashboard_Bool = "startOverlayAppsFromDashboard"; + public const string k_pch_SteamVR_EnableHomeApp = "enableHomeApp"; + public const string k_pch_SteamVR_CycleBackgroundImageTimeSec_Int32 = "CycleBackgroundImageTimeSec"; + public const string k_pch_SteamVR_RetailDemo_Bool = "retailDemo"; + public const string k_pch_SteamVR_IpdOffset_Float = "ipdOffset"; + public const string k_pch_SteamVR_AllowSupersampleFiltering_Bool = "allowSupersampleFiltering"; + public const string k_pch_Lighthouse_Section = "driver_lighthouse"; + public const string k_pch_Lighthouse_DisableIMU_Bool = "disableimu"; + public const string k_pch_Lighthouse_UseDisambiguation_String = "usedisambiguation"; + public const string k_pch_Lighthouse_DisambiguationDebug_Int32 = "disambiguationdebug"; + public const string k_pch_Lighthouse_PrimaryBasestation_Int32 = "primarybasestation"; + public const string k_pch_Lighthouse_DBHistory_Bool = "dbhistory"; + public const string k_pch_Null_Section = "driver_null"; + public const string k_pch_Null_SerialNumber_String = "serialNumber"; + public const string k_pch_Null_ModelNumber_String = "modelNumber"; + public const string k_pch_Null_WindowX_Int32 = "windowX"; + public const string k_pch_Null_WindowY_Int32 = "windowY"; + public const string k_pch_Null_WindowWidth_Int32 = "windowWidth"; + public const string k_pch_Null_WindowHeight_Int32 = "windowHeight"; + public const string k_pch_Null_RenderWidth_Int32 = "renderWidth"; + public const string k_pch_Null_RenderHeight_Int32 = "renderHeight"; + public const string k_pch_Null_SecondsFromVsyncToPhotons_Float = "secondsFromVsyncToPhotons"; + public const string k_pch_Null_DisplayFrequency_Float = "displayFrequency"; + public const string k_pch_UserInterface_Section = "userinterface"; + public const string k_pch_UserInterface_StatusAlwaysOnTop_Bool = "StatusAlwaysOnTop"; + public const string k_pch_UserInterface_MinimizeToTray_Bool = "MinimizeToTray"; + public const string k_pch_UserInterface_Screenshots_Bool = "screenshots"; + public const string k_pch_UserInterface_ScreenshotType_Int = "screenshotType"; + public const string k_pch_Notifications_Section = "notifications"; + public const string k_pch_Notifications_DoNotDisturb_Bool = "DoNotDisturb"; + public const string k_pch_Keyboard_Section = "keyboard"; + public const string k_pch_Keyboard_TutorialCompletions = "TutorialCompletions"; + public const string k_pch_Keyboard_ScaleX = "ScaleX"; + public const string k_pch_Keyboard_ScaleY = "ScaleY"; + public const string k_pch_Keyboard_OffsetLeftX = "OffsetLeftX"; + public const string k_pch_Keyboard_OffsetRightX = "OffsetRightX"; + public const string k_pch_Keyboard_OffsetY = "OffsetY"; + public const string k_pch_Keyboard_Smoothing = "Smoothing"; + public const string k_pch_Perf_Section = "perfcheck"; + public const string k_pch_Perf_HeuristicActive_Bool = "heuristicActive"; + public const string k_pch_Perf_NotifyInHMD_Bool = "warnInHMD"; + public const string k_pch_Perf_NotifyOnlyOnce_Bool = "warnOnlyOnce"; + public const string k_pch_Perf_AllowTimingStore_Bool = "allowTimingStore"; + public const string k_pch_Perf_SaveTimingsOnExit_Bool = "saveTimingsOnExit"; + public const string k_pch_Perf_TestData_Float = "perfTestData"; + public const string k_pch_Perf_LinuxGPUProfiling_Bool = "linuxGPUProfiling"; + public const string k_pch_CollisionBounds_Section = "collisionBounds"; + public const string k_pch_CollisionBounds_Style_Int32 = "CollisionBoundsStyle"; + public const string k_pch_CollisionBounds_GroundPerimeterOn_Bool = "CollisionBoundsGroundPerimeterOn"; + public const string k_pch_CollisionBounds_CenterMarkerOn_Bool = "CollisionBoundsCenterMarkerOn"; + public const string k_pch_CollisionBounds_PlaySpaceOn_Bool = "CollisionBoundsPlaySpaceOn"; + public const string k_pch_CollisionBounds_FadeDistance_Float = "CollisionBoundsFadeDistance"; + public const string k_pch_CollisionBounds_ColorGammaR_Int32 = "CollisionBoundsColorGammaR"; + public const string k_pch_CollisionBounds_ColorGammaG_Int32 = "CollisionBoundsColorGammaG"; + public const string k_pch_CollisionBounds_ColorGammaB_Int32 = "CollisionBoundsColorGammaB"; + public const string k_pch_CollisionBounds_ColorGammaA_Int32 = "CollisionBoundsColorGammaA"; + public const string k_pch_Camera_Section = "camera"; + public const string k_pch_Camera_EnableCamera_Bool = "enableCamera"; + public const string k_pch_Camera_EnableCameraInDashboard_Bool = "enableCameraInDashboard"; + public const string k_pch_Camera_EnableCameraForCollisionBounds_Bool = "enableCameraForCollisionBounds"; + public const string k_pch_Camera_EnableCameraForRoomView_Bool = "enableCameraForRoomView"; + public const string k_pch_Camera_BoundsColorGammaR_Int32 = "cameraBoundsColorGammaR"; + public const string k_pch_Camera_BoundsColorGammaG_Int32 = "cameraBoundsColorGammaG"; + public const string k_pch_Camera_BoundsColorGammaB_Int32 = "cameraBoundsColorGammaB"; + public const string k_pch_Camera_BoundsColorGammaA_Int32 = "cameraBoundsColorGammaA"; + public const string k_pch_Camera_BoundsStrength_Int32 = "cameraBoundsStrength"; + public const string k_pch_audio_Section = "audio"; + public const string k_pch_audio_OnPlaybackDevice_String = "onPlaybackDevice"; + public const string k_pch_audio_OnRecordDevice_String = "onRecordDevice"; + public const string k_pch_audio_OnPlaybackMirrorDevice_String = "onPlaybackMirrorDevice"; + public const string k_pch_audio_OffPlaybackDevice_String = "offPlaybackDevice"; + public const string k_pch_audio_OffRecordDevice_String = "offRecordDevice"; + public const string k_pch_audio_VIVEHDMIGain = "viveHDMIGain"; + public const string k_pch_Power_Section = "power"; + public const string k_pch_Power_PowerOffOnExit_Bool = "powerOffOnExit"; + public const string k_pch_Power_TurnOffScreensTimeout_Float = "turnOffScreensTimeout"; + public const string k_pch_Power_TurnOffControllersTimeout_Float = "turnOffControllersTimeout"; + public const string k_pch_Power_ReturnToWatchdogTimeout_Float = "returnToWatchdogTimeout"; + public const string k_pch_Power_AutoLaunchSteamVROnButtonPress = "autoLaunchSteamVROnButtonPress"; + public const string k_pch_Dashboard_Section = "dashboard"; + public const string k_pch_Dashboard_EnableDashboard_Bool = "enableDashboard"; + public const string k_pch_Dashboard_ArcadeMode_Bool = "arcadeMode"; + public const string k_pch_modelskin_Section = "modelskins"; + public const string k_pch_Driver_Enable_Bool = "enable"; + public const string IVRScreenshots_Version = "IVRScreenshots_001"; + public const string IVRResources_Version = "IVRResources_001"; + public const string IVRDriverManager_Version = "IVRDriverManager_001"; + + static uint VRToken { get; set; } + + const string FnTable_Prefix = "FnTable:"; + + class COpenVRContext + { + public COpenVRContext() { Clear(); } + + public void Clear() + { + m_pVRSystem = null; + m_pVRChaperone = null; + m_pVRChaperoneSetup = null; + m_pVRCompositor = null; + m_pVROverlay = null; + m_pVRRenderModels = null; + m_pVRExtendedDisplay = null; + m_pVRSettings = null; + m_pVRApplications = null; + m_pVRScreenshots = null; + m_pVRTrackedCamera = null; + } + + void CheckClear() + { + if (VRToken != GetInitToken()) + { + Clear(); + VRToken = GetInitToken(); + } + } + + public CVRSystem VRSystem() + { + CheckClear(); + if (m_pVRSystem == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRSystem_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRSystem = new CVRSystem(pInterface); + } + return m_pVRSystem; + } + + public CVRChaperone VRChaperone() + { + CheckClear(); + if (m_pVRChaperone == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRChaperone_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRChaperone = new CVRChaperone(pInterface); + } + return m_pVRChaperone; + } + + public CVRChaperoneSetup VRChaperoneSetup() + { + CheckClear(); + if (m_pVRChaperoneSetup == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRChaperoneSetup_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRChaperoneSetup = new CVRChaperoneSetup(pInterface); + } + return m_pVRChaperoneSetup; + } + + public CVRCompositor VRCompositor() + { + CheckClear(); + if (m_pVRCompositor == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRCompositor_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRCompositor = new CVRCompositor(pInterface); + } + return m_pVRCompositor; + } + + public CVROverlay VROverlay() + { + CheckClear(); + if (m_pVROverlay == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVROverlay_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVROverlay = new CVROverlay(pInterface); + } + return m_pVROverlay; + } + + public CVRRenderModels VRRenderModels() + { + CheckClear(); + if (m_pVRRenderModels == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRRenderModels_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRRenderModels = new CVRRenderModels(pInterface); + } + return m_pVRRenderModels; + } + + public CVRExtendedDisplay VRExtendedDisplay() + { + CheckClear(); + if (m_pVRExtendedDisplay == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRExtendedDisplay_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRExtendedDisplay = new CVRExtendedDisplay(pInterface); + } + return m_pVRExtendedDisplay; + } + + public CVRSettings VRSettings() + { + CheckClear(); + if (m_pVRSettings == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRSettings_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRSettings = new CVRSettings(pInterface); + } + return m_pVRSettings; + } + + public CVRApplications VRApplications() + { + CheckClear(); + if (m_pVRApplications == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRApplications_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRApplications = new CVRApplications(pInterface); + } + return m_pVRApplications; + } + + public CVRScreenshots VRScreenshots() + { + CheckClear(); + if (m_pVRScreenshots == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRScreenshots_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRScreenshots = new CVRScreenshots(pInterface); + } + return m_pVRScreenshots; + } + + public CVRTrackedCamera VRTrackedCamera() + { + CheckClear(); + if (m_pVRTrackedCamera == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRTrackedCamera_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRTrackedCamera = new CVRTrackedCamera(pInterface); + } + return m_pVRTrackedCamera; + } + + private CVRSystem m_pVRSystem; + private CVRChaperone m_pVRChaperone; + private CVRChaperoneSetup m_pVRChaperoneSetup; + private CVRCompositor m_pVRCompositor; + private CVROverlay m_pVROverlay; + private CVRRenderModels m_pVRRenderModels; + private CVRExtendedDisplay m_pVRExtendedDisplay; + private CVRSettings m_pVRSettings; + private CVRApplications m_pVRApplications; + private CVRScreenshots m_pVRScreenshots; + private CVRTrackedCamera m_pVRTrackedCamera; + }; + + private static COpenVRContext _OpenVRInternal_ModuleContext = null; + static COpenVRContext OpenVRInternal_ModuleContext + { + get + { + if (_OpenVRInternal_ModuleContext == null) + _OpenVRInternal_ModuleContext = new COpenVRContext(); + return _OpenVRInternal_ModuleContext; + } + } + + public static CVRSystem System { get { return OpenVRInternal_ModuleContext.VRSystem(); } } + public static CVRChaperone Chaperone { get { return OpenVRInternal_ModuleContext.VRChaperone(); } } + public static CVRChaperoneSetup ChaperoneSetup { get { return OpenVRInternal_ModuleContext.VRChaperoneSetup(); } } + public static CVRCompositor Compositor { get { return OpenVRInternal_ModuleContext.VRCompositor(); } } + public static CVROverlay Overlay { get { return OpenVRInternal_ModuleContext.VROverlay(); } } + public static CVRRenderModels RenderModels { get { return OpenVRInternal_ModuleContext.VRRenderModels(); } } + public static CVRExtendedDisplay ExtendedDisplay { get { return OpenVRInternal_ModuleContext.VRExtendedDisplay(); } } + public static CVRSettings Settings { get { return OpenVRInternal_ModuleContext.VRSettings(); } } + public static CVRApplications Applications { get { return OpenVRInternal_ModuleContext.VRApplications(); } } + public static CVRScreenshots Screenshots { get { return OpenVRInternal_ModuleContext.VRScreenshots(); } } + public static CVRTrackedCamera TrackedCamera { get { return OpenVRInternal_ModuleContext.VRTrackedCamera(); } } + + /** Finds the active installation of vrclient.dll and initializes it */ + public static CVRSystem Init(ref EVRInitError peError, EVRApplicationType eApplicationType = EVRApplicationType.VRApplication_Scene) + { + VRToken = InitInternal(ref peError, eApplicationType); + OpenVRInternal_ModuleContext.Clear(); + + if (peError != EVRInitError.None) + return null; + + bool bInterfaceValid = IsInterfaceVersionValid(IVRSystem_Version); + if (!bInterfaceValid) + { + ShutdownInternal(); + peError = EVRInitError.Init_InterfaceNotFound; + return null; + } + + return OpenVR.System; + } + + /** unloads vrclient.dll. Any interface pointers from the interface are + * invalid after this point */ + public static void Shutdown() + { + ShutdownInternal(); + } + +} + + + +} + diff --git a/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Headers/openvr_api.json b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Headers/openvr_api.json new file mode 100644 index 000000000..bd76ded9f --- /dev/null +++ b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Headers/openvr_api.json @@ -0,0 +1,3887 @@ +{"typedefs":[{"typedef": "vr::glSharedTextureHandle_t","type": "void *"} +,{"typedef": "vr::glInt_t","type": "int32_t"} +,{"typedef": "vr::glUInt_t","type": "uint32_t"} +,{"typedef": "vr::SharedTextureHandle_t","type": "uint64_t"} +,{"typedef": "vr::DriverId_t","type": "uint32_t"} +,{"typedef": "vr::TrackedDeviceIndex_t","type": "uint32_t"} +,{"typedef": "vr::PropertyContainerHandle_t","type": "uint64_t"} +,{"typedef": "vr::PropertyTypeTag_t","type": "uint32_t"} +,{"typedef": "vr::VREvent_Data_t","type": "union VREvent_Data_t"} +,{"typedef": "vr::VRControllerState_t","type": "struct vr::VRControllerState001_t"} +,{"typedef": "vr::VROverlayHandle_t","type": "uint64_t"} +,{"typedef": "vr::TrackedCameraHandle_t","type": "uint64_t"} +,{"typedef": "vr::ScreenshotHandle_t","type": "uint32_t"} +,{"typedef": "vr::VROverlayIntersectionMaskPrimitive_Data_t","type": "union VROverlayIntersectionMaskPrimitive_Data_t"} +,{"typedef": "vr::VRComponentProperties","type": "uint32_t"} +,{"typedef": "vr::TextureID_t","type": "int32_t"} +,{"typedef": "vr::VRNotificationId","type": "uint32_t"} +,{"typedef": "vr::HmdError","type": "enum vr::EVRInitError"} +,{"typedef": "vr::Hmd_Eye","type": "enum vr::EVREye"} +,{"typedef": "vr::ColorSpace","type": "enum vr::EColorSpace"} +,{"typedef": "vr::HmdTrackingResult","type": "enum vr::ETrackingResult"} +,{"typedef": "vr::TrackedDeviceClass","type": "enum vr::ETrackedDeviceClass"} +,{"typedef": "vr::TrackingUniverseOrigin","type": "enum vr::ETrackingUniverseOrigin"} +,{"typedef": "vr::TrackedDeviceProperty","type": "enum vr::ETrackedDeviceProperty"} +,{"typedef": "vr::TrackedPropertyError","type": "enum vr::ETrackedPropertyError"} +,{"typedef": "vr::VRSubmitFlags_t","type": "enum vr::EVRSubmitFlags"} +,{"typedef": "vr::VRState_t","type": "enum vr::EVRState"} +,{"typedef": "vr::CollisionBoundsStyle_t","type": "enum vr::ECollisionBoundsStyle"} +,{"typedef": "vr::VROverlayError","type": "enum vr::EVROverlayError"} +,{"typedef": "vr::VRFirmwareError","type": "enum vr::EVRFirmwareError"} +,{"typedef": "vr::VRCompositorError","type": "enum vr::EVRCompositorError"} +,{"typedef": "vr::VRScreenshotsError","type": "enum vr::EVRScreenshotError"} +], +"enums":[ + {"enumname": "vr::EVREye","values": [ + {"name": "Eye_Left","value": "0"} + ,{"name": "Eye_Right","value": "1"} +]} +, {"enumname": "vr::ETextureType","values": [ + {"name": "TextureType_DirectX","value": "0"} + ,{"name": "TextureType_OpenGL","value": "1"} + ,{"name": "TextureType_Vulkan","value": "2"} + ,{"name": "TextureType_IOSurface","value": "3"} + ,{"name": "TextureType_DirectX12","value": "4"} +]} +, {"enumname": "vr::EColorSpace","values": [ + {"name": "ColorSpace_Auto","value": "0"} + ,{"name": "ColorSpace_Gamma","value": "1"} + ,{"name": "ColorSpace_Linear","value": "2"} +]} +, {"enumname": "vr::ETrackingResult","values": [ + {"name": "TrackingResult_Uninitialized","value": "1"} + ,{"name": "TrackingResult_Calibrating_InProgress","value": "100"} + ,{"name": "TrackingResult_Calibrating_OutOfRange","value": "101"} + ,{"name": "TrackingResult_Running_OK","value": "200"} + ,{"name": "TrackingResult_Running_OutOfRange","value": "201"} +]} +, {"enumname": "vr::ETrackedDeviceClass","values": [ + {"name": "TrackedDeviceClass_Invalid","value": "0"} + ,{"name": "TrackedDeviceClass_HMD","value": "1"} + ,{"name": "TrackedDeviceClass_Controller","value": "2"} + ,{"name": "TrackedDeviceClass_GenericTracker","value": "3"} + ,{"name": "TrackedDeviceClass_TrackingReference","value": "4"} + ,{"name": "TrackedDeviceClass_DisplayRedirect","value": "5"} +]} +, {"enumname": "vr::ETrackedControllerRole","values": [ + {"name": "TrackedControllerRole_Invalid","value": "0"} + ,{"name": "TrackedControllerRole_LeftHand","value": "1"} + ,{"name": "TrackedControllerRole_RightHand","value": "2"} +]} +, {"enumname": "vr::ETrackingUniverseOrigin","values": [ + {"name": "TrackingUniverseSeated","value": "0"} + ,{"name": "TrackingUniverseStanding","value": "1"} + ,{"name": "TrackingUniverseRawAndUncalibrated","value": "2"} +]} +, {"enumname": "vr::ETrackedDeviceProperty","values": [ + {"name": "Prop_Invalid","value": "0"} + ,{"name": "Prop_TrackingSystemName_String","value": "1000"} + ,{"name": "Prop_ModelNumber_String","value": "1001"} + ,{"name": "Prop_SerialNumber_String","value": "1002"} + ,{"name": "Prop_RenderModelName_String","value": "1003"} + ,{"name": "Prop_WillDriftInYaw_Bool","value": "1004"} + ,{"name": "Prop_ManufacturerName_String","value": "1005"} + ,{"name": "Prop_TrackingFirmwareVersion_String","value": "1006"} + ,{"name": "Prop_HardwareRevision_String","value": "1007"} + ,{"name": "Prop_AllWirelessDongleDescriptions_String","value": "1008"} + ,{"name": "Prop_ConnectedWirelessDongle_String","value": "1009"} + ,{"name": "Prop_DeviceIsWireless_Bool","value": "1010"} + ,{"name": "Prop_DeviceIsCharging_Bool","value": "1011"} + ,{"name": "Prop_DeviceBatteryPercentage_Float","value": "1012"} + ,{"name": "Prop_StatusDisplayTransform_Matrix34","value": "1013"} + ,{"name": "Prop_Firmware_UpdateAvailable_Bool","value": "1014"} + ,{"name": "Prop_Firmware_ManualUpdate_Bool","value": "1015"} + ,{"name": "Prop_Firmware_ManualUpdateURL_String","value": "1016"} + ,{"name": "Prop_HardwareRevision_Uint64","value": "1017"} + ,{"name": "Prop_FirmwareVersion_Uint64","value": "1018"} + ,{"name": "Prop_FPGAVersion_Uint64","value": "1019"} + ,{"name": "Prop_VRCVersion_Uint64","value": "1020"} + ,{"name": "Prop_RadioVersion_Uint64","value": "1021"} + ,{"name": "Prop_DongleVersion_Uint64","value": "1022"} + ,{"name": "Prop_BlockServerShutdown_Bool","value": "1023"} + ,{"name": "Prop_CanUnifyCoordinateSystemWithHmd_Bool","value": "1024"} + ,{"name": "Prop_ContainsProximitySensor_Bool","value": "1025"} + ,{"name": "Prop_DeviceProvidesBatteryStatus_Bool","value": "1026"} + ,{"name": "Prop_DeviceCanPowerOff_Bool","value": "1027"} + ,{"name": "Prop_Firmware_ProgrammingTarget_String","value": "1028"} + ,{"name": "Prop_DeviceClass_Int32","value": "1029"} + ,{"name": "Prop_HasCamera_Bool","value": "1030"} + ,{"name": "Prop_DriverVersion_String","value": "1031"} + ,{"name": "Prop_Firmware_ForceUpdateRequired_Bool","value": "1032"} + ,{"name": "Prop_ViveSystemButtonFixRequired_Bool","value": "1033"} + ,{"name": "Prop_ParentDriver_Uint64","value": "1034"} + ,{"name": "Prop_ResourceRoot_String","value": "1035"} + ,{"name": "Prop_ReportsTimeSinceVSync_Bool","value": "2000"} + ,{"name": "Prop_SecondsFromVsyncToPhotons_Float","value": "2001"} + ,{"name": "Prop_DisplayFrequency_Float","value": "2002"} + ,{"name": "Prop_UserIpdMeters_Float","value": "2003"} + ,{"name": "Prop_CurrentUniverseId_Uint64","value": "2004"} + ,{"name": "Prop_PreviousUniverseId_Uint64","value": "2005"} + ,{"name": "Prop_DisplayFirmwareVersion_Uint64","value": "2006"} + ,{"name": "Prop_IsOnDesktop_Bool","value": "2007"} + ,{"name": "Prop_DisplayMCType_Int32","value": "2008"} + ,{"name": "Prop_DisplayMCOffset_Float","value": "2009"} + ,{"name": "Prop_DisplayMCScale_Float","value": "2010"} + ,{"name": "Prop_EdidVendorID_Int32","value": "2011"} + ,{"name": "Prop_DisplayMCImageLeft_String","value": "2012"} + ,{"name": "Prop_DisplayMCImageRight_String","value": "2013"} + ,{"name": "Prop_DisplayGCBlackClamp_Float","value": "2014"} + ,{"name": "Prop_EdidProductID_Int32","value": "2015"} + ,{"name": "Prop_CameraToHeadTransform_Matrix34","value": "2016"} + ,{"name": "Prop_DisplayGCType_Int32","value": "2017"} + ,{"name": "Prop_DisplayGCOffset_Float","value": "2018"} + ,{"name": "Prop_DisplayGCScale_Float","value": "2019"} + ,{"name": "Prop_DisplayGCPrescale_Float","value": "2020"} + ,{"name": "Prop_DisplayGCImage_String","value": "2021"} + ,{"name": "Prop_LensCenterLeftU_Float","value": "2022"} + ,{"name": "Prop_LensCenterLeftV_Float","value": "2023"} + ,{"name": "Prop_LensCenterRightU_Float","value": "2024"} + ,{"name": "Prop_LensCenterRightV_Float","value": "2025"} + ,{"name": "Prop_UserHeadToEyeDepthMeters_Float","value": "2026"} + ,{"name": "Prop_CameraFirmwareVersion_Uint64","value": "2027"} + ,{"name": "Prop_CameraFirmwareDescription_String","value": "2028"} + ,{"name": "Prop_DisplayFPGAVersion_Uint64","value": "2029"} + ,{"name": "Prop_DisplayBootloaderVersion_Uint64","value": "2030"} + ,{"name": "Prop_DisplayHardwareVersion_Uint64","value": "2031"} + ,{"name": "Prop_AudioFirmwareVersion_Uint64","value": "2032"} + ,{"name": "Prop_CameraCompatibilityMode_Int32","value": "2033"} + ,{"name": "Prop_ScreenshotHorizontalFieldOfViewDegrees_Float","value": "2034"} + ,{"name": "Prop_ScreenshotVerticalFieldOfViewDegrees_Float","value": "2035"} + ,{"name": "Prop_DisplaySuppressed_Bool","value": "2036"} + ,{"name": "Prop_DisplayAllowNightMode_Bool","value": "2037"} + ,{"name": "Prop_DisplayMCImageWidth_Int32","value": "2038"} + ,{"name": "Prop_DisplayMCImageHeight_Int32","value": "2039"} + ,{"name": "Prop_DisplayMCImageNumChannels_Int32","value": "2040"} + ,{"name": "Prop_DisplayMCImageData_Binary","value": "2041"} + ,{"name": "Prop_SecondsFromPhotonsToVblank_Float","value": "2042"} + ,{"name": "Prop_DriverDirectModeSendsVsyncEvents_Bool","value": "2043"} + ,{"name": "Prop_DisplayDebugMode_Bool","value": "2044"} + ,{"name": "Prop_GraphicsAdapterLuid_Uint64","value": "2045"} + ,{"name": "Prop_AttachedDeviceId_String","value": "3000"} + ,{"name": "Prop_SupportedButtons_Uint64","value": "3001"} + ,{"name": "Prop_Axis0Type_Int32","value": "3002"} + ,{"name": "Prop_Axis1Type_Int32","value": "3003"} + ,{"name": "Prop_Axis2Type_Int32","value": "3004"} + ,{"name": "Prop_Axis3Type_Int32","value": "3005"} + ,{"name": "Prop_Axis4Type_Int32","value": "3006"} + ,{"name": "Prop_ControllerRoleHint_Int32","value": "3007"} + ,{"name": "Prop_FieldOfViewLeftDegrees_Float","value": "4000"} + ,{"name": "Prop_FieldOfViewRightDegrees_Float","value": "4001"} + ,{"name": "Prop_FieldOfViewTopDegrees_Float","value": "4002"} + ,{"name": "Prop_FieldOfViewBottomDegrees_Float","value": "4003"} + ,{"name": "Prop_TrackingRangeMinimumMeters_Float","value": "4004"} + ,{"name": "Prop_TrackingRangeMaximumMeters_Float","value": "4005"} + ,{"name": "Prop_ModeLabel_String","value": "4006"} + ,{"name": "Prop_IconPathName_String","value": "5000"} + ,{"name": "Prop_NamedIconPathDeviceOff_String","value": "5001"} + ,{"name": "Prop_NamedIconPathDeviceSearching_String","value": "5002"} + ,{"name": "Prop_NamedIconPathDeviceSearchingAlert_String","value": "5003"} + ,{"name": "Prop_NamedIconPathDeviceReady_String","value": "5004"} + ,{"name": "Prop_NamedIconPathDeviceReadyAlert_String","value": "5005"} + ,{"name": "Prop_NamedIconPathDeviceNotReady_String","value": "5006"} + ,{"name": "Prop_NamedIconPathDeviceStandby_String","value": "5007"} + ,{"name": "Prop_NamedIconPathDeviceAlertLow_String","value": "5008"} + ,{"name": "Prop_DisplayHiddenArea_Binary_Start","value": "5100"} + ,{"name": "Prop_DisplayHiddenArea_Binary_End","value": "5150"} + ,{"name": "Prop_UserConfigPath_String","value": "6000"} + ,{"name": "Prop_InstallPath_String","value": "6001"} + ,{"name": "Prop_HasDisplayComponent_Bool","value": "6002"} + ,{"name": "Prop_HasControllerComponent_Bool","value": "6003"} + ,{"name": "Prop_HasCameraComponent_Bool","value": "6004"} + ,{"name": "Prop_HasDriverDirectModeComponent_Bool","value": "6005"} + ,{"name": "Prop_HasVirtualDisplayComponent_Bool","value": "6006"} + ,{"name": "Prop_VendorSpecific_Reserved_Start","value": "10000"} + ,{"name": "Prop_VendorSpecific_Reserved_End","value": "10999"} +]} +, {"enumname": "vr::ETrackedPropertyError","values": [ + {"name": "TrackedProp_Success","value": "0"} + ,{"name": "TrackedProp_WrongDataType","value": "1"} + ,{"name": "TrackedProp_WrongDeviceClass","value": "2"} + ,{"name": "TrackedProp_BufferTooSmall","value": "3"} + ,{"name": "TrackedProp_UnknownProperty","value": "4"} + ,{"name": "TrackedProp_InvalidDevice","value": "5"} + ,{"name": "TrackedProp_CouldNotContactServer","value": "6"} + ,{"name": "TrackedProp_ValueNotProvidedByDevice","value": "7"} + ,{"name": "TrackedProp_StringExceedsMaximumLength","value": "8"} + ,{"name": "TrackedProp_NotYetAvailable","value": "9"} + ,{"name": "TrackedProp_PermissionDenied","value": "10"} + ,{"name": "TrackedProp_InvalidOperation","value": "11"} +]} +, {"enumname": "vr::EVRSubmitFlags","values": [ + {"name": "Submit_Default","value": "0"} + ,{"name": "Submit_LensDistortionAlreadyApplied","value": "1"} + ,{"name": "Submit_GlRenderBuffer","value": "2"} + ,{"name": "Submit_Reserved","value": "4"} +]} +, {"enumname": "vr::EVRState","values": [ + {"name": "VRState_Undefined","value": "-1"} + ,{"name": "VRState_Off","value": "0"} + ,{"name": "VRState_Searching","value": "1"} + ,{"name": "VRState_Searching_Alert","value": "2"} + ,{"name": "VRState_Ready","value": "3"} + ,{"name": "VRState_Ready_Alert","value": "4"} + ,{"name": "VRState_NotReady","value": "5"} + ,{"name": "VRState_Standby","value": "6"} + ,{"name": "VRState_Ready_Alert_Low","value": "7"} +]} +, {"enumname": "vr::EVREventType","values": [ + {"name": "VREvent_None","value": "0"} + ,{"name": "VREvent_TrackedDeviceActivated","value": "100"} + ,{"name": "VREvent_TrackedDeviceDeactivated","value": "101"} + ,{"name": "VREvent_TrackedDeviceUpdated","value": "102"} + ,{"name": "VREvent_TrackedDeviceUserInteractionStarted","value": "103"} + ,{"name": "VREvent_TrackedDeviceUserInteractionEnded","value": "104"} + ,{"name": "VREvent_IpdChanged","value": "105"} + ,{"name": "VREvent_EnterStandbyMode","value": "106"} + ,{"name": "VREvent_LeaveStandbyMode","value": "107"} + ,{"name": "VREvent_TrackedDeviceRoleChanged","value": "108"} + ,{"name": "VREvent_WatchdogWakeUpRequested","value": "109"} + ,{"name": "VREvent_LensDistortionChanged","value": "110"} + ,{"name": "VREvent_PropertyChanged","value": "111"} + ,{"name": "VREvent_ButtonPress","value": "200"} + ,{"name": "VREvent_ButtonUnpress","value": "201"} + ,{"name": "VREvent_ButtonTouch","value": "202"} + ,{"name": "VREvent_ButtonUntouch","value": "203"} + ,{"name": "VREvent_MouseMove","value": "300"} + ,{"name": "VREvent_MouseButtonDown","value": "301"} + ,{"name": "VREvent_MouseButtonUp","value": "302"} + ,{"name": "VREvent_FocusEnter","value": "303"} + ,{"name": "VREvent_FocusLeave","value": "304"} + ,{"name": "VREvent_Scroll","value": "305"} + ,{"name": "VREvent_TouchPadMove","value": "306"} + ,{"name": "VREvent_OverlayFocusChanged","value": "307"} + ,{"name": "VREvent_InputFocusCaptured","value": "400"} + ,{"name": "VREvent_InputFocusReleased","value": "401"} + ,{"name": "VREvent_SceneFocusLost","value": "402"} + ,{"name": "VREvent_SceneFocusGained","value": "403"} + ,{"name": "VREvent_SceneApplicationChanged","value": "404"} + ,{"name": "VREvent_SceneFocusChanged","value": "405"} + ,{"name": "VREvent_InputFocusChanged","value": "406"} + ,{"name": "VREvent_SceneApplicationSecondaryRenderingStarted","value": "407"} + ,{"name": "VREvent_HideRenderModels","value": "410"} + ,{"name": "VREvent_ShowRenderModels","value": "411"} + ,{"name": "VREvent_OverlayShown","value": "500"} + ,{"name": "VREvent_OverlayHidden","value": "501"} + ,{"name": "VREvent_DashboardActivated","value": "502"} + ,{"name": "VREvent_DashboardDeactivated","value": "503"} + ,{"name": "VREvent_DashboardThumbSelected","value": "504"} + ,{"name": "VREvent_DashboardRequested","value": "505"} + ,{"name": "VREvent_ResetDashboard","value": "506"} + ,{"name": "VREvent_RenderToast","value": "507"} + ,{"name": "VREvent_ImageLoaded","value": "508"} + ,{"name": "VREvent_ShowKeyboard","value": "509"} + ,{"name": "VREvent_HideKeyboard","value": "510"} + ,{"name": "VREvent_OverlayGamepadFocusGained","value": "511"} + ,{"name": "VREvent_OverlayGamepadFocusLost","value": "512"} + ,{"name": "VREvent_OverlaySharedTextureChanged","value": "513"} + ,{"name": "VREvent_DashboardGuideButtonDown","value": "514"} + ,{"name": "VREvent_DashboardGuideButtonUp","value": "515"} + ,{"name": "VREvent_ScreenshotTriggered","value": "516"} + ,{"name": "VREvent_ImageFailed","value": "517"} + ,{"name": "VREvent_DashboardOverlayCreated","value": "518"} + ,{"name": "VREvent_RequestScreenshot","value": "520"} + ,{"name": "VREvent_ScreenshotTaken","value": "521"} + ,{"name": "VREvent_ScreenshotFailed","value": "522"} + ,{"name": "VREvent_SubmitScreenshotToDashboard","value": "523"} + ,{"name": "VREvent_ScreenshotProgressToDashboard","value": "524"} + ,{"name": "VREvent_PrimaryDashboardDeviceChanged","value": "525"} + ,{"name": "VREvent_Notification_Shown","value": "600"} + ,{"name": "VREvent_Notification_Hidden","value": "601"} + ,{"name": "VREvent_Notification_BeginInteraction","value": "602"} + ,{"name": "VREvent_Notification_Destroyed","value": "603"} + ,{"name": "VREvent_Quit","value": "700"} + ,{"name": "VREvent_ProcessQuit","value": "701"} + ,{"name": "VREvent_QuitAborted_UserPrompt","value": "702"} + ,{"name": "VREvent_QuitAcknowledged","value": "703"} + ,{"name": "VREvent_DriverRequestedQuit","value": "704"} + ,{"name": "VREvent_ChaperoneDataHasChanged","value": "800"} + ,{"name": "VREvent_ChaperoneUniverseHasChanged","value": "801"} + ,{"name": "VREvent_ChaperoneTempDataHasChanged","value": "802"} + ,{"name": "VREvent_ChaperoneSettingsHaveChanged","value": "803"} + ,{"name": "VREvent_SeatedZeroPoseReset","value": "804"} + ,{"name": "VREvent_AudioSettingsHaveChanged","value": "820"} + ,{"name": "VREvent_BackgroundSettingHasChanged","value": "850"} + ,{"name": "VREvent_CameraSettingsHaveChanged","value": "851"} + ,{"name": "VREvent_ReprojectionSettingHasChanged","value": "852"} + ,{"name": "VREvent_ModelSkinSettingsHaveChanged","value": "853"} + ,{"name": "VREvent_EnvironmentSettingsHaveChanged","value": "854"} + ,{"name": "VREvent_PowerSettingsHaveChanged","value": "855"} + ,{"name": "VREvent_EnableHomeAppSettingsHaveChanged","value": "856"} + ,{"name": "VREvent_StatusUpdate","value": "900"} + ,{"name": "VREvent_MCImageUpdated","value": "1000"} + ,{"name": "VREvent_FirmwareUpdateStarted","value": "1100"} + ,{"name": "VREvent_FirmwareUpdateFinished","value": "1101"} + ,{"name": "VREvent_KeyboardClosed","value": "1200"} + ,{"name": "VREvent_KeyboardCharInput","value": "1201"} + ,{"name": "VREvent_KeyboardDone","value": "1202"} + ,{"name": "VREvent_ApplicationTransitionStarted","value": "1300"} + ,{"name": "VREvent_ApplicationTransitionAborted","value": "1301"} + ,{"name": "VREvent_ApplicationTransitionNewAppStarted","value": "1302"} + ,{"name": "VREvent_ApplicationListUpdated","value": "1303"} + ,{"name": "VREvent_ApplicationMimeTypeLoad","value": "1304"} + ,{"name": "VREvent_ApplicationTransitionNewAppLaunchComplete","value": "1305"} + ,{"name": "VREvent_ProcessConnected","value": "1306"} + ,{"name": "VREvent_ProcessDisconnected","value": "1307"} + ,{"name": "VREvent_Compositor_MirrorWindowShown","value": "1400"} + ,{"name": "VREvent_Compositor_MirrorWindowHidden","value": "1401"} + ,{"name": "VREvent_Compositor_ChaperoneBoundsShown","value": "1410"} + ,{"name": "VREvent_Compositor_ChaperoneBoundsHidden","value": "1411"} + ,{"name": "VREvent_TrackedCamera_StartVideoStream","value": "1500"} + ,{"name": "VREvent_TrackedCamera_StopVideoStream","value": "1501"} + ,{"name": "VREvent_TrackedCamera_PauseVideoStream","value": "1502"} + ,{"name": "VREvent_TrackedCamera_ResumeVideoStream","value": "1503"} + ,{"name": "VREvent_TrackedCamera_EditingSurface","value": "1550"} + ,{"name": "VREvent_PerformanceTest_EnableCapture","value": "1600"} + ,{"name": "VREvent_PerformanceTest_DisableCapture","value": "1601"} + ,{"name": "VREvent_PerformanceTest_FidelityLevel","value": "1602"} + ,{"name": "VREvent_MessageOverlay_Closed","value": "1650"} + ,{"name": "VREvent_VendorSpecific_Reserved_Start","value": "10000"} + ,{"name": "VREvent_VendorSpecific_Reserved_End","value": "19999"} +]} +, {"enumname": "vr::EDeviceActivityLevel","values": [ + {"name": "k_EDeviceActivityLevel_Unknown","value": "-1"} + ,{"name": "k_EDeviceActivityLevel_Idle","value": "0"} + ,{"name": "k_EDeviceActivityLevel_UserInteraction","value": "1"} + ,{"name": "k_EDeviceActivityLevel_UserInteraction_Timeout","value": "2"} + ,{"name": "k_EDeviceActivityLevel_Standby","value": "3"} +]} +, {"enumname": "vr::EVRButtonId","values": [ + {"name": "k_EButton_System","value": "0"} + ,{"name": "k_EButton_ApplicationMenu","value": "1"} + ,{"name": "k_EButton_Grip","value": "2"} + ,{"name": "k_EButton_DPad_Left","value": "3"} + ,{"name": "k_EButton_DPad_Up","value": "4"} + ,{"name": "k_EButton_DPad_Right","value": "5"} + ,{"name": "k_EButton_DPad_Down","value": "6"} + ,{"name": "k_EButton_A","value": "7"} + ,{"name": "k_EButton_ProximitySensor","value": "31"} + ,{"name": "k_EButton_Axis0","value": "32"} + ,{"name": "k_EButton_Axis1","value": "33"} + ,{"name": "k_EButton_Axis2","value": "34"} + ,{"name": "k_EButton_Axis3","value": "35"} + ,{"name": "k_EButton_Axis4","value": "36"} + ,{"name": "k_EButton_SteamVR_Touchpad","value": "32"} + ,{"name": "k_EButton_SteamVR_Trigger","value": "33"} + ,{"name": "k_EButton_Dashboard_Back","value": "2"} + ,{"name": "k_EButton_Max","value": "64"} +]} +, {"enumname": "vr::EVRMouseButton","values": [ + {"name": "VRMouseButton_Left","value": "1"} + ,{"name": "VRMouseButton_Right","value": "2"} + ,{"name": "VRMouseButton_Middle","value": "4"} +]} +, {"enumname": "vr::EHiddenAreaMeshType","values": [ + {"name": "k_eHiddenAreaMesh_Standard","value": "0"} + ,{"name": "k_eHiddenAreaMesh_Inverse","value": "1"} + ,{"name": "k_eHiddenAreaMesh_LineLoop","value": "2"} + ,{"name": "k_eHiddenAreaMesh_Max","value": "3"} +]} +, {"enumname": "vr::EVRControllerAxisType","values": [ + {"name": "k_eControllerAxis_None","value": "0"} + ,{"name": "k_eControllerAxis_TrackPad","value": "1"} + ,{"name": "k_eControllerAxis_Joystick","value": "2"} + ,{"name": "k_eControllerAxis_Trigger","value": "3"} +]} +, {"enumname": "vr::EVRControllerEventOutputType","values": [ + {"name": "ControllerEventOutput_OSEvents","value": "0"} + ,{"name": "ControllerEventOutput_VREvents","value": "1"} +]} +, {"enumname": "vr::ECollisionBoundsStyle","values": [ + {"name": "COLLISION_BOUNDS_STYLE_BEGINNER","value": "0"} + ,{"name": "COLLISION_BOUNDS_STYLE_INTERMEDIATE","value": "1"} + ,{"name": "COLLISION_BOUNDS_STYLE_SQUARES","value": "2"} + ,{"name": "COLLISION_BOUNDS_STYLE_ADVANCED","value": "3"} + ,{"name": "COLLISION_BOUNDS_STYLE_NONE","value": "4"} + ,{"name": "COLLISION_BOUNDS_STYLE_COUNT","value": "5"} +]} +, {"enumname": "vr::EVROverlayError","values": [ + {"name": "VROverlayError_None","value": "0"} + ,{"name": "VROverlayError_UnknownOverlay","value": "10"} + ,{"name": "VROverlayError_InvalidHandle","value": "11"} + ,{"name": "VROverlayError_PermissionDenied","value": "12"} + ,{"name": "VROverlayError_OverlayLimitExceeded","value": "13"} + ,{"name": "VROverlayError_WrongVisibilityType","value": "14"} + ,{"name": "VROverlayError_KeyTooLong","value": "15"} + ,{"name": "VROverlayError_NameTooLong","value": "16"} + ,{"name": "VROverlayError_KeyInUse","value": "17"} + ,{"name": "VROverlayError_WrongTransformType","value": "18"} + ,{"name": "VROverlayError_InvalidTrackedDevice","value": "19"} + ,{"name": "VROverlayError_InvalidParameter","value": "20"} + ,{"name": "VROverlayError_ThumbnailCantBeDestroyed","value": "21"} + ,{"name": "VROverlayError_ArrayTooSmall","value": "22"} + ,{"name": "VROverlayError_RequestFailed","value": "23"} + ,{"name": "VROverlayError_InvalidTexture","value": "24"} + ,{"name": "VROverlayError_UnableToLoadFile","value": "25"} + ,{"name": "VROverlayError_KeyboardAlreadyInUse","value": "26"} + ,{"name": "VROverlayError_NoNeighbor","value": "27"} + ,{"name": "VROverlayError_TooManyMaskPrimitives","value": "29"} + ,{"name": "VROverlayError_BadMaskPrimitive","value": "30"} +]} +, {"enumname": "vr::EVRApplicationType","values": [ + {"name": "VRApplication_Other","value": "0"} + ,{"name": "VRApplication_Scene","value": "1"} + ,{"name": "VRApplication_Overlay","value": "2"} + ,{"name": "VRApplication_Background","value": "3"} + ,{"name": "VRApplication_Utility","value": "4"} + ,{"name": "VRApplication_VRMonitor","value": "5"} + ,{"name": "VRApplication_SteamWatchdog","value": "6"} + ,{"name": "VRApplication_Bootstrapper","value": "7"} + ,{"name": "VRApplication_Max","value": "8"} +]} +, {"enumname": "vr::EVRFirmwareError","values": [ + {"name": "VRFirmwareError_None","value": "0"} + ,{"name": "VRFirmwareError_Success","value": "1"} + ,{"name": "VRFirmwareError_Fail","value": "2"} +]} +, {"enumname": "vr::EVRNotificationError","values": [ + {"name": "VRNotificationError_OK","value": "0"} + ,{"name": "VRNotificationError_InvalidNotificationId","value": "100"} + ,{"name": "VRNotificationError_NotificationQueueFull","value": "101"} + ,{"name": "VRNotificationError_InvalidOverlayHandle","value": "102"} + ,{"name": "VRNotificationError_SystemWithUserValueAlreadyExists","value": "103"} +]} +, {"enumname": "vr::EVRInitError","values": [ + {"name": "VRInitError_None","value": "0"} + ,{"name": "VRInitError_Unknown","value": "1"} + ,{"name": "VRInitError_Init_InstallationNotFound","value": "100"} + ,{"name": "VRInitError_Init_InstallationCorrupt","value": "101"} + ,{"name": "VRInitError_Init_VRClientDLLNotFound","value": "102"} + ,{"name": "VRInitError_Init_FileNotFound","value": "103"} + ,{"name": "VRInitError_Init_FactoryNotFound","value": "104"} + ,{"name": "VRInitError_Init_InterfaceNotFound","value": "105"} + ,{"name": "VRInitError_Init_InvalidInterface","value": "106"} + ,{"name": "VRInitError_Init_UserConfigDirectoryInvalid","value": "107"} + ,{"name": "VRInitError_Init_HmdNotFound","value": "108"} + ,{"name": "VRInitError_Init_NotInitialized","value": "109"} + ,{"name": "VRInitError_Init_PathRegistryNotFound","value": "110"} + ,{"name": "VRInitError_Init_NoConfigPath","value": "111"} + ,{"name": "VRInitError_Init_NoLogPath","value": "112"} + ,{"name": "VRInitError_Init_PathRegistryNotWritable","value": "113"} + ,{"name": "VRInitError_Init_AppInfoInitFailed","value": "114"} + ,{"name": "VRInitError_Init_Retry","value": "115"} + ,{"name": "VRInitError_Init_InitCanceledByUser","value": "116"} + ,{"name": "VRInitError_Init_AnotherAppLaunching","value": "117"} + ,{"name": "VRInitError_Init_SettingsInitFailed","value": "118"} + ,{"name": "VRInitError_Init_ShuttingDown","value": "119"} + ,{"name": "VRInitError_Init_TooManyObjects","value": "120"} + ,{"name": "VRInitError_Init_NoServerForBackgroundApp","value": "121"} + ,{"name": "VRInitError_Init_NotSupportedWithCompositor","value": "122"} + ,{"name": "VRInitError_Init_NotAvailableToUtilityApps","value": "123"} + ,{"name": "VRInitError_Init_Internal","value": "124"} + ,{"name": "VRInitError_Init_HmdDriverIdIsNone","value": "125"} + ,{"name": "VRInitError_Init_HmdNotFoundPresenceFailed","value": "126"} + ,{"name": "VRInitError_Init_VRMonitorNotFound","value": "127"} + ,{"name": "VRInitError_Init_VRMonitorStartupFailed","value": "128"} + ,{"name": "VRInitError_Init_LowPowerWatchdogNotSupported","value": "129"} + ,{"name": "VRInitError_Init_InvalidApplicationType","value": "130"} + ,{"name": "VRInitError_Init_NotAvailableToWatchdogApps","value": "131"} + ,{"name": "VRInitError_Init_WatchdogDisabledInSettings","value": "132"} + ,{"name": "VRInitError_Init_VRDashboardNotFound","value": "133"} + ,{"name": "VRInitError_Init_VRDashboardStartupFailed","value": "134"} + ,{"name": "VRInitError_Init_VRHomeNotFound","value": "135"} + ,{"name": "VRInitError_Init_VRHomeStartupFailed","value": "136"} + ,{"name": "VRInitError_Driver_Failed","value": "200"} + ,{"name": "VRInitError_Driver_Unknown","value": "201"} + ,{"name": "VRInitError_Driver_HmdUnknown","value": "202"} + ,{"name": "VRInitError_Driver_NotLoaded","value": "203"} + ,{"name": "VRInitError_Driver_RuntimeOutOfDate","value": "204"} + ,{"name": "VRInitError_Driver_HmdInUse","value": "205"} + ,{"name": "VRInitError_Driver_NotCalibrated","value": "206"} + ,{"name": "VRInitError_Driver_CalibrationInvalid","value": "207"} + ,{"name": "VRInitError_Driver_HmdDisplayNotFound","value": "208"} + ,{"name": "VRInitError_Driver_TrackedDeviceInterfaceUnknown","value": "209"} + ,{"name": "VRInitError_Driver_HmdDriverIdOutOfBounds","value": "211"} + ,{"name": "VRInitError_Driver_HmdDisplayMirrored","value": "212"} + ,{"name": "VRInitError_IPC_ServerInitFailed","value": "300"} + ,{"name": "VRInitError_IPC_ConnectFailed","value": "301"} + ,{"name": "VRInitError_IPC_SharedStateInitFailed","value": "302"} + ,{"name": "VRInitError_IPC_CompositorInitFailed","value": "303"} + ,{"name": "VRInitError_IPC_MutexInitFailed","value": "304"} + ,{"name": "VRInitError_IPC_Failed","value": "305"} + ,{"name": "VRInitError_IPC_CompositorConnectFailed","value": "306"} + ,{"name": "VRInitError_IPC_CompositorInvalidConnectResponse","value": "307"} + ,{"name": "VRInitError_IPC_ConnectFailedAfterMultipleAttempts","value": "308"} + ,{"name": "VRInitError_Compositor_Failed","value": "400"} + ,{"name": "VRInitError_Compositor_D3D11HardwareRequired","value": "401"} + ,{"name": "VRInitError_Compositor_FirmwareRequiresUpdate","value": "402"} + ,{"name": "VRInitError_Compositor_OverlayInitFailed","value": "403"} + ,{"name": "VRInitError_Compositor_ScreenshotsInitFailed","value": "404"} + ,{"name": "VRInitError_Compositor_UnableToCreateDevice","value": "405"} + ,{"name": "VRInitError_VendorSpecific_UnableToConnectToOculusRuntime","value": "1000"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_CantOpenDevice","value": "1101"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_UnableToRequestConfigStart","value": "1102"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_NoStoredConfig","value": "1103"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_ConfigTooBig","value": "1104"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_ConfigTooSmall","value": "1105"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_UnableToInitZLib","value": "1106"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_CantReadFirmwareVersion","value": "1107"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_UnableToSendUserDataStart","value": "1108"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataStart","value": "1109"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataNext","value": "1110"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_UserDataAddressRange","value": "1111"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_UserDataError","value": "1112"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_ConfigFailedSanityCheck","value": "1113"} + ,{"name": "VRInitError_Steam_SteamInstallationNotFound","value": "2000"} +]} +, {"enumname": "vr::EVRScreenshotType","values": [ + {"name": "VRScreenshotType_None","value": "0"} + ,{"name": "VRScreenshotType_Mono","value": "1"} + ,{"name": "VRScreenshotType_Stereo","value": "2"} + ,{"name": "VRScreenshotType_Cubemap","value": "3"} + ,{"name": "VRScreenshotType_MonoPanorama","value": "4"} + ,{"name": "VRScreenshotType_StereoPanorama","value": "5"} +]} +, {"enumname": "vr::EVRScreenshotPropertyFilenames","values": [ + {"name": "VRScreenshotPropertyFilenames_Preview","value": "0"} + ,{"name": "VRScreenshotPropertyFilenames_VR","value": "1"} +]} +, {"enumname": "vr::EVRTrackedCameraError","values": [ + {"name": "VRTrackedCameraError_None","value": "0"} + ,{"name": "VRTrackedCameraError_OperationFailed","value": "100"} + ,{"name": "VRTrackedCameraError_InvalidHandle","value": "101"} + ,{"name": "VRTrackedCameraError_InvalidFrameHeaderVersion","value": "102"} + ,{"name": "VRTrackedCameraError_OutOfHandles","value": "103"} + ,{"name": "VRTrackedCameraError_IPCFailure","value": "104"} + ,{"name": "VRTrackedCameraError_NotSupportedForThisDevice","value": "105"} + ,{"name": "VRTrackedCameraError_SharedMemoryFailure","value": "106"} + ,{"name": "VRTrackedCameraError_FrameBufferingFailure","value": "107"} + ,{"name": "VRTrackedCameraError_StreamSetupFailure","value": "108"} + ,{"name": "VRTrackedCameraError_InvalidGLTextureId","value": "109"} + ,{"name": "VRTrackedCameraError_InvalidSharedTextureHandle","value": "110"} + ,{"name": "VRTrackedCameraError_FailedToGetGLTextureId","value": "111"} + ,{"name": "VRTrackedCameraError_SharedTextureFailure","value": "112"} + ,{"name": "VRTrackedCameraError_NoFrameAvailable","value": "113"} + ,{"name": "VRTrackedCameraError_InvalidArgument","value": "114"} + ,{"name": "VRTrackedCameraError_InvalidFrameBufferSize","value": "115"} +]} +, {"enumname": "vr::EVRTrackedCameraFrameType","values": [ + {"name": "VRTrackedCameraFrameType_Distorted","value": "0"} + ,{"name": "VRTrackedCameraFrameType_Undistorted","value": "1"} + ,{"name": "VRTrackedCameraFrameType_MaximumUndistorted","value": "2"} + ,{"name": "MAX_CAMERA_FRAME_TYPES","value": "3"} +]} +, {"enumname": "vr::EVRApplicationError","values": [ + {"name": "VRApplicationError_None","value": "0"} + ,{"name": "VRApplicationError_AppKeyAlreadyExists","value": "100"} + ,{"name": "VRApplicationError_NoManifest","value": "101"} + ,{"name": "VRApplicationError_NoApplication","value": "102"} + ,{"name": "VRApplicationError_InvalidIndex","value": "103"} + ,{"name": "VRApplicationError_UnknownApplication","value": "104"} + ,{"name": "VRApplicationError_IPCFailed","value": "105"} + ,{"name": "VRApplicationError_ApplicationAlreadyRunning","value": "106"} + ,{"name": "VRApplicationError_InvalidManifest","value": "107"} + ,{"name": "VRApplicationError_InvalidApplication","value": "108"} + ,{"name": "VRApplicationError_LaunchFailed","value": "109"} + ,{"name": "VRApplicationError_ApplicationAlreadyStarting","value": "110"} + ,{"name": "VRApplicationError_LaunchInProgress","value": "111"} + ,{"name": "VRApplicationError_OldApplicationQuitting","value": "112"} + ,{"name": "VRApplicationError_TransitionAborted","value": "113"} + ,{"name": "VRApplicationError_IsTemplate","value": "114"} + ,{"name": "VRApplicationError_BufferTooSmall","value": "200"} + ,{"name": "VRApplicationError_PropertyNotSet","value": "201"} + ,{"name": "VRApplicationError_UnknownProperty","value": "202"} + ,{"name": "VRApplicationError_InvalidParameter","value": "203"} +]} +, {"enumname": "vr::EVRApplicationProperty","values": [ + {"name": "VRApplicationProperty_Name_String","value": "0"} + ,{"name": "VRApplicationProperty_LaunchType_String","value": "11"} + ,{"name": "VRApplicationProperty_WorkingDirectory_String","value": "12"} + ,{"name": "VRApplicationProperty_BinaryPath_String","value": "13"} + ,{"name": "VRApplicationProperty_Arguments_String","value": "14"} + ,{"name": "VRApplicationProperty_URL_String","value": "15"} + ,{"name": "VRApplicationProperty_Description_String","value": "50"} + ,{"name": "VRApplicationProperty_NewsURL_String","value": "51"} + ,{"name": "VRApplicationProperty_ImagePath_String","value": "52"} + ,{"name": "VRApplicationProperty_Source_String","value": "53"} + ,{"name": "VRApplicationProperty_IsDashboardOverlay_Bool","value": "60"} + ,{"name": "VRApplicationProperty_IsTemplate_Bool","value": "61"} + ,{"name": "VRApplicationProperty_IsInstanced_Bool","value": "62"} + ,{"name": "VRApplicationProperty_IsInternal_Bool","value": "63"} + ,{"name": "VRApplicationProperty_LastLaunchTime_Uint64","value": "70"} +]} +, {"enumname": "vr::EVRApplicationTransitionState","values": [ + {"name": "VRApplicationTransition_None","value": "0"} + ,{"name": "VRApplicationTransition_OldAppQuitSent","value": "10"} + ,{"name": "VRApplicationTransition_WaitingForExternalLaunch","value": "11"} + ,{"name": "VRApplicationTransition_NewAppLaunched","value": "20"} +]} +, {"enumname": "vr::ChaperoneCalibrationState","values": [ + {"name": "ChaperoneCalibrationState_OK","value": "1"} + ,{"name": "ChaperoneCalibrationState_Warning","value": "100"} + ,{"name": "ChaperoneCalibrationState_Warning_BaseStationMayHaveMoved","value": "101"} + ,{"name": "ChaperoneCalibrationState_Warning_BaseStationRemoved","value": "102"} + ,{"name": "ChaperoneCalibrationState_Warning_SeatedBoundsInvalid","value": "103"} + ,{"name": "ChaperoneCalibrationState_Error","value": "200"} + ,{"name": "ChaperoneCalibrationState_Error_BaseStationUninitialized","value": "201"} + ,{"name": "ChaperoneCalibrationState_Error_BaseStationConflict","value": "202"} + ,{"name": "ChaperoneCalibrationState_Error_PlayAreaInvalid","value": "203"} + ,{"name": "ChaperoneCalibrationState_Error_CollisionBoundsInvalid","value": "204"} +]} +, {"enumname": "vr::EChaperoneConfigFile","values": [ + {"name": "EChaperoneConfigFile_Live","value": "1"} + ,{"name": "EChaperoneConfigFile_Temp","value": "2"} +]} +, {"enumname": "vr::EChaperoneImportFlags","values": [ + {"name": "EChaperoneImport_BoundsOnly","value": "1"} +]} +, {"enumname": "vr::EVRCompositorError","values": [ + {"name": "VRCompositorError_None","value": "0"} + ,{"name": "VRCompositorError_RequestFailed","value": "1"} + ,{"name": "VRCompositorError_IncompatibleVersion","value": "100"} + ,{"name": "VRCompositorError_DoNotHaveFocus","value": "101"} + ,{"name": "VRCompositorError_InvalidTexture","value": "102"} + ,{"name": "VRCompositorError_IsNotSceneApplication","value": "103"} + ,{"name": "VRCompositorError_TextureIsOnWrongDevice","value": "104"} + ,{"name": "VRCompositorError_TextureUsesUnsupportedFormat","value": "105"} + ,{"name": "VRCompositorError_SharedTexturesNotSupported","value": "106"} + ,{"name": "VRCompositorError_IndexOutOfRange","value": "107"} + ,{"name": "VRCompositorError_AlreadySubmitted","value": "108"} +]} +, {"enumname": "vr::VROverlayInputMethod","values": [ + {"name": "VROverlayInputMethod_None","value": "0"} + ,{"name": "VROverlayInputMethod_Mouse","value": "1"} +]} +, {"enumname": "vr::VROverlayTransformType","values": [ + {"name": "VROverlayTransform_Absolute","value": "0"} + ,{"name": "VROverlayTransform_TrackedDeviceRelative","value": "1"} + ,{"name": "VROverlayTransform_SystemOverlay","value": "2"} + ,{"name": "VROverlayTransform_TrackedComponent","value": "3"} +]} +, {"enumname": "vr::VROverlayFlags","values": [ + {"name": "VROverlayFlags_None","value": "0"} + ,{"name": "VROverlayFlags_Curved","value": "1"} + ,{"name": "VROverlayFlags_RGSS4X","value": "2"} + ,{"name": "VROverlayFlags_NoDashboardTab","value": "3"} + ,{"name": "VROverlayFlags_AcceptsGamepadEvents","value": "4"} + ,{"name": "VROverlayFlags_ShowGamepadFocus","value": "5"} + ,{"name": "VROverlayFlags_SendVRScrollEvents","value": "6"} + ,{"name": "VROverlayFlags_SendVRTouchpadEvents","value": "7"} + ,{"name": "VROverlayFlags_ShowTouchPadScrollWheel","value": "8"} + ,{"name": "VROverlayFlags_TransferOwnershipToInternalProcess","value": "9"} + ,{"name": "VROverlayFlags_SideBySide_Parallel","value": "10"} + ,{"name": "VROverlayFlags_SideBySide_Crossed","value": "11"} + ,{"name": "VROverlayFlags_Panorama","value": "12"} + ,{"name": "VROverlayFlags_StereoPanorama","value": "13"} + ,{"name": "VROverlayFlags_SortWithNonSceneOverlays","value": "14"} + ,{"name": "VROverlayFlags_VisibleInDashboard","value": "15"} +]} +, {"enumname": "vr::VRMessageOverlayResponse","values": [ + {"name": "VRMessageOverlayResponse_ButtonPress_0","value": "0"} + ,{"name": "VRMessageOverlayResponse_ButtonPress_1","value": "1"} + ,{"name": "VRMessageOverlayResponse_ButtonPress_2","value": "2"} + ,{"name": "VRMessageOverlayResponse_ButtonPress_3","value": "3"} + ,{"name": "VRMessageOverlayResponse_CouldntFindSystemOverlay","value": "4"} + ,{"name": "VRMessageOverlayResponse_CouldntFindOrCreateClientOverlay","value": "5"} + ,{"name": "VRMessageOverlayResponse_ApplicationQuit","value": "6"} +]} +, {"enumname": "vr::EGamepadTextInputMode","values": [ + {"name": "k_EGamepadTextInputModeNormal","value": "0"} + ,{"name": "k_EGamepadTextInputModePassword","value": "1"} + ,{"name": "k_EGamepadTextInputModeSubmit","value": "2"} +]} +, {"enumname": "vr::EGamepadTextInputLineMode","values": [ + {"name": "k_EGamepadTextInputLineModeSingleLine","value": "0"} + ,{"name": "k_EGamepadTextInputLineModeMultipleLines","value": "1"} +]} +, {"enumname": "vr::EOverlayDirection","values": [ + {"name": "OverlayDirection_Up","value": "0"} + ,{"name": "OverlayDirection_Down","value": "1"} + ,{"name": "OverlayDirection_Left","value": "2"} + ,{"name": "OverlayDirection_Right","value": "3"} + ,{"name": "OverlayDirection_Count","value": "4"} +]} +, {"enumname": "vr::EVROverlayIntersectionMaskPrimitiveType","values": [ + {"name": "OverlayIntersectionPrimitiveType_Rectangle","value": "0"} + ,{"name": "OverlayIntersectionPrimitiveType_Circle","value": "1"} +]} +, {"enumname": "vr::EVRRenderModelError","values": [ + {"name": "VRRenderModelError_None","value": "0"} + ,{"name": "VRRenderModelError_Loading","value": "100"} + ,{"name": "VRRenderModelError_NotSupported","value": "200"} + ,{"name": "VRRenderModelError_InvalidArg","value": "300"} + ,{"name": "VRRenderModelError_InvalidModel","value": "301"} + ,{"name": "VRRenderModelError_NoShapes","value": "302"} + ,{"name": "VRRenderModelError_MultipleShapes","value": "303"} + ,{"name": "VRRenderModelError_TooManyVertices","value": "304"} + ,{"name": "VRRenderModelError_MultipleTextures","value": "305"} + ,{"name": "VRRenderModelError_BufferTooSmall","value": "306"} + ,{"name": "VRRenderModelError_NotEnoughNormals","value": "307"} + ,{"name": "VRRenderModelError_NotEnoughTexCoords","value": "308"} + ,{"name": "VRRenderModelError_InvalidTexture","value": "400"} +]} +, {"enumname": "vr::EVRComponentProperty","values": [ + {"name": "VRComponentProperty_IsStatic","value": "1"} + ,{"name": "VRComponentProperty_IsVisible","value": "2"} + ,{"name": "VRComponentProperty_IsTouched","value": "4"} + ,{"name": "VRComponentProperty_IsPressed","value": "8"} + ,{"name": "VRComponentProperty_IsScrolled","value": "16"} +]} +, {"enumname": "vr::EVRNotificationType","values": [ + {"name": "EVRNotificationType_Transient","value": "0"} + ,{"name": "EVRNotificationType_Persistent","value": "1"} + ,{"name": "EVRNotificationType_Transient_SystemWithUserValue","value": "2"} +]} +, {"enumname": "vr::EVRNotificationStyle","values": [ + {"name": "EVRNotificationStyle_None","value": "0"} + ,{"name": "EVRNotificationStyle_Application","value": "100"} + ,{"name": "EVRNotificationStyle_Contact_Disabled","value": "200"} + ,{"name": "EVRNotificationStyle_Contact_Enabled","value": "201"} + ,{"name": "EVRNotificationStyle_Contact_Active","value": "202"} +]} +, {"enumname": "vr::EVRSettingsError","values": [ + {"name": "VRSettingsError_None","value": "0"} + ,{"name": "VRSettingsError_IPCFailed","value": "1"} + ,{"name": "VRSettingsError_WriteFailed","value": "2"} + ,{"name": "VRSettingsError_ReadFailed","value": "3"} + ,{"name": "VRSettingsError_JsonParseFailed","value": "4"} + ,{"name": "VRSettingsError_UnsetSettingHasNoDefault","value": "5"} +]} +, {"enumname": "vr::EVRScreenshotError","values": [ + {"name": "VRScreenshotError_None","value": "0"} + ,{"name": "VRScreenshotError_RequestFailed","value": "1"} + ,{"name": "VRScreenshotError_IncompatibleVersion","value": "100"} + ,{"name": "VRScreenshotError_NotFound","value": "101"} + ,{"name": "VRScreenshotError_BufferTooSmall","value": "102"} + ,{"name": "VRScreenshotError_ScreenshotAlreadyInProgress","value": "108"} +]} +], +"consts":[{ + "constname": "k_nDriverNone","consttype": "const uint32_t", "constval": "4294967295"} +,{ + "constname": "k_unMaxDriverDebugResponseSize","consttype": "const uint32_t", "constval": "32768"} +,{ + "constname": "k_unTrackedDeviceIndex_Hmd","consttype": "const uint32_t", "constval": "0"} +,{ + "constname": "k_unMaxTrackedDeviceCount","consttype": "const uint32_t", "constval": "16"} +,{ + "constname": "k_unTrackedDeviceIndexOther","consttype": "const uint32_t", "constval": "4294967294"} +,{ + "constname": "k_unTrackedDeviceIndexInvalid","consttype": "const uint32_t", "constval": "4294967295"} +,{ + "constname": "k_ulInvalidPropertyContainer","consttype": "const PropertyContainerHandle_t", "constval": "0"} +,{ + "constname": "k_unInvalidPropertyTag","consttype": "const PropertyTypeTag_t", "constval": "0"} +,{ + "constname": "k_unFloatPropertyTag","consttype": "const PropertyTypeTag_t", "constval": "1"} +,{ + "constname": "k_unInt32PropertyTag","consttype": "const PropertyTypeTag_t", "constval": "2"} +,{ + "constname": "k_unUint64PropertyTag","consttype": "const PropertyTypeTag_t", "constval": "3"} +,{ + "constname": "k_unBoolPropertyTag","consttype": "const PropertyTypeTag_t", "constval": "4"} +,{ + "constname": "k_unStringPropertyTag","consttype": "const PropertyTypeTag_t", "constval": "5"} +,{ + "constname": "k_unHmdMatrix34PropertyTag","consttype": "const PropertyTypeTag_t", "constval": "20"} +,{ + "constname": "k_unHmdMatrix44PropertyTag","consttype": "const PropertyTypeTag_t", "constval": "21"} +,{ + "constname": "k_unHmdVector3PropertyTag","consttype": "const PropertyTypeTag_t", "constval": "22"} +,{ + "constname": "k_unHmdVector4PropertyTag","consttype": "const PropertyTypeTag_t", "constval": "23"} +,{ + "constname": "k_unHiddenAreaPropertyTag","consttype": "const PropertyTypeTag_t", "constval": "30"} +,{ + "constname": "k_unOpenVRInternalReserved_Start","consttype": "const PropertyTypeTag_t", "constval": "1000"} +,{ + "constname": "k_unOpenVRInternalReserved_End","consttype": "const PropertyTypeTag_t", "constval": "10000"} +,{ + "constname": "k_unMaxPropertyStringSize","consttype": "const uint32_t", "constval": "32768"} +,{ + "constname": "k_unControllerStateAxisCount","consttype": "const uint32_t", "constval": "5"} +,{ + "constname": "k_ulOverlayHandleInvalid","consttype": "const VROverlayHandle_t", "constval": "0"} +,{ + "constname": "k_unScreenshotHandleInvalid","consttype": "const uint32_t", "constval": "0"} +,{ + "constname": "IVRSystem_Version","consttype": "const char *const", "constval": "IVRSystem_016"} +,{ + "constname": "IVRExtendedDisplay_Version","consttype": "const char *const", "constval": "IVRExtendedDisplay_001"} +,{ + "constname": "IVRTrackedCamera_Version","consttype": "const char *const", "constval": "IVRTrackedCamera_003"} +,{ + "constname": "k_unMaxApplicationKeyLength","consttype": "const uint32_t", "constval": "128"} +,{ + "constname": "k_pch_MimeType_HomeApp","consttype": "const char *const", "constval": "vr/home"} +,{ + "constname": "k_pch_MimeType_GameTheater","consttype": "const char *const", "constval": "vr/game_theater"} +,{ + "constname": "IVRApplications_Version","consttype": "const char *const", "constval": "IVRApplications_006"} +,{ + "constname": "IVRChaperone_Version","consttype": "const char *const", "constval": "IVRChaperone_003"} +,{ + "constname": "IVRChaperoneSetup_Version","consttype": "const char *const", "constval": "IVRChaperoneSetup_005"} +,{ + "constname": "IVRCompositor_Version","consttype": "const char *const", "constval": "IVRCompositor_020"} +,{ + "constname": "k_unVROverlayMaxKeyLength","consttype": "const uint32_t", "constval": "128"} +,{ + "constname": "k_unVROverlayMaxNameLength","consttype": "const uint32_t", "constval": "128"} +,{ + "constname": "k_unMaxOverlayCount","consttype": "const uint32_t", "constval": "64"} +,{ + "constname": "k_unMaxOverlayIntersectionMaskPrimitivesCount","consttype": "const uint32_t", "constval": "32"} +,{ + "constname": "IVROverlay_Version","consttype": "const char *const", "constval": "IVROverlay_016"} +,{ + "constname": "k_pch_Controller_Component_GDC2015","consttype": "const char *const", "constval": "gdc2015"} +,{ + "constname": "k_pch_Controller_Component_Base","consttype": "const char *const", "constval": "base"} +,{ + "constname": "k_pch_Controller_Component_Tip","consttype": "const char *const", "constval": "tip"} +,{ + "constname": "k_pch_Controller_Component_HandGrip","consttype": "const char *const", "constval": "handgrip"} +,{ + "constname": "k_pch_Controller_Component_Status","consttype": "const char *const", "constval": "status"} +,{ + "constname": "IVRRenderModels_Version","consttype": "const char *const", "constval": "IVRRenderModels_005"} +,{ + "constname": "k_unNotificationTextMaxSize","consttype": "const uint32_t", "constval": "256"} +,{ + "constname": "IVRNotifications_Version","consttype": "const char *const", "constval": "IVRNotifications_002"} +,{ + "constname": "k_unMaxSettingsKeyLength","consttype": "const uint32_t", "constval": "128"} +,{ + "constname": "IVRSettings_Version","consttype": "const char *const", "constval": "IVRSettings_002"} +,{ + "constname": "k_pch_SteamVR_Section","consttype": "const char *const", "constval": "steamvr"} +,{ + "constname": "k_pch_SteamVR_RequireHmd_String","consttype": "const char *const", "constval": "requireHmd"} +,{ + "constname": "k_pch_SteamVR_ForcedDriverKey_String","consttype": "const char *const", "constval": "forcedDriver"} +,{ + "constname": "k_pch_SteamVR_ForcedHmdKey_String","consttype": "const char *const", "constval": "forcedHmd"} +,{ + "constname": "k_pch_SteamVR_DisplayDebug_Bool","consttype": "const char *const", "constval": "displayDebug"} +,{ + "constname": "k_pch_SteamVR_DebugProcessPipe_String","consttype": "const char *const", "constval": "debugProcessPipe"} +,{ + "constname": "k_pch_SteamVR_DisplayDebugX_Int32","consttype": "const char *const", "constval": "displayDebugX"} +,{ + "constname": "k_pch_SteamVR_DisplayDebugY_Int32","consttype": "const char *const", "constval": "displayDebugY"} +,{ + "constname": "k_pch_SteamVR_SendSystemButtonToAllApps_Bool","consttype": "const char *const", "constval": "sendSystemButtonToAllApps"} +,{ + "constname": "k_pch_SteamVR_LogLevel_Int32","consttype": "const char *const", "constval": "loglevel"} +,{ + "constname": "k_pch_SteamVR_IPD_Float","consttype": "const char *const", "constval": "ipd"} +,{ + "constname": "k_pch_SteamVR_Background_String","consttype": "const char *const", "constval": "background"} +,{ + "constname": "k_pch_SteamVR_BackgroundUseDomeProjection_Bool","consttype": "const char *const", "constval": "backgroundUseDomeProjection"} +,{ + "constname": "k_pch_SteamVR_BackgroundCameraHeight_Float","consttype": "const char *const", "constval": "backgroundCameraHeight"} +,{ + "constname": "k_pch_SteamVR_BackgroundDomeRadius_Float","consttype": "const char *const", "constval": "backgroundDomeRadius"} +,{ + "constname": "k_pch_SteamVR_GridColor_String","consttype": "const char *const", "constval": "gridColor"} +,{ + "constname": "k_pch_SteamVR_PlayAreaColor_String","consttype": "const char *const", "constval": "playAreaColor"} +,{ + "constname": "k_pch_SteamVR_ShowStage_Bool","consttype": "const char *const", "constval": "showStage"} +,{ + "constname": "k_pch_SteamVR_ActivateMultipleDrivers_Bool","consttype": "const char *const", "constval": "activateMultipleDrivers"} +,{ + "constname": "k_pch_SteamVR_DirectMode_Bool","consttype": "const char *const", "constval": "directMode"} +,{ + "constname": "k_pch_SteamVR_DirectModeEdidVid_Int32","consttype": "const char *const", "constval": "directModeEdidVid"} +,{ + "constname": "k_pch_SteamVR_DirectModeEdidPid_Int32","consttype": "const char *const", "constval": "directModeEdidPid"} +,{ + "constname": "k_pch_SteamVR_UsingSpeakers_Bool","consttype": "const char *const", "constval": "usingSpeakers"} +,{ + "constname": "k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float","consttype": "const char *const", "constval": "speakersForwardYawOffsetDegrees"} +,{ + "constname": "k_pch_SteamVR_BaseStationPowerManagement_Bool","consttype": "const char *const", "constval": "basestationPowerManagement"} +,{ + "constname": "k_pch_SteamVR_NeverKillProcesses_Bool","consttype": "const char *const", "constval": "neverKillProcesses"} +,{ + "constname": "k_pch_SteamVR_SupersampleScale_Float","consttype": "const char *const", "constval": "supersampleScale"} +,{ + "constname": "k_pch_SteamVR_AllowAsyncReprojection_Bool","consttype": "const char *const", "constval": "allowAsyncReprojection"} +,{ + "constname": "k_pch_SteamVR_AllowReprojection_Bool","consttype": "const char *const", "constval": "allowInterleavedReprojection"} +,{ + "constname": "k_pch_SteamVR_ForceReprojection_Bool","consttype": "const char *const", "constval": "forceReprojection"} +,{ + "constname": "k_pch_SteamVR_ForceFadeOnBadTracking_Bool","consttype": "const char *const", "constval": "forceFadeOnBadTracking"} +,{ + "constname": "k_pch_SteamVR_DefaultMirrorView_Int32","consttype": "const char *const", "constval": "defaultMirrorView"} +,{ + "constname": "k_pch_SteamVR_ShowMirrorView_Bool","consttype": "const char *const", "constval": "showMirrorView"} +,{ + "constname": "k_pch_SteamVR_MirrorViewGeometry_String","consttype": "const char *const", "constval": "mirrorViewGeometry"} +,{ + "constname": "k_pch_SteamVR_StartMonitorFromAppLaunch","consttype": "const char *const", "constval": "startMonitorFromAppLaunch"} +,{ + "constname": "k_pch_SteamVR_StartCompositorFromAppLaunch_Bool","consttype": "const char *const", "constval": "startCompositorFromAppLaunch"} +,{ + "constname": "k_pch_SteamVR_StartDashboardFromAppLaunch_Bool","consttype": "const char *const", "constval": "startDashboardFromAppLaunch"} +,{ + "constname": "k_pch_SteamVR_StartOverlayAppsFromDashboard_Bool","consttype": "const char *const", "constval": "startOverlayAppsFromDashboard"} +,{ + "constname": "k_pch_SteamVR_EnableHomeApp","consttype": "const char *const", "constval": "enableHomeApp"} +,{ + "constname": "k_pch_SteamVR_CycleBackgroundImageTimeSec_Int32","consttype": "const char *const", "constval": "CycleBackgroundImageTimeSec"} +,{ + "constname": "k_pch_SteamVR_RetailDemo_Bool","consttype": "const char *const", "constval": "retailDemo"} +,{ + "constname": "k_pch_SteamVR_IpdOffset_Float","consttype": "const char *const", "constval": "ipdOffset"} +,{ + "constname": "k_pch_SteamVR_AllowSupersampleFiltering_Bool","consttype": "const char *const", "constval": "allowSupersampleFiltering"} +,{ + "constname": "k_pch_Lighthouse_Section","consttype": "const char *const", "constval": "driver_lighthouse"} +,{ + "constname": "k_pch_Lighthouse_DisableIMU_Bool","consttype": "const char *const", "constval": "disableimu"} +,{ + "constname": "k_pch_Lighthouse_UseDisambiguation_String","consttype": "const char *const", "constval": "usedisambiguation"} +,{ + "constname": "k_pch_Lighthouse_DisambiguationDebug_Int32","consttype": "const char *const", "constval": "disambiguationdebug"} +,{ + "constname": "k_pch_Lighthouse_PrimaryBasestation_Int32","consttype": "const char *const", "constval": "primarybasestation"} +,{ + "constname": "k_pch_Lighthouse_DBHistory_Bool","consttype": "const char *const", "constval": "dbhistory"} +,{ + "constname": "k_pch_Null_Section","consttype": "const char *const", "constval": "driver_null"} +,{ + "constname": "k_pch_Null_SerialNumber_String","consttype": "const char *const", "constval": "serialNumber"} +,{ + "constname": "k_pch_Null_ModelNumber_String","consttype": "const char *const", "constval": "modelNumber"} +,{ + "constname": "k_pch_Null_WindowX_Int32","consttype": "const char *const", "constval": "windowX"} +,{ + "constname": "k_pch_Null_WindowY_Int32","consttype": "const char *const", "constval": "windowY"} +,{ + "constname": "k_pch_Null_WindowWidth_Int32","consttype": "const char *const", "constval": "windowWidth"} +,{ + "constname": "k_pch_Null_WindowHeight_Int32","consttype": "const char *const", "constval": "windowHeight"} +,{ + "constname": "k_pch_Null_RenderWidth_Int32","consttype": "const char *const", "constval": "renderWidth"} +,{ + "constname": "k_pch_Null_RenderHeight_Int32","consttype": "const char *const", "constval": "renderHeight"} +,{ + "constname": "k_pch_Null_SecondsFromVsyncToPhotons_Float","consttype": "const char *const", "constval": "secondsFromVsyncToPhotons"} +,{ + "constname": "k_pch_Null_DisplayFrequency_Float","consttype": "const char *const", "constval": "displayFrequency"} +,{ + "constname": "k_pch_UserInterface_Section","consttype": "const char *const", "constval": "userinterface"} +,{ + "constname": "k_pch_UserInterface_StatusAlwaysOnTop_Bool","consttype": "const char *const", "constval": "StatusAlwaysOnTop"} +,{ + "constname": "k_pch_UserInterface_MinimizeToTray_Bool","consttype": "const char *const", "constval": "MinimizeToTray"} +,{ + "constname": "k_pch_UserInterface_Screenshots_Bool","consttype": "const char *const", "constval": "screenshots"} +,{ + "constname": "k_pch_UserInterface_ScreenshotType_Int","consttype": "const char *const", "constval": "screenshotType"} +,{ + "constname": "k_pch_Notifications_Section","consttype": "const char *const", "constval": "notifications"} +,{ + "constname": "k_pch_Notifications_DoNotDisturb_Bool","consttype": "const char *const", "constval": "DoNotDisturb"} +,{ + "constname": "k_pch_Keyboard_Section","consttype": "const char *const", "constval": "keyboard"} +,{ + "constname": "k_pch_Keyboard_TutorialCompletions","consttype": "const char *const", "constval": "TutorialCompletions"} +,{ + "constname": "k_pch_Keyboard_ScaleX","consttype": "const char *const", "constval": "ScaleX"} +,{ + "constname": "k_pch_Keyboard_ScaleY","consttype": "const char *const", "constval": "ScaleY"} +,{ + "constname": "k_pch_Keyboard_OffsetLeftX","consttype": "const char *const", "constval": "OffsetLeftX"} +,{ + "constname": "k_pch_Keyboard_OffsetRightX","consttype": "const char *const", "constval": "OffsetRightX"} +,{ + "constname": "k_pch_Keyboard_OffsetY","consttype": "const char *const", "constval": "OffsetY"} +,{ + "constname": "k_pch_Keyboard_Smoothing","consttype": "const char *const", "constval": "Smoothing"} +,{ + "constname": "k_pch_Perf_Section","consttype": "const char *const", "constval": "perfcheck"} +,{ + "constname": "k_pch_Perf_HeuristicActive_Bool","consttype": "const char *const", "constval": "heuristicActive"} +,{ + "constname": "k_pch_Perf_NotifyInHMD_Bool","consttype": "const char *const", "constval": "warnInHMD"} +,{ + "constname": "k_pch_Perf_NotifyOnlyOnce_Bool","consttype": "const char *const", "constval": "warnOnlyOnce"} +,{ + "constname": "k_pch_Perf_AllowTimingStore_Bool","consttype": "const char *const", "constval": "allowTimingStore"} +,{ + "constname": "k_pch_Perf_SaveTimingsOnExit_Bool","consttype": "const char *const", "constval": "saveTimingsOnExit"} +,{ + "constname": "k_pch_Perf_TestData_Float","consttype": "const char *const", "constval": "perfTestData"} +,{ + "constname": "k_pch_Perf_LinuxGPUProfiling_Bool","consttype": "const char *const", "constval": "linuxGPUProfiling"} +,{ + "constname": "k_pch_CollisionBounds_Section","consttype": "const char *const", "constval": "collisionBounds"} +,{ + "constname": "k_pch_CollisionBounds_Style_Int32","consttype": "const char *const", "constval": "CollisionBoundsStyle"} +,{ + "constname": "k_pch_CollisionBounds_GroundPerimeterOn_Bool","consttype": "const char *const", "constval": "CollisionBoundsGroundPerimeterOn"} +,{ + "constname": "k_pch_CollisionBounds_CenterMarkerOn_Bool","consttype": "const char *const", "constval": "CollisionBoundsCenterMarkerOn"} +,{ + "constname": "k_pch_CollisionBounds_PlaySpaceOn_Bool","consttype": "const char *const", "constval": "CollisionBoundsPlaySpaceOn"} +,{ + "constname": "k_pch_CollisionBounds_FadeDistance_Float","consttype": "const char *const", "constval": "CollisionBoundsFadeDistance"} +,{ + "constname": "k_pch_CollisionBounds_ColorGammaR_Int32","consttype": "const char *const", "constval": "CollisionBoundsColorGammaR"} +,{ + "constname": "k_pch_CollisionBounds_ColorGammaG_Int32","consttype": "const char *const", "constval": "CollisionBoundsColorGammaG"} +,{ + "constname": "k_pch_CollisionBounds_ColorGammaB_Int32","consttype": "const char *const", "constval": "CollisionBoundsColorGammaB"} +,{ + "constname": "k_pch_CollisionBounds_ColorGammaA_Int32","consttype": "const char *const", "constval": "CollisionBoundsColorGammaA"} +,{ + "constname": "k_pch_Camera_Section","consttype": "const char *const", "constval": "camera"} +,{ + "constname": "k_pch_Camera_EnableCamera_Bool","consttype": "const char *const", "constval": "enableCamera"} +,{ + "constname": "k_pch_Camera_EnableCameraInDashboard_Bool","consttype": "const char *const", "constval": "enableCameraInDashboard"} +,{ + "constname": "k_pch_Camera_EnableCameraForCollisionBounds_Bool","consttype": "const char *const", "constval": "enableCameraForCollisionBounds"} +,{ + "constname": "k_pch_Camera_EnableCameraForRoomView_Bool","consttype": "const char *const", "constval": "enableCameraForRoomView"} +,{ + "constname": "k_pch_Camera_BoundsColorGammaR_Int32","consttype": "const char *const", "constval": "cameraBoundsColorGammaR"} +,{ + "constname": "k_pch_Camera_BoundsColorGammaG_Int32","consttype": "const char *const", "constval": "cameraBoundsColorGammaG"} +,{ + "constname": "k_pch_Camera_BoundsColorGammaB_Int32","consttype": "const char *const", "constval": "cameraBoundsColorGammaB"} +,{ + "constname": "k_pch_Camera_BoundsColorGammaA_Int32","consttype": "const char *const", "constval": "cameraBoundsColorGammaA"} +,{ + "constname": "k_pch_Camera_BoundsStrength_Int32","consttype": "const char *const", "constval": "cameraBoundsStrength"} +,{ + "constname": "k_pch_audio_Section","consttype": "const char *const", "constval": "audio"} +,{ + "constname": "k_pch_audio_OnPlaybackDevice_String","consttype": "const char *const", "constval": "onPlaybackDevice"} +,{ + "constname": "k_pch_audio_OnRecordDevice_String","consttype": "const char *const", "constval": "onRecordDevice"} +,{ + "constname": "k_pch_audio_OnPlaybackMirrorDevice_String","consttype": "const char *const", "constval": "onPlaybackMirrorDevice"} +,{ + "constname": "k_pch_audio_OffPlaybackDevice_String","consttype": "const char *const", "constval": "offPlaybackDevice"} +,{ + "constname": "k_pch_audio_OffRecordDevice_String","consttype": "const char *const", "constval": "offRecordDevice"} +,{ + "constname": "k_pch_audio_VIVEHDMIGain","consttype": "const char *const", "constval": "viveHDMIGain"} +,{ + "constname": "k_pch_Power_Section","consttype": "const char *const", "constval": "power"} +,{ + "constname": "k_pch_Power_PowerOffOnExit_Bool","consttype": "const char *const", "constval": "powerOffOnExit"} +,{ + "constname": "k_pch_Power_TurnOffScreensTimeout_Float","consttype": "const char *const", "constval": "turnOffScreensTimeout"} +,{ + "constname": "k_pch_Power_TurnOffControllersTimeout_Float","consttype": "const char *const", "constval": "turnOffControllersTimeout"} +,{ + "constname": "k_pch_Power_ReturnToWatchdogTimeout_Float","consttype": "const char *const", "constval": "returnToWatchdogTimeout"} +,{ + "constname": "k_pch_Power_AutoLaunchSteamVROnButtonPress","consttype": "const char *const", "constval": "autoLaunchSteamVROnButtonPress"} +,{ + "constname": "k_pch_Dashboard_Section","consttype": "const char *const", "constval": "dashboard"} +,{ + "constname": "k_pch_Dashboard_EnableDashboard_Bool","consttype": "const char *const", "constval": "enableDashboard"} +,{ + "constname": "k_pch_Dashboard_ArcadeMode_Bool","consttype": "const char *const", "constval": "arcadeMode"} +,{ + "constname": "k_pch_modelskin_Section","consttype": "const char *const", "constval": "modelskins"} +,{ + "constname": "k_pch_Driver_Enable_Bool","consttype": "const char *const", "constval": "enable"} +,{ + "constname": "IVRScreenshots_Version","consttype": "const char *const", "constval": "IVRScreenshots_001"} +,{ + "constname": "IVRResources_Version","consttype": "const char *const", "constval": "IVRResources_001"} +,{ + "constname": "IVRDriverManager_Version","consttype": "const char *const", "constval": "IVRDriverManager_001"} +], +"structs":[{"struct": "vr::HmdMatrix34_t","fields": [ +{ "fieldname": "m", "fieldtype": "float [3][4]"}]} +,{"struct": "vr::HmdMatrix44_t","fields": [ +{ "fieldname": "m", "fieldtype": "float [4][4]"}]} +,{"struct": "vr::HmdVector3_t","fields": [ +{ "fieldname": "v", "fieldtype": "float [3]"}]} +,{"struct": "vr::HmdVector4_t","fields": [ +{ "fieldname": "v", "fieldtype": "float [4]"}]} +,{"struct": "vr::HmdVector3d_t","fields": [ +{ "fieldname": "v", "fieldtype": "double [3]"}]} +,{"struct": "vr::HmdVector2_t","fields": [ +{ "fieldname": "v", "fieldtype": "float [2]"}]} +,{"struct": "vr::HmdQuaternion_t","fields": [ +{ "fieldname": "w", "fieldtype": "double"}, +{ "fieldname": "x", "fieldtype": "double"}, +{ "fieldname": "y", "fieldtype": "double"}, +{ "fieldname": "z", "fieldtype": "double"}]} +,{"struct": "vr::HmdColor_t","fields": [ +{ "fieldname": "r", "fieldtype": "float"}, +{ "fieldname": "g", "fieldtype": "float"}, +{ "fieldname": "b", "fieldtype": "float"}, +{ "fieldname": "a", "fieldtype": "float"}]} +,{"struct": "vr::HmdQuad_t","fields": [ +{ "fieldname": "vCorners", "fieldtype": "struct vr::HmdVector3_t [4]"}]} +,{"struct": "vr::HmdRect2_t","fields": [ +{ "fieldname": "vTopLeft", "fieldtype": "struct vr::HmdVector2_t"}, +{ "fieldname": "vBottomRight", "fieldtype": "struct vr::HmdVector2_t"}]} +,{"struct": "vr::DistortionCoordinates_t","fields": [ +{ "fieldname": "rfRed", "fieldtype": "float [2]"}, +{ "fieldname": "rfGreen", "fieldtype": "float [2]"}, +{ "fieldname": "rfBlue", "fieldtype": "float [2]"}]} +,{"struct": "vr::Texture_t","fields": [ +{ "fieldname": "handle", "fieldtype": "void *"}, +{ "fieldname": "eType", "fieldtype": "enum vr::ETextureType"}, +{ "fieldname": "eColorSpace", "fieldtype": "enum vr::EColorSpace"}]} +,{"struct": "vr::TrackedDevicePose_t","fields": [ +{ "fieldname": "mDeviceToAbsoluteTracking", "fieldtype": "struct vr::HmdMatrix34_t"}, +{ "fieldname": "vVelocity", "fieldtype": "struct vr::HmdVector3_t"}, +{ "fieldname": "vAngularVelocity", "fieldtype": "struct vr::HmdVector3_t"}, +{ "fieldname": "eTrackingResult", "fieldtype": "enum vr::ETrackingResult"}, +{ "fieldname": "bPoseIsValid", "fieldtype": "_Bool"}, +{ "fieldname": "bDeviceIsConnected", "fieldtype": "_Bool"}]} +,{"struct": "vr::VRTextureBounds_t","fields": [ +{ "fieldname": "uMin", "fieldtype": "float"}, +{ "fieldname": "vMin", "fieldtype": "float"}, +{ "fieldname": "uMax", "fieldtype": "float"}, +{ "fieldname": "vMax", "fieldtype": "float"}]} +,{"struct": "vr::VRVulkanTextureData_t","fields": [ +{ "fieldname": "m_nImage", "fieldtype": "uint64_t"}, +{ "fieldname": "m_pDevice", "fieldtype": "struct VkDevice_T *"}, +{ "fieldname": "m_pPhysicalDevice", "fieldtype": "struct VkPhysicalDevice_T *"}, +{ "fieldname": "m_pInstance", "fieldtype": "struct VkInstance_T *"}, +{ "fieldname": "m_pQueue", "fieldtype": "struct VkQueue_T *"}, +{ "fieldname": "m_nQueueFamilyIndex", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nWidth", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nHeight", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nFormat", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nSampleCount", "fieldtype": "uint32_t"}]} +,{"struct": "vr::D3D12TextureData_t","fields": [ +{ "fieldname": "m_pResource", "fieldtype": "struct ID3D12Resource *"}, +{ "fieldname": "m_pCommandQueue", "fieldtype": "struct ID3D12CommandQueue *"}, +{ "fieldname": "m_nNodeMask", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_Controller_t","fields": [ +{ "fieldname": "button", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_Mouse_t","fields": [ +{ "fieldname": "x", "fieldtype": "float"}, +{ "fieldname": "y", "fieldtype": "float"}, +{ "fieldname": "button", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_Scroll_t","fields": [ +{ "fieldname": "xdelta", "fieldtype": "float"}, +{ "fieldname": "ydelta", "fieldtype": "float"}, +{ "fieldname": "repeatCount", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_TouchPadMove_t","fields": [ +{ "fieldname": "bFingerDown", "fieldtype": "_Bool"}, +{ "fieldname": "flSecondsFingerDown", "fieldtype": "float"}, +{ "fieldname": "fValueXFirst", "fieldtype": "float"}, +{ "fieldname": "fValueYFirst", "fieldtype": "float"}, +{ "fieldname": "fValueXRaw", "fieldtype": "float"}, +{ "fieldname": "fValueYRaw", "fieldtype": "float"}]} +,{"struct": "vr::VREvent_Notification_t","fields": [ +{ "fieldname": "ulUserValue", "fieldtype": "uint64_t"}, +{ "fieldname": "notificationId", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_Process_t","fields": [ +{ "fieldname": "pid", "fieldtype": "uint32_t"}, +{ "fieldname": "oldPid", "fieldtype": "uint32_t"}, +{ "fieldname": "bForced", "fieldtype": "_Bool"}]} +,{"struct": "vr::VREvent_Overlay_t","fields": [ +{ "fieldname": "overlayHandle", "fieldtype": "uint64_t"}]} +,{"struct": "vr::VREvent_Status_t","fields": [ +{ "fieldname": "statusState", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_Keyboard_t","fields": [ +{ "fieldname": "cNewInput", "fieldtype": "char [8]"}, +{ "fieldname": "uUserValue", "fieldtype": "uint64_t"}]} +,{"struct": "vr::VREvent_Ipd_t","fields": [ +{ "fieldname": "ipdMeters", "fieldtype": "float"}]} +,{"struct": "vr::VREvent_Chaperone_t","fields": [ +{ "fieldname": "m_nPreviousUniverse", "fieldtype": "uint64_t"}, +{ "fieldname": "m_nCurrentUniverse", "fieldtype": "uint64_t"}]} +,{"struct": "vr::VREvent_Reserved_t","fields": [ +{ "fieldname": "reserved0", "fieldtype": "uint64_t"}, +{ "fieldname": "reserved1", "fieldtype": "uint64_t"}]} +,{"struct": "vr::VREvent_PerformanceTest_t","fields": [ +{ "fieldname": "m_nFidelityLevel", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_SeatedZeroPoseReset_t","fields": [ +{ "fieldname": "bResetBySystemMenu", "fieldtype": "_Bool"}]} +,{"struct": "vr::VREvent_Screenshot_t","fields": [ +{ "fieldname": "handle", "fieldtype": "uint32_t"}, +{ "fieldname": "type", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_ScreenshotProgress_t","fields": [ +{ "fieldname": "progress", "fieldtype": "float"}]} +,{"struct": "vr::VREvent_ApplicationLaunch_t","fields": [ +{ "fieldname": "pid", "fieldtype": "uint32_t"}, +{ "fieldname": "unArgsHandle", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_EditingCameraSurface_t","fields": [ +{ "fieldname": "overlayHandle", "fieldtype": "uint64_t"}, +{ "fieldname": "nVisualMode", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_MessageOverlay_t","fields": [ +{ "fieldname": "unVRMessageOverlayResponse", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_Property_t","fields": [ +{ "fieldname": "container", "fieldtype": "PropertyContainerHandle_t"}, +{ "fieldname": "prop", "fieldtype": "enum vr::ETrackedDeviceProperty"}]} +,{"struct": "vr::(anonymous)","fields": [ +{ "fieldname": "reserved", "fieldtype": "struct vr::VREvent_Reserved_t"}, +{ "fieldname": "controller", "fieldtype": "struct vr::VREvent_Controller_t"}, +{ "fieldname": "mouse", "fieldtype": "struct vr::VREvent_Mouse_t"}, +{ "fieldname": "scroll", "fieldtype": "struct vr::VREvent_Scroll_t"}, +{ "fieldname": "process", "fieldtype": "struct vr::VREvent_Process_t"}, +{ "fieldname": "notification", "fieldtype": "struct vr::VREvent_Notification_t"}, +{ "fieldname": "overlay", "fieldtype": "struct vr::VREvent_Overlay_t"}, +{ "fieldname": "status", "fieldtype": "struct vr::VREvent_Status_t"}, +{ "fieldname": "keyboard", "fieldtype": "struct vr::VREvent_Keyboard_t"}, +{ "fieldname": "ipd", "fieldtype": "struct vr::VREvent_Ipd_t"}, +{ "fieldname": "chaperone", "fieldtype": "struct vr::VREvent_Chaperone_t"}, +{ "fieldname": "performanceTest", "fieldtype": "struct vr::VREvent_PerformanceTest_t"}, +{ "fieldname": "touchPadMove", "fieldtype": "struct vr::VREvent_TouchPadMove_t"}, +{ "fieldname": "seatedZeroPoseReset", "fieldtype": "struct vr::VREvent_SeatedZeroPoseReset_t"}, +{ "fieldname": "screenshot", "fieldtype": "struct vr::VREvent_Screenshot_t"}, +{ "fieldname": "screenshotProgress", "fieldtype": "struct vr::VREvent_ScreenshotProgress_t"}, +{ "fieldname": "applicationLaunch", "fieldtype": "struct vr::VREvent_ApplicationLaunch_t"}, +{ "fieldname": "cameraSurface", "fieldtype": "struct vr::VREvent_EditingCameraSurface_t"}, +{ "fieldname": "messageOverlay", "fieldtype": "struct vr::VREvent_MessageOverlay_t"}, +{ "fieldname": "property", "fieldtype": "struct vr::VREvent_Property_t"}]} +,{"struct": "vr::VREvent_t","fields": [ +{ "fieldname": "eventType", "fieldtype": "uint32_t"}, +{ "fieldname": "trackedDeviceIndex", "fieldtype": "TrackedDeviceIndex_t"}, +{ "fieldname": "eventAgeSeconds", "fieldtype": "float"}, +{ "fieldname": "data", "fieldtype": "VREvent_Data_t"}]} +,{"struct": "vr::HiddenAreaMesh_t","fields": [ +{ "fieldname": "pVertexData", "fieldtype": "const struct vr::HmdVector2_t *"}, +{ "fieldname": "unTriangleCount", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VRControllerAxis_t","fields": [ +{ "fieldname": "x", "fieldtype": "float"}, +{ "fieldname": "y", "fieldtype": "float"}]} +,{"struct": "vr::VRControllerState001_t","fields": [ +{ "fieldname": "unPacketNum", "fieldtype": "uint32_t"}, +{ "fieldname": "ulButtonPressed", "fieldtype": "uint64_t"}, +{ "fieldname": "ulButtonTouched", "fieldtype": "uint64_t"}, +{ "fieldname": "rAxis", "fieldtype": "struct vr::VRControllerAxis_t [5]"}]} +,{"struct": "vr::Compositor_OverlaySettings","fields": [ +{ "fieldname": "size", "fieldtype": "uint32_t"}, +{ "fieldname": "curved", "fieldtype": "_Bool"}, +{ "fieldname": "antialias", "fieldtype": "_Bool"}, +{ "fieldname": "scale", "fieldtype": "float"}, +{ "fieldname": "distance", "fieldtype": "float"}, +{ "fieldname": "alpha", "fieldtype": "float"}, +{ "fieldname": "uOffset", "fieldtype": "float"}, +{ "fieldname": "vOffset", "fieldtype": "float"}, +{ "fieldname": "uScale", "fieldtype": "float"}, +{ "fieldname": "vScale", "fieldtype": "float"}, +{ "fieldname": "gridDivs", "fieldtype": "float"}, +{ "fieldname": "gridWidth", "fieldtype": "float"}, +{ "fieldname": "gridScale", "fieldtype": "float"}, +{ "fieldname": "transform", "fieldtype": "struct vr::HmdMatrix44_t"}]} +,{"struct": "vr::CameraVideoStreamFrameHeader_t","fields": [ +{ "fieldname": "eFrameType", "fieldtype": "enum vr::EVRTrackedCameraFrameType"}, +{ "fieldname": "nWidth", "fieldtype": "uint32_t"}, +{ "fieldname": "nHeight", "fieldtype": "uint32_t"}, +{ "fieldname": "nBytesPerPixel", "fieldtype": "uint32_t"}, +{ "fieldname": "nFrameSequence", "fieldtype": "uint32_t"}, +{ "fieldname": "standingTrackedDevicePose", "fieldtype": "struct vr::TrackedDevicePose_t"}]} +,{"struct": "vr::AppOverrideKeys_t","fields": [ +{ "fieldname": "pchKey", "fieldtype": "const char *"}, +{ "fieldname": "pchValue", "fieldtype": "const char *"}]} +,{"struct": "vr::Compositor_FrameTiming","fields": [ +{ "fieldname": "m_nSize", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nFrameIndex", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumFramePresents", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumMisPresented", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumDroppedFrames", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nReprojectionFlags", "fieldtype": "uint32_t"}, +{ "fieldname": "m_flSystemTimeInSeconds", "fieldtype": "double"}, +{ "fieldname": "m_flPreSubmitGpuMs", "fieldtype": "float"}, +{ "fieldname": "m_flPostSubmitGpuMs", "fieldtype": "float"}, +{ "fieldname": "m_flTotalRenderGpuMs", "fieldtype": "float"}, +{ "fieldname": "m_flCompositorRenderGpuMs", "fieldtype": "float"}, +{ "fieldname": "m_flCompositorRenderCpuMs", "fieldtype": "float"}, +{ "fieldname": "m_flCompositorIdleCpuMs", "fieldtype": "float"}, +{ "fieldname": "m_flClientFrameIntervalMs", "fieldtype": "float"}, +{ "fieldname": "m_flPresentCallCpuMs", "fieldtype": "float"}, +{ "fieldname": "m_flWaitForPresentCpuMs", "fieldtype": "float"}, +{ "fieldname": "m_flSubmitFrameMs", "fieldtype": "float"}, +{ "fieldname": "m_flWaitGetPosesCalledMs", "fieldtype": "float"}, +{ "fieldname": "m_flNewPosesReadyMs", "fieldtype": "float"}, +{ "fieldname": "m_flNewFrameReadyMs", "fieldtype": "float"}, +{ "fieldname": "m_flCompositorUpdateStartMs", "fieldtype": "float"}, +{ "fieldname": "m_flCompositorUpdateEndMs", "fieldtype": "float"}, +{ "fieldname": "m_flCompositorRenderStartMs", "fieldtype": "float"}, +{ "fieldname": "m_HmdPose", "fieldtype": "vr::TrackedDevicePose_t"}]} +,{"struct": "vr::Compositor_CumulativeStats","fields": [ +{ "fieldname": "m_nPid", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumFramePresents", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumDroppedFrames", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumReprojectedFrames", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumFramePresentsOnStartup", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumDroppedFramesOnStartup", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumReprojectedFramesOnStartup", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumLoading", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumFramePresentsLoading", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumDroppedFramesLoading", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumReprojectedFramesLoading", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumTimedOut", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumFramePresentsTimedOut", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumDroppedFramesTimedOut", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumReprojectedFramesTimedOut", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VROverlayIntersectionParams_t","fields": [ +{ "fieldname": "vSource", "fieldtype": "struct vr::HmdVector3_t"}, +{ "fieldname": "vDirection", "fieldtype": "struct vr::HmdVector3_t"}, +{ "fieldname": "eOrigin", "fieldtype": "enum vr::ETrackingUniverseOrigin"}]} +,{"struct": "vr::VROverlayIntersectionResults_t","fields": [ +{ "fieldname": "vPoint", "fieldtype": "struct vr::HmdVector3_t"}, +{ "fieldname": "vNormal", "fieldtype": "struct vr::HmdVector3_t"}, +{ "fieldname": "vUVs", "fieldtype": "struct vr::HmdVector2_t"}, +{ "fieldname": "fDistance", "fieldtype": "float"}]} +,{"struct": "vr::IntersectionMaskRectangle_t","fields": [ +{ "fieldname": "m_flTopLeftX", "fieldtype": "float"}, +{ "fieldname": "m_flTopLeftY", "fieldtype": "float"}, +{ "fieldname": "m_flWidth", "fieldtype": "float"}, +{ "fieldname": "m_flHeight", "fieldtype": "float"}]} +,{"struct": "vr::IntersectionMaskCircle_t","fields": [ +{ "fieldname": "m_flCenterX", "fieldtype": "float"}, +{ "fieldname": "m_flCenterY", "fieldtype": "float"}, +{ "fieldname": "m_flRadius", "fieldtype": "float"}]} +,{"struct": "vr::(anonymous)","fields": [ +{ "fieldname": "m_Rectangle", "fieldtype": "struct vr::IntersectionMaskRectangle_t"}, +{ "fieldname": "m_Circle", "fieldtype": "struct vr::IntersectionMaskCircle_t"}]} +,{"struct": "vr::VROverlayIntersectionMaskPrimitive_t","fields": [ +{ "fieldname": "m_nPrimitiveType", "fieldtype": "enum vr::EVROverlayIntersectionMaskPrimitiveType"}, +{ "fieldname": "m_Primitive", "fieldtype": "VROverlayIntersectionMaskPrimitive_Data_t"}]} +,{"struct": "vr::RenderModel_ComponentState_t","fields": [ +{ "fieldname": "mTrackingToComponentRenderModel", "fieldtype": "struct vr::HmdMatrix34_t"}, +{ "fieldname": "mTrackingToComponentLocal", "fieldtype": "struct vr::HmdMatrix34_t"}, +{ "fieldname": "uProperties", "fieldtype": "VRComponentProperties"}]} +,{"struct": "vr::RenderModel_Vertex_t","fields": [ +{ "fieldname": "vPosition", "fieldtype": "struct vr::HmdVector3_t"}, +{ "fieldname": "vNormal", "fieldtype": "struct vr::HmdVector3_t"}, +{ "fieldname": "rfTextureCoord", "fieldtype": "float [2]"}]} +,{"struct": "vr::RenderModel_TextureMap_t","fields": [ +{ "fieldname": "unWidth", "fieldtype": "uint16_t"}, +{ "fieldname": "unHeight", "fieldtype": "uint16_t"}, +{ "fieldname": "rubTextureMapData", "fieldtype": "const uint8_t *"}]} +,{"struct": "vr::RenderModel_t","fields": [ +{ "fieldname": "rVertexData", "fieldtype": "const struct vr::RenderModel_Vertex_t *"}, +{ "fieldname": "unVertexCount", "fieldtype": "uint32_t"}, +{ "fieldname": "rIndexData", "fieldtype": "const uint16_t *"}, +{ "fieldname": "unTriangleCount", "fieldtype": "uint32_t"}, +{ "fieldname": "diffuseTextureId", "fieldtype": "TextureID_t"}]} +,{"struct": "vr::RenderModel_ControllerMode_State_t","fields": [ +{ "fieldname": "bScrollWheelVisible", "fieldtype": "_Bool"}]} +,{"struct": "vr::NotificationBitmap_t","fields": [ +{ "fieldname": "m_pImageData", "fieldtype": "void *"}, +{ "fieldname": "m_nWidth", "fieldtype": "int32_t"}, +{ "fieldname": "m_nHeight", "fieldtype": "int32_t"}, +{ "fieldname": "m_nBytesPerPixel", "fieldtype": "int32_t"}]} +,{"struct": "vr::COpenVRContext","fields": [ +{ "fieldname": "m_pVRSystem", "fieldtype": "class vr::IVRSystem *"}, +{ "fieldname": "m_pVRChaperone", "fieldtype": "class vr::IVRChaperone *"}, +{ "fieldname": "m_pVRChaperoneSetup", "fieldtype": "class vr::IVRChaperoneSetup *"}, +{ "fieldname": "m_pVRCompositor", "fieldtype": "class vr::IVRCompositor *"}, +{ "fieldname": "m_pVROverlay", "fieldtype": "class vr::IVROverlay *"}, +{ "fieldname": "m_pVRResources", "fieldtype": "class vr::IVRResources *"}, +{ "fieldname": "m_pVRRenderModels", "fieldtype": "class vr::IVRRenderModels *"}, +{ "fieldname": "m_pVRExtendedDisplay", "fieldtype": "class vr::IVRExtendedDisplay *"}, +{ "fieldname": "m_pVRSettings", "fieldtype": "class vr::IVRSettings *"}, +{ "fieldname": "m_pVRApplications", "fieldtype": "class vr::IVRApplications *"}, +{ "fieldname": "m_pVRTrackedCamera", "fieldtype": "class vr::IVRTrackedCamera *"}, +{ "fieldname": "m_pVRScreenshots", "fieldtype": "class vr::IVRScreenshots *"}, +{ "fieldname": "m_pVRDriverManager", "fieldtype": "class vr::IVRDriverManager *"}]} +], +"methods":[{ + "classname": "vr::IVRSystem", + "methodname": "GetRecommendedRenderTargetSize", + "returntype": "void", + "params": [ +{ "paramname": "pnWidth" ,"paramtype": "uint32_t *"}, +{ "paramname": "pnHeight" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetProjectionMatrix", + "returntype": "struct vr::HmdMatrix44_t", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"}, +{ "paramname": "fNearZ" ,"paramtype": "float"}, +{ "paramname": "fFarZ" ,"paramtype": "float"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetProjectionRaw", + "returntype": "void", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"}, +{ "paramname": "pfLeft" ,"paramtype": "float *"}, +{ "paramname": "pfRight" ,"paramtype": "float *"}, +{ "paramname": "pfTop" ,"paramtype": "float *"}, +{ "paramname": "pfBottom" ,"paramtype": "float *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "ComputeDistortion", + "returntype": "bool", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"}, +{ "paramname": "fU" ,"paramtype": "float"}, +{ "paramname": "fV" ,"paramtype": "float"}, +{ "paramname": "pDistortionCoordinates" ,"paramtype": "struct vr::DistortionCoordinates_t *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetEyeToHeadTransform", + "returntype": "struct vr::HmdMatrix34_t", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetTimeSinceLastVsync", + "returntype": "bool", + "params": [ +{ "paramname": "pfSecondsSinceLastVsync" ,"paramtype": "float *"}, +{ "paramname": "pulFrameCounter" ,"paramtype": "uint64_t *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetD3D9AdapterIndex", + "returntype": "int32_t" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetDXGIOutputInfo", + "returntype": "void", + "params": [ +{ "paramname": "pnAdapterIndex" ,"paramtype": "int32_t *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetOutputDevice", + "returntype": "void", + "params": [ +{ "paramname": "pnDevice" ,"paramtype": "uint64_t *"}, +{ "paramname": "textureType" ,"paramtype": "vr::ETextureType"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "IsDisplayOnDesktop", + "returntype": "bool" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "SetDisplayVisibility", + "returntype": "bool", + "params": [ +{ "paramname": "bIsVisibleOnDesktop" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetDeviceToAbsoluteTrackingPose", + "returntype": "void", + "params": [ +{ "paramname": "eOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin"}, +{ "paramname": "fPredictedSecondsToPhotonsFromNow" ,"paramtype": "float"}, +{ "paramname": "pTrackedDevicePoseArray" ,"array_count": "unTrackedDevicePoseArrayCount" ,"paramtype": "struct vr::TrackedDevicePose_t *"}, +{ "paramname": "unTrackedDevicePoseArrayCount" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "ResetSeatedZeroPose", + "returntype": "void" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetSeatedZeroPoseToStandingAbsoluteTrackingPose", + "returntype": "struct vr::HmdMatrix34_t" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetRawZeroPoseToStandingAbsoluteTrackingPose", + "returntype": "struct vr::HmdMatrix34_t" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetSortedTrackedDeviceIndicesOfClass", + "returntype": "uint32_t", + "params": [ +{ "paramname": "eTrackedDeviceClass" ,"paramtype": "vr::ETrackedDeviceClass"}, +{ "paramname": "punTrackedDeviceIndexArray" ,"array_count": "unTrackedDeviceIndexArrayCount" ,"paramtype": "vr::TrackedDeviceIndex_t *"}, +{ "paramname": "unTrackedDeviceIndexArrayCount" ,"paramtype": "uint32_t"}, +{ "paramname": "unRelativeToTrackedDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetTrackedDeviceActivityLevel", + "returntype": "vr::EDeviceActivityLevel", + "params": [ +{ "paramname": "unDeviceId" ,"paramtype": "vr::TrackedDeviceIndex_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "ApplyTransform", + "returntype": "void", + "params": [ +{ "paramname": "pOutputPose" ,"paramtype": "struct vr::TrackedDevicePose_t *"}, +{ "paramname": "pTrackedDevicePose" ,"paramtype": "const struct vr::TrackedDevicePose_t *"}, +{ "paramname": "pTransform" ,"paramtype": "const struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetTrackedDeviceIndexForControllerRole", + "returntype": "vr::TrackedDeviceIndex_t", + "params": [ +{ "paramname": "unDeviceType" ,"paramtype": "vr::ETrackedControllerRole"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetControllerRoleForTrackedDeviceIndex", + "returntype": "vr::ETrackedControllerRole", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetTrackedDeviceClass", + "returntype": "vr::ETrackedDeviceClass", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "IsTrackedDeviceConnected", + "returntype": "bool", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetBoolTrackedDeviceProperty", + "returntype": "bool", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "prop" ,"paramtype": "vr::ETrackedDeviceProperty"}, +{ "paramname": "pError" ,"paramtype": "vr::ETrackedPropertyError *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetFloatTrackedDeviceProperty", + "returntype": "float", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "prop" ,"paramtype": "vr::ETrackedDeviceProperty"}, +{ "paramname": "pError" ,"paramtype": "vr::ETrackedPropertyError *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetInt32TrackedDeviceProperty", + "returntype": "int32_t", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "prop" ,"paramtype": "vr::ETrackedDeviceProperty"}, +{ "paramname": "pError" ,"paramtype": "vr::ETrackedPropertyError *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetUint64TrackedDeviceProperty", + "returntype": "uint64_t", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "prop" ,"paramtype": "vr::ETrackedDeviceProperty"}, +{ "paramname": "pError" ,"paramtype": "vr::ETrackedPropertyError *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetMatrix34TrackedDeviceProperty", + "returntype": "struct vr::HmdMatrix34_t", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "prop" ,"paramtype": "vr::ETrackedDeviceProperty"}, +{ "paramname": "pError" ,"paramtype": "vr::ETrackedPropertyError *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetStringTrackedDeviceProperty", + "returntype": "uint32_t", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "prop" ,"paramtype": "vr::ETrackedDeviceProperty"}, +{ "paramname": "pchValue" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"}, +{ "paramname": "pError" ,"paramtype": "vr::ETrackedPropertyError *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetPropErrorNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "error" ,"paramtype": "vr::ETrackedPropertyError"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "PollNextEvent", + "returntype": "bool", + "params": [ +{ "paramname": "pEvent" ,"paramtype": "struct vr::VREvent_t *"}, +{ "paramname": "uncbVREvent" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "PollNextEventWithPose", + "returntype": "bool", + "params": [ +{ "paramname": "eOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin"}, +{ "paramname": "pEvent" ,"paramtype": "struct vr::VREvent_t *"}, +{ "paramname": "uncbVREvent" ,"paramtype": "uint32_t"}, +{ "paramname": "pTrackedDevicePose" ,"paramtype": "vr::TrackedDevicePose_t *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetEventTypeNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "eType" ,"paramtype": "vr::EVREventType"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetHiddenAreaMesh", + "returntype": "struct vr::HiddenAreaMesh_t", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"}, +{ "paramname": "type" ,"paramtype": "vr::EHiddenAreaMeshType"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetControllerState", + "returntype": "bool", + "params": [ +{ "paramname": "unControllerDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "pControllerState" ,"paramtype": "vr::VRControllerState_t *"}, +{ "paramname": "unControllerStateSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetControllerStateWithPose", + "returntype": "bool", + "params": [ +{ "paramname": "eOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin"}, +{ "paramname": "unControllerDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "pControllerState" ,"paramtype": "vr::VRControllerState_t *"}, +{ "paramname": "unControllerStateSize" ,"paramtype": "uint32_t"}, +{ "paramname": "pTrackedDevicePose" ,"paramtype": "struct vr::TrackedDevicePose_t *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "TriggerHapticPulse", + "returntype": "void", + "params": [ +{ "paramname": "unControllerDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "unAxisId" ,"paramtype": "uint32_t"}, +{ "paramname": "usDurationMicroSec" ,"paramtype": "unsigned short"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetButtonIdNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "eButtonId" ,"paramtype": "vr::EVRButtonId"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetControllerAxisTypeNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "eAxisType" ,"paramtype": "vr::EVRControllerAxisType"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "CaptureInputFocus", + "returntype": "bool" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "ReleaseInputFocus", + "returntype": "void" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "IsInputFocusCapturedByAnotherProcess", + "returntype": "bool" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "DriverDebugRequest", + "returntype": "uint32_t", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "pchRequest" ,"paramtype": "const char *"}, +{ "paramname": "pchResponseBuffer" ,"paramtype": "char *"}, +{ "paramname": "unResponseBufferSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "PerformFirmwareUpdate", + "returntype": "vr::EVRFirmwareError", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "AcknowledgeQuit_Exiting", + "returntype": "void" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "AcknowledgeQuit_UserPrompt", + "returntype": "void" +} +,{ + "classname": "vr::IVRExtendedDisplay", + "methodname": "GetWindowBounds", + "returntype": "void", + "params": [ +{ "paramname": "pnX" ,"paramtype": "int32_t *"}, +{ "paramname": "pnY" ,"paramtype": "int32_t *"}, +{ "paramname": "pnWidth" ,"paramtype": "uint32_t *"}, +{ "paramname": "pnHeight" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRExtendedDisplay", + "methodname": "GetEyeOutputViewport", + "returntype": "void", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"}, +{ "paramname": "pnX" ,"paramtype": "uint32_t *"}, +{ "paramname": "pnY" ,"paramtype": "uint32_t *"}, +{ "paramname": "pnWidth" ,"paramtype": "uint32_t *"}, +{ "paramname": "pnHeight" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRExtendedDisplay", + "methodname": "GetDXGIOutputInfo", + "returntype": "void", + "params": [ +{ "paramname": "pnAdapterIndex" ,"paramtype": "int32_t *"}, +{ "paramname": "pnAdapterOutputIndex" ,"paramtype": "int32_t *"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "GetCameraErrorNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "eCameraError" ,"paramtype": "vr::EVRTrackedCameraError"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "HasCamera", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "nDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "pHasCamera" ,"paramtype": "bool *"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "GetCameraFrameSize", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "nDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "eFrameType" ,"paramtype": "vr::EVRTrackedCameraFrameType"}, +{ "paramname": "pnWidth" ,"paramtype": "uint32_t *"}, +{ "paramname": "pnHeight" ,"paramtype": "uint32_t *"}, +{ "paramname": "pnFrameBufferSize" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "GetCameraIntrinsics", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "nDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "eFrameType" ,"paramtype": "vr::EVRTrackedCameraFrameType"}, +{ "paramname": "pFocalLength" ,"paramtype": "vr::HmdVector2_t *"}, +{ "paramname": "pCenter" ,"paramtype": "vr::HmdVector2_t *"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "GetCameraProjection", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "nDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "eFrameType" ,"paramtype": "vr::EVRTrackedCameraFrameType"}, +{ "paramname": "flZNear" ,"paramtype": "float"}, +{ "paramname": "flZFar" ,"paramtype": "float"}, +{ "paramname": "pProjection" ,"paramtype": "vr::HmdMatrix44_t *"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "AcquireVideoStreamingService", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "nDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "pHandle" ,"paramtype": "vr::TrackedCameraHandle_t *"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "ReleaseVideoStreamingService", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "hTrackedCamera" ,"paramtype": "vr::TrackedCameraHandle_t"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "GetVideoStreamFrameBuffer", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "hTrackedCamera" ,"paramtype": "vr::TrackedCameraHandle_t"}, +{ "paramname": "eFrameType" ,"paramtype": "vr::EVRTrackedCameraFrameType"}, +{ "paramname": "pFrameBuffer" ,"paramtype": "void *"}, +{ "paramname": "nFrameBufferSize" ,"paramtype": "uint32_t"}, +{ "paramname": "pFrameHeader" ,"paramtype": "vr::CameraVideoStreamFrameHeader_t *"}, +{ "paramname": "nFrameHeaderSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "GetVideoStreamTextureSize", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "nDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "eFrameType" ,"paramtype": "vr::EVRTrackedCameraFrameType"}, +{ "paramname": "pTextureBounds" ,"paramtype": "vr::VRTextureBounds_t *"}, +{ "paramname": "pnWidth" ,"paramtype": "uint32_t *"}, +{ "paramname": "pnHeight" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "GetVideoStreamTextureD3D11", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "hTrackedCamera" ,"paramtype": "vr::TrackedCameraHandle_t"}, +{ "paramname": "eFrameType" ,"paramtype": "vr::EVRTrackedCameraFrameType"}, +{ "paramname": "pD3D11DeviceOrResource" ,"paramtype": "void *"}, +{ "paramname": "ppD3D11ShaderResourceView" ,"paramtype": "void **"}, +{ "paramname": "pFrameHeader" ,"paramtype": "vr::CameraVideoStreamFrameHeader_t *"}, +{ "paramname": "nFrameHeaderSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "GetVideoStreamTextureGL", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "hTrackedCamera" ,"paramtype": "vr::TrackedCameraHandle_t"}, +{ "paramname": "eFrameType" ,"paramtype": "vr::EVRTrackedCameraFrameType"}, +{ "paramname": "pglTextureId" ,"paramtype": "vr::glUInt_t *"}, +{ "paramname": "pFrameHeader" ,"paramtype": "vr::CameraVideoStreamFrameHeader_t *"}, +{ "paramname": "nFrameHeaderSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "ReleaseVideoStreamTextureGL", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "hTrackedCamera" ,"paramtype": "vr::TrackedCameraHandle_t"}, +{ "paramname": "glTextureId" ,"paramtype": "vr::glUInt_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "AddApplicationManifest", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchApplicationManifestFullPath" ,"paramtype": "const char *"}, +{ "paramname": "bTemporary" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "RemoveApplicationManifest", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchApplicationManifestFullPath" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "IsApplicationInstalled", + "returntype": "bool", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationCount", + "returntype": "uint32_t" +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationKeyByIndex", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "unApplicationIndex" ,"paramtype": "uint32_t"}, +{ "paramname": "pchAppKeyBuffer" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unAppKeyBufferLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationKeyByProcessId", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "unProcessId" ,"paramtype": "uint32_t"}, +{ "paramname": "pchAppKeyBuffer" ,"paramtype": "char *"}, +{ "paramname": "unAppKeyBufferLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "LaunchApplication", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "LaunchTemplateApplication", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchTemplateAppKey" ,"paramtype": "const char *"}, +{ "paramname": "pchNewAppKey" ,"paramtype": "const char *"}, +{ "paramname": "pKeys" ,"array_count": "unKeys" ,"paramtype": "const struct vr::AppOverrideKeys_t *"}, +{ "paramname": "unKeys" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "LaunchApplicationFromMimeType", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchMimeType" ,"paramtype": "const char *"}, +{ "paramname": "pchArgs" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "LaunchDashboardOverlay", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "CancelApplicationLaunch", + "returntype": "bool", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "IdentifyApplication", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "unProcessId" ,"paramtype": "uint32_t"}, +{ "paramname": "pchAppKey" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationProcessId", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationsErrorNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "error" ,"paramtype": "vr::EVRApplicationError"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationPropertyString", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"}, +{ "paramname": "eProperty" ,"paramtype": "vr::EVRApplicationProperty"}, +{ "paramname": "pchPropertyValueBuffer" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unPropertyValueBufferLen" ,"paramtype": "uint32_t"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRApplicationError *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationPropertyBool", + "returntype": "bool", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"}, +{ "paramname": "eProperty" ,"paramtype": "vr::EVRApplicationProperty"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRApplicationError *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationPropertyUint64", + "returntype": "uint64_t", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"}, +{ "paramname": "eProperty" ,"paramtype": "vr::EVRApplicationProperty"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRApplicationError *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "SetApplicationAutoLaunch", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"}, +{ "paramname": "bAutoLaunch" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationAutoLaunch", + "returntype": "bool", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "SetDefaultApplicationForMimeType", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"}, +{ "paramname": "pchMimeType" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetDefaultApplicationForMimeType", + "returntype": "bool", + "params": [ +{ "paramname": "pchMimeType" ,"paramtype": "const char *"}, +{ "paramname": "pchAppKeyBuffer" ,"paramtype": "char *"}, +{ "paramname": "unAppKeyBufferLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationSupportedMimeTypes", + "returntype": "bool", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"}, +{ "paramname": "pchMimeTypesBuffer" ,"paramtype": "char *"}, +{ "paramname": "unMimeTypesBuffer" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationsThatSupportMimeType", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchMimeType" ,"paramtype": "const char *"}, +{ "paramname": "pchAppKeysThatSupportBuffer" ,"paramtype": "char *"}, +{ "paramname": "unAppKeysThatSupportBuffer" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationLaunchArguments", + "returntype": "uint32_t", + "params": [ +{ "paramname": "unHandle" ,"paramtype": "uint32_t"}, +{ "paramname": "pchArgs" ,"paramtype": "char *"}, +{ "paramname": "unArgs" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetStartingApplication", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchAppKeyBuffer" ,"paramtype": "char *"}, +{ "paramname": "unAppKeyBufferLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetTransitionState", + "returntype": "vr::EVRApplicationTransitionState" +} +,{ + "classname": "vr::IVRApplications", + "methodname": "PerformApplicationPrelaunchCheck", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationsTransitionStateNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "state" ,"paramtype": "vr::EVRApplicationTransitionState"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "IsQuitUserPromptRequested", + "returntype": "bool" +} +,{ + "classname": "vr::IVRApplications", + "methodname": "LaunchInternalProcess", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchBinaryPath" ,"paramtype": "const char *"}, +{ "paramname": "pchArguments" ,"paramtype": "const char *"}, +{ "paramname": "pchWorkingDirectory" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetCurrentSceneProcessId", + "returntype": "uint32_t" +} +,{ + "classname": "vr::IVRChaperone", + "methodname": "GetCalibrationState", + "returntype": "vr::ChaperoneCalibrationState" +} +,{ + "classname": "vr::IVRChaperone", + "methodname": "GetPlayAreaSize", + "returntype": "bool", + "params": [ +{ "paramname": "pSizeX" ,"paramtype": "float *"}, +{ "paramname": "pSizeZ" ,"paramtype": "float *"} + ] +} +,{ + "classname": "vr::IVRChaperone", + "methodname": "GetPlayAreaRect", + "returntype": "bool", + "params": [ +{ "paramname": "rect" ,"paramtype": "struct vr::HmdQuad_t *"} + ] +} +,{ + "classname": "vr::IVRChaperone", + "methodname": "ReloadInfo", + "returntype": "void" +} +,{ + "classname": "vr::IVRChaperone", + "methodname": "SetSceneColor", + "returntype": "void", + "params": [ +{ "paramname": "color" ,"paramtype": "struct vr::HmdColor_t"} + ] +} +,{ + "classname": "vr::IVRChaperone", + "methodname": "GetBoundsColor", + "returntype": "void", + "params": [ +{ "paramname": "pOutputColorArray" ,"paramtype": "struct vr::HmdColor_t *"}, +{ "paramname": "nNumOutputColors" ,"paramtype": "int"}, +{ "paramname": "flCollisionBoundsFadeDistance" ,"paramtype": "float"}, +{ "paramname": "pOutputCameraColor" ,"paramtype": "struct vr::HmdColor_t *"} + ] +} +,{ + "classname": "vr::IVRChaperone", + "methodname": "AreBoundsVisible", + "returntype": "bool" +} +,{ + "classname": "vr::IVRChaperone", + "methodname": "ForceBoundsVisible", + "returntype": "void", + "params": [ +{ "paramname": "bForce" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "CommitWorkingCopy", + "returntype": "bool", + "params": [ +{ "paramname": "configFile" ,"paramtype": "vr::EChaperoneConfigFile"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "RevertWorkingCopy", + "returntype": "void" +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetWorkingPlayAreaSize", + "returntype": "bool", + "params": [ +{ "paramname": "pSizeX" ,"paramtype": "float *"}, +{ "paramname": "pSizeZ" ,"paramtype": "float *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetWorkingPlayAreaRect", + "returntype": "bool", + "params": [ +{ "paramname": "rect" ,"paramtype": "struct vr::HmdQuad_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetWorkingCollisionBoundsInfo", + "returntype": "bool", + "params": [ +{ "paramname": "pQuadsBuffer" ,"out_array_count": "punQuadsCount" ,"paramtype": "struct vr::HmdQuad_t *"}, +{ "paramname": "punQuadsCount" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetLiveCollisionBoundsInfo", + "returntype": "bool", + "params": [ +{ "paramname": "pQuadsBuffer" ,"out_array_count": "punQuadsCount" ,"paramtype": "struct vr::HmdQuad_t *"}, +{ "paramname": "punQuadsCount" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetWorkingSeatedZeroPoseToRawTrackingPose", + "returntype": "bool", + "params": [ +{ "paramname": "pmatSeatedZeroPoseToRawTrackingPose" ,"paramtype": "struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetWorkingStandingZeroPoseToRawTrackingPose", + "returntype": "bool", + "params": [ +{ "paramname": "pmatStandingZeroPoseToRawTrackingPose" ,"paramtype": "struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "SetWorkingPlayAreaSize", + "returntype": "void", + "params": [ +{ "paramname": "sizeX" ,"paramtype": "float"}, +{ "paramname": "sizeZ" ,"paramtype": "float"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "SetWorkingCollisionBoundsInfo", + "returntype": "void", + "params": [ +{ "paramname": "pQuadsBuffer" ,"array_count": "unQuadsCount" ,"paramtype": "struct vr::HmdQuad_t *"}, +{ "paramname": "unQuadsCount" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "SetWorkingSeatedZeroPoseToRawTrackingPose", + "returntype": "void", + "params": [ +{ "paramname": "pMatSeatedZeroPoseToRawTrackingPose" ,"paramtype": "const struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "SetWorkingStandingZeroPoseToRawTrackingPose", + "returntype": "void", + "params": [ +{ "paramname": "pMatStandingZeroPoseToRawTrackingPose" ,"paramtype": "const struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "ReloadFromDisk", + "returntype": "void", + "params": [ +{ "paramname": "configFile" ,"paramtype": "vr::EChaperoneConfigFile"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetLiveSeatedZeroPoseToRawTrackingPose", + "returntype": "bool", + "params": [ +{ "paramname": "pmatSeatedZeroPoseToRawTrackingPose" ,"paramtype": "struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "SetWorkingCollisionBoundsTagsInfo", + "returntype": "void", + "params": [ +{ "paramname": "pTagsBuffer" ,"array_count": "unTagCount" ,"paramtype": "uint8_t *"}, +{ "paramname": "unTagCount" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetLiveCollisionBoundsTagsInfo", + "returntype": "bool", + "params": [ +{ "paramname": "pTagsBuffer" ,"out_array_count": "punTagCount" ,"paramtype": "uint8_t *"}, +{ "paramname": "punTagCount" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "SetWorkingPhysicalBoundsInfo", + "returntype": "bool", + "params": [ +{ "paramname": "pQuadsBuffer" ,"array_count": "unQuadsCount" ,"paramtype": "struct vr::HmdQuad_t *"}, +{ "paramname": "unQuadsCount" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetLivePhysicalBoundsInfo", + "returntype": "bool", + "params": [ +{ "paramname": "pQuadsBuffer" ,"out_array_count": "punQuadsCount" ,"paramtype": "struct vr::HmdQuad_t *"}, +{ "paramname": "punQuadsCount" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "ExportLiveToBuffer", + "returntype": "bool", + "params": [ +{ "paramname": "pBuffer" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "pnBufferLength" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "ImportFromBufferToWorking", + "returntype": "bool", + "params": [ +{ "paramname": "pBuffer" ,"paramtype": "const char *"}, +{ "paramname": "nImportFlags" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "SetTrackingSpace", + "returntype": "void", + "params": [ +{ "paramname": "eOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetTrackingSpace", + "returntype": "vr::ETrackingUniverseOrigin" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "WaitGetPoses", + "returntype": "vr::EVRCompositorError", + "params": [ +{ "paramname": "pRenderPoseArray" ,"array_count": "unRenderPoseArrayCount" ,"paramtype": "struct vr::TrackedDevicePose_t *"}, +{ "paramname": "unRenderPoseArrayCount" ,"paramtype": "uint32_t"}, +{ "paramname": "pGamePoseArray" ,"array_count": "unGamePoseArrayCount" ,"paramtype": "struct vr::TrackedDevicePose_t *"}, +{ "paramname": "unGamePoseArrayCount" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetLastPoses", + "returntype": "vr::EVRCompositorError", + "params": [ +{ "paramname": "pRenderPoseArray" ,"array_count": "unRenderPoseArrayCount" ,"paramtype": "struct vr::TrackedDevicePose_t *"}, +{ "paramname": "unRenderPoseArrayCount" ,"paramtype": "uint32_t"}, +{ "paramname": "pGamePoseArray" ,"array_count": "unGamePoseArrayCount" ,"paramtype": "struct vr::TrackedDevicePose_t *"}, +{ "paramname": "unGamePoseArrayCount" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetLastPoseForTrackedDeviceIndex", + "returntype": "vr::EVRCompositorError", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "pOutputPose" ,"paramtype": "struct vr::TrackedDevicePose_t *"}, +{ "paramname": "pOutputGamePose" ,"paramtype": "struct vr::TrackedDevicePose_t *"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "Submit", + "returntype": "vr::EVRCompositorError", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"}, +{ "paramname": "pTexture" ,"paramtype": "const struct vr::Texture_t *"}, +{ "paramname": "pBounds" ,"paramtype": "const struct vr::VRTextureBounds_t *"}, +{ "paramname": "nSubmitFlags" ,"paramtype": "vr::EVRSubmitFlags"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "ClearLastSubmittedFrame", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "PostPresentHandoff", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetFrameTiming", + "returntype": "bool", + "params": [ +{ "paramname": "pTiming" ,"paramtype": "struct vr::Compositor_FrameTiming *"}, +{ "paramname": "unFramesAgo" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetFrameTimings", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pTiming" ,"paramtype": "struct vr::Compositor_FrameTiming *"}, +{ "paramname": "nFrames" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetFrameTimeRemaining", + "returntype": "float" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetCumulativeStats", + "returntype": "void", + "params": [ +{ "paramname": "pStats" ,"paramtype": "struct vr::Compositor_CumulativeStats *"}, +{ "paramname": "nStatsSizeInBytes" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "FadeToColor", + "returntype": "void", + "params": [ +{ "paramname": "fSeconds" ,"paramtype": "float"}, +{ "paramname": "fRed" ,"paramtype": "float"}, +{ "paramname": "fGreen" ,"paramtype": "float"}, +{ "paramname": "fBlue" ,"paramtype": "float"}, +{ "paramname": "fAlpha" ,"paramtype": "float"}, +{ "paramname": "bBackground" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetCurrentFadeColor", + "returntype": "struct vr::HmdColor_t", + "params": [ +{ "paramname": "bBackground" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "FadeGrid", + "returntype": "void", + "params": [ +{ "paramname": "fSeconds" ,"paramtype": "float"}, +{ "paramname": "bFadeIn" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetCurrentGridAlpha", + "returntype": "float" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "SetSkyboxOverride", + "returntype": "vr::EVRCompositorError", + "params": [ +{ "paramname": "pTextures" ,"array_count": "unTextureCount" ,"paramtype": "const struct vr::Texture_t *"}, +{ "paramname": "unTextureCount" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "ClearSkyboxOverride", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "CompositorBringToFront", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "CompositorGoToBack", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "CompositorQuit", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "IsFullscreen", + "returntype": "bool" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetCurrentSceneFocusProcess", + "returntype": "uint32_t" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetLastFrameRenderer", + "returntype": "uint32_t" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "CanRenderScene", + "returntype": "bool" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "ShowMirrorWindow", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "HideMirrorWindow", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "IsMirrorWindowVisible", + "returntype": "bool" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "CompositorDumpImages", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "ShouldAppRenderWithLowResources", + "returntype": "bool" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "ForceInterleavedReprojectionOn", + "returntype": "void", + "params": [ +{ "paramname": "bOverride" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "ForceReconnectProcess", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "SuspendRendering", + "returntype": "void", + "params": [ +{ "paramname": "bSuspend" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetMirrorTextureD3D11", + "returntype": "vr::EVRCompositorError", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"}, +{ "paramname": "pD3D11DeviceOrResource" ,"paramtype": "void *"}, +{ "paramname": "ppD3D11ShaderResourceView" ,"paramtype": "void **"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "ReleaseMirrorTextureD3D11", + "returntype": "void", + "params": [ +{ "paramname": "pD3D11ShaderResourceView" ,"paramtype": "void *"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetMirrorTextureGL", + "returntype": "vr::EVRCompositorError", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"}, +{ "paramname": "pglTextureId" ,"paramtype": "vr::glUInt_t *"}, +{ "paramname": "pglSharedTextureHandle" ,"paramtype": "vr::glSharedTextureHandle_t *"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "ReleaseSharedGLTexture", + "returntype": "bool", + "params": [ +{ "paramname": "glTextureId" ,"paramtype": "vr::glUInt_t"}, +{ "paramname": "glSharedTextureHandle" ,"paramtype": "vr::glSharedTextureHandle_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "LockGLSharedTextureForAccess", + "returntype": "void", + "params": [ +{ "paramname": "glSharedTextureHandle" ,"paramtype": "vr::glSharedTextureHandle_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "UnlockGLSharedTextureForAccess", + "returntype": "void", + "params": [ +{ "paramname": "glSharedTextureHandle" ,"paramtype": "vr::glSharedTextureHandle_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetVulkanInstanceExtensionsRequired", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchValue" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetVulkanDeviceExtensionsRequired", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pPhysicalDevice" ,"paramtype": "struct VkPhysicalDevice_T *"}, +{ "paramname": "pchValue" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "FindOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "pchOverlayKey" ,"paramtype": "const char *"}, +{ "paramname": "pOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "CreateOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "pchOverlayKey" ,"paramtype": "const char *"}, +{ "paramname": "pchOverlayName" ,"paramtype": "const char *"}, +{ "paramname": "pOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "DestroyOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetHighQualityOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetHighQualityOverlay", + "returntype": "vr::VROverlayHandle_t" +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayKey", + "returntype": "uint32_t", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pchValue" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"}, +{ "paramname": "pError" ,"paramtype": "vr::EVROverlayError *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayName", + "returntype": "uint32_t", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pchValue" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"}, +{ "paramname": "pError" ,"paramtype": "vr::EVROverlayError *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayName", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pchName" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayImageData", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pvBuffer" ,"paramtype": "void *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"}, +{ "paramname": "punWidth" ,"paramtype": "uint32_t *"}, +{ "paramname": "punHeight" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayErrorNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "error" ,"paramtype": "vr::EVROverlayError"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayRenderingPid", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "unPID" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayRenderingPid", + "returntype": "uint32_t", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayFlag", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "eOverlayFlag" ,"paramtype": "vr::VROverlayFlags"}, +{ "paramname": "bEnabled" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayFlag", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "eOverlayFlag" ,"paramtype": "vr::VROverlayFlags"}, +{ "paramname": "pbEnabled" ,"paramtype": "bool *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayColor", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "fRed" ,"paramtype": "float"}, +{ "paramname": "fGreen" ,"paramtype": "float"}, +{ "paramname": "fBlue" ,"paramtype": "float"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayColor", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pfRed" ,"paramtype": "float *"}, +{ "paramname": "pfGreen" ,"paramtype": "float *"}, +{ "paramname": "pfBlue" ,"paramtype": "float *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayAlpha", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "fAlpha" ,"paramtype": "float"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayAlpha", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pfAlpha" ,"paramtype": "float *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayTexelAspect", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "fTexelAspect" ,"paramtype": "float"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTexelAspect", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pfTexelAspect" ,"paramtype": "float *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlaySortOrder", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "unSortOrder" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlaySortOrder", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "punSortOrder" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayWidthInMeters", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "fWidthInMeters" ,"paramtype": "float"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayWidthInMeters", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pfWidthInMeters" ,"paramtype": "float *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayAutoCurveDistanceRangeInMeters", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "fMinDistanceInMeters" ,"paramtype": "float"}, +{ "paramname": "fMaxDistanceInMeters" ,"paramtype": "float"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayAutoCurveDistanceRangeInMeters", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pfMinDistanceInMeters" ,"paramtype": "float *"}, +{ "paramname": "pfMaxDistanceInMeters" ,"paramtype": "float *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayTextureColorSpace", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "eTextureColorSpace" ,"paramtype": "vr::EColorSpace"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTextureColorSpace", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "peTextureColorSpace" ,"paramtype": "vr::EColorSpace *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayTextureBounds", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pOverlayTextureBounds" ,"paramtype": "const struct vr::VRTextureBounds_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTextureBounds", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pOverlayTextureBounds" ,"paramtype": "struct vr::VRTextureBounds_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayRenderModel", + "returntype": "uint32_t", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pchValue" ,"paramtype": "char *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"}, +{ "paramname": "pColor" ,"paramtype": "struct vr::HmdColor_t *"}, +{ "paramname": "pError" ,"paramtype": "vr::EVROverlayError *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayRenderModel", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pchRenderModel" ,"paramtype": "const char *"}, +{ "paramname": "pColor" ,"paramtype": "const struct vr::HmdColor_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTransformType", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "peTransformType" ,"paramtype": "vr::VROverlayTransformType *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayTransformAbsolute", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "eTrackingOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin"}, +{ "paramname": "pmatTrackingOriginToOverlayTransform" ,"paramtype": "const struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTransformAbsolute", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "peTrackingOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin *"}, +{ "paramname": "pmatTrackingOriginToOverlayTransform" ,"paramtype": "struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayTransformTrackedDeviceRelative", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "unTrackedDevice" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "pmatTrackedDeviceToOverlayTransform" ,"paramtype": "const struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTransformTrackedDeviceRelative", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "punTrackedDevice" ,"paramtype": "vr::TrackedDeviceIndex_t *"}, +{ "paramname": "pmatTrackedDeviceToOverlayTransform" ,"paramtype": "struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayTransformTrackedDeviceComponent", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "pchComponentName" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTransformTrackedDeviceComponent", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "punDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t *"}, +{ "paramname": "pchComponentName" ,"paramtype": "char *"}, +{ "paramname": "unComponentNameSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTransformOverlayRelative", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "ulOverlayHandleParent" ,"paramtype": "vr::VROverlayHandle_t *"}, +{ "paramname": "pmatParentOverlayToOverlayTransform" ,"paramtype": "struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayTransformOverlayRelative", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "ulOverlayHandleParent" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pmatParentOverlayToOverlayTransform" ,"paramtype": "const struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "ShowOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "HideOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "IsOverlayVisible", + "returntype": "bool", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetTransformForOverlayCoordinates", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "eTrackingOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin"}, +{ "paramname": "coordinatesInOverlay" ,"paramtype": "struct vr::HmdVector2_t"}, +{ "paramname": "pmatTransform" ,"paramtype": "struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "PollNextOverlayEvent", + "returntype": "bool", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pEvent" ,"paramtype": "struct vr::VREvent_t *"}, +{ "paramname": "uncbVREvent" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayInputMethod", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "peInputMethod" ,"paramtype": "vr::VROverlayInputMethod *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayInputMethod", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "eInputMethod" ,"paramtype": "vr::VROverlayInputMethod"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayMouseScale", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pvecMouseScale" ,"paramtype": "struct vr::HmdVector2_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayMouseScale", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pvecMouseScale" ,"paramtype": "const struct vr::HmdVector2_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "ComputeOverlayIntersection", + "returntype": "bool", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pParams" ,"paramtype": "const struct vr::VROverlayIntersectionParams_t *"}, +{ "paramname": "pResults" ,"paramtype": "struct vr::VROverlayIntersectionResults_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "HandleControllerOverlayInteractionAsMouse", + "returntype": "bool", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "unControllerDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "IsHoverTargetOverlay", + "returntype": "bool", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetGamepadFocusOverlay", + "returntype": "vr::VROverlayHandle_t" +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetGamepadFocusOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulNewFocusOverlay" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayNeighbor", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "eDirection" ,"paramtype": "vr::EOverlayDirection"}, +{ "paramname": "ulFrom" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "ulTo" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "MoveGamepadFocusToNeighbor", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "eDirection" ,"paramtype": "vr::EOverlayDirection"}, +{ "paramname": "ulFrom" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayTexture", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pTexture" ,"paramtype": "const struct vr::Texture_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "ClearOverlayTexture", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayRaw", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pvBuffer" ,"paramtype": "void *"}, +{ "paramname": "unWidth" ,"paramtype": "uint32_t"}, +{ "paramname": "unHeight" ,"paramtype": "uint32_t"}, +{ "paramname": "unDepth" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayFromFile", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pchFilePath" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTexture", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pNativeTextureHandle" ,"paramtype": "void **"}, +{ "paramname": "pNativeTextureRef" ,"paramtype": "void *"}, +{ "paramname": "pWidth" ,"paramtype": "uint32_t *"}, +{ "paramname": "pHeight" ,"paramtype": "uint32_t *"}, +{ "paramname": "pNativeFormat" ,"paramtype": "uint32_t *"}, +{ "paramname": "pAPIType" ,"paramtype": "vr::ETextureType *"}, +{ "paramname": "pColorSpace" ,"paramtype": "vr::EColorSpace *"}, +{ "paramname": "pTextureBounds" ,"paramtype": "struct vr::VRTextureBounds_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "ReleaseNativeOverlayHandle", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pNativeTextureHandle" ,"paramtype": "void *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTextureSize", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pWidth" ,"paramtype": "uint32_t *"}, +{ "paramname": "pHeight" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "CreateDashboardOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "pchOverlayKey" ,"paramtype": "const char *"}, +{ "paramname": "pchOverlayFriendlyName" ,"paramtype": "const char *"}, +{ "paramname": "pMainHandle" ,"paramtype": "vr::VROverlayHandle_t *"}, +{ "paramname": "pThumbnailHandle" ,"paramtype": "vr::VROverlayHandle_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "IsDashboardVisible", + "returntype": "bool" +} +,{ + "classname": "vr::IVROverlay", + "methodname": "IsActiveDashboardOverlay", + "returntype": "bool", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetDashboardOverlaySceneProcess", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "unProcessId" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetDashboardOverlaySceneProcess", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "punProcessId" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "ShowDashboard", + "returntype": "void", + "params": [ +{ "paramname": "pchOverlayToShow" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetPrimaryDashboardDevice", + "returntype": "vr::TrackedDeviceIndex_t" +} +,{ + "classname": "vr::IVROverlay", + "methodname": "ShowKeyboard", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "eInputMode" ,"paramtype": "vr::EGamepadTextInputMode"}, +{ "paramname": "eLineInputMode" ,"paramtype": "vr::EGamepadTextInputLineMode"}, +{ "paramname": "pchDescription" ,"paramtype": "const char *"}, +{ "paramname": "unCharMax" ,"paramtype": "uint32_t"}, +{ "paramname": "pchExistingText" ,"paramtype": "const char *"}, +{ "paramname": "bUseMinimalMode" ,"paramtype": "bool"}, +{ "paramname": "uUserValue" ,"paramtype": "uint64_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "ShowKeyboardForOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "eInputMode" ,"paramtype": "vr::EGamepadTextInputMode"}, +{ "paramname": "eLineInputMode" ,"paramtype": "vr::EGamepadTextInputLineMode"}, +{ "paramname": "pchDescription" ,"paramtype": "const char *"}, +{ "paramname": "unCharMax" ,"paramtype": "uint32_t"}, +{ "paramname": "pchExistingText" ,"paramtype": "const char *"}, +{ "paramname": "bUseMinimalMode" ,"paramtype": "bool"}, +{ "paramname": "uUserValue" ,"paramtype": "uint64_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetKeyboardText", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchText" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "cchText" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "HideKeyboard", + "returntype": "void" +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetKeyboardTransformAbsolute", + "returntype": "void", + "params": [ +{ "paramname": "eTrackingOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin"}, +{ "paramname": "pmatTrackingOriginToKeyboardTransform" ,"paramtype": "const struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetKeyboardPositionForOverlay", + "returntype": "void", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "avoidRect" ,"paramtype": "struct vr::HmdRect2_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayIntersectionMask", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pMaskPrimitives" ,"paramtype": "struct vr::VROverlayIntersectionMaskPrimitive_t *"}, +{ "paramname": "unNumMaskPrimitives" ,"paramtype": "uint32_t"}, +{ "paramname": "unPrimitiveSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayFlags", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pFlags" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "ShowMessageOverlay", + "returntype": "vr::VRMessageOverlayResponse", + "params": [ +{ "paramname": "pchText" ,"paramtype": "const char *"}, +{ "paramname": "pchCaption" ,"paramtype": "const char *"}, +{ "paramname": "pchButton0Text" ,"paramtype": "const char *"}, +{ "paramname": "pchButton1Text" ,"paramtype": "const char *"}, +{ "paramname": "pchButton2Text" ,"paramtype": "const char *"}, +{ "paramname": "pchButton3Text" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "LoadRenderModel_Async", + "returntype": "vr::EVRRenderModelError", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"}, +{ "paramname": "ppRenderModel" ,"paramtype": "struct vr::RenderModel_t **"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "FreeRenderModel", + "returntype": "void", + "params": [ +{ "paramname": "pRenderModel" ,"paramtype": "struct vr::RenderModel_t *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "LoadTexture_Async", + "returntype": "vr::EVRRenderModelError", + "params": [ +{ "paramname": "textureId" ,"paramtype": "vr::TextureID_t"}, +{ "paramname": "ppTexture" ,"paramtype": "struct vr::RenderModel_TextureMap_t **"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "FreeTexture", + "returntype": "void", + "params": [ +{ "paramname": "pTexture" ,"paramtype": "struct vr::RenderModel_TextureMap_t *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "LoadTextureD3D11_Async", + "returntype": "vr::EVRRenderModelError", + "params": [ +{ "paramname": "textureId" ,"paramtype": "vr::TextureID_t"}, +{ "paramname": "pD3D11Device" ,"paramtype": "void *"}, +{ "paramname": "ppD3D11Texture2D" ,"paramtype": "void **"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "LoadIntoTextureD3D11_Async", + "returntype": "vr::EVRRenderModelError", + "params": [ +{ "paramname": "textureId" ,"paramtype": "vr::TextureID_t"}, +{ "paramname": "pDstTexture" ,"paramtype": "void *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "FreeTextureD3D11", + "returntype": "void", + "params": [ +{ "paramname": "pD3D11Texture2D" ,"paramtype": "void *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetRenderModelName", + "returntype": "uint32_t", + "params": [ +{ "paramname": "unRenderModelIndex" ,"paramtype": "uint32_t"}, +{ "paramname": "pchRenderModelName" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unRenderModelNameLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetRenderModelCount", + "returntype": "uint32_t" +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetComponentCount", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetComponentName", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"}, +{ "paramname": "unComponentIndex" ,"paramtype": "uint32_t"}, +{ "paramname": "pchComponentName" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unComponentNameLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetComponentButtonMask", + "returntype": "uint64_t", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"}, +{ "paramname": "pchComponentName" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetComponentRenderModelName", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"}, +{ "paramname": "pchComponentName" ,"paramtype": "const char *"}, +{ "paramname": "pchComponentRenderModelName" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unComponentRenderModelNameLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetComponentState", + "returntype": "bool", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"}, +{ "paramname": "pchComponentName" ,"paramtype": "const char *"}, +{ "paramname": "pControllerState" ,"paramtype": "const vr::VRControllerState_t *"}, +{ "paramname": "pState" ,"paramtype": "const struct vr::RenderModel_ControllerMode_State_t *"}, +{ "paramname": "pComponentState" ,"paramtype": "struct vr::RenderModel_ComponentState_t *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "RenderModelHasComponent", + "returntype": "bool", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"}, +{ "paramname": "pchComponentName" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetRenderModelThumbnailURL", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"}, +{ "paramname": "pchThumbnailURL" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unThumbnailURLLen" ,"paramtype": "uint32_t"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRRenderModelError *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetRenderModelOriginalPath", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"}, +{ "paramname": "pchOriginalPath" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unOriginalPathLen" ,"paramtype": "uint32_t"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRRenderModelError *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetRenderModelErrorNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "error" ,"paramtype": "vr::EVRRenderModelError"} + ] +} +,{ + "classname": "vr::IVRNotifications", + "methodname": "CreateNotification", + "returntype": "vr::EVRNotificationError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "ulUserValue" ,"paramtype": "uint64_t"}, +{ "paramname": "type" ,"paramtype": "vr::EVRNotificationType"}, +{ "paramname": "pchText" ,"paramtype": "const char *"}, +{ "paramname": "style" ,"paramtype": "vr::EVRNotificationStyle"}, +{ "paramname": "pImage" ,"paramtype": "const struct vr::NotificationBitmap_t *"}, +{ "paramname": "pNotificationId" ,"paramtype": "vr::VRNotificationId *"} + ] +} +,{ + "classname": "vr::IVRNotifications", + "methodname": "RemoveNotification", + "returntype": "vr::EVRNotificationError", + "params": [ +{ "paramname": "notificationId" ,"paramtype": "vr::VRNotificationId"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "GetSettingsErrorNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "eError" ,"paramtype": "vr::EVRSettingsError"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "Sync", + "returntype": "bool", + "params": [ +{ "paramname": "bForce" ,"paramtype": "bool"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "SetBool", + "returntype": "void", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "bValue" ,"paramtype": "bool"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "SetInt32", + "returntype": "void", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "nValue" ,"paramtype": "int32_t"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "SetFloat", + "returntype": "void", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "flValue" ,"paramtype": "float"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "SetString", + "returntype": "void", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "pchValue" ,"paramtype": "const char *"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "GetBool", + "returntype": "bool", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "GetInt32", + "returntype": "int32_t", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "GetFloat", + "returntype": "float", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "GetString", + "returntype": "void", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "pchValue" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unValueLen" ,"paramtype": "uint32_t"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "RemoveSection", + "returntype": "void", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "RemoveKeyInSection", + "returntype": "void", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRScreenshots", + "methodname": "RequestScreenshot", + "returntype": "vr::EVRScreenshotError", + "params": [ +{ "paramname": "pOutScreenshotHandle" ,"paramtype": "vr::ScreenshotHandle_t *"}, +{ "paramname": "type" ,"paramtype": "vr::EVRScreenshotType"}, +{ "paramname": "pchPreviewFilename" ,"paramtype": "const char *"}, +{ "paramname": "pchVRFilename" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRScreenshots", + "methodname": "HookScreenshot", + "returntype": "vr::EVRScreenshotError", + "params": [ +{ "paramname": "pSupportedTypes" ,"array_count": "numTypes" ,"paramtype": "const vr::EVRScreenshotType *"}, +{ "paramname": "numTypes" ,"paramtype": "int"} + ] +} +,{ + "classname": "vr::IVRScreenshots", + "methodname": "GetScreenshotPropertyType", + "returntype": "vr::EVRScreenshotType", + "params": [ +{ "paramname": "screenshotHandle" ,"paramtype": "vr::ScreenshotHandle_t"}, +{ "paramname": "pError" ,"paramtype": "vr::EVRScreenshotError *"} + ] +} +,{ + "classname": "vr::IVRScreenshots", + "methodname": "GetScreenshotPropertyFilename", + "returntype": "uint32_t", + "params": [ +{ "paramname": "screenshotHandle" ,"paramtype": "vr::ScreenshotHandle_t"}, +{ "paramname": "filenameType" ,"paramtype": "vr::EVRScreenshotPropertyFilenames"}, +{ "paramname": "pchFilename" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "cchFilename" ,"paramtype": "uint32_t"}, +{ "paramname": "pError" ,"paramtype": "vr::EVRScreenshotError *"} + ] +} +,{ + "classname": "vr::IVRScreenshots", + "methodname": "UpdateScreenshotProgress", + "returntype": "vr::EVRScreenshotError", + "params": [ +{ "paramname": "screenshotHandle" ,"paramtype": "vr::ScreenshotHandle_t"}, +{ "paramname": "flProgress" ,"paramtype": "float"} + ] +} +,{ + "classname": "vr::IVRScreenshots", + "methodname": "TakeStereoScreenshot", + "returntype": "vr::EVRScreenshotError", + "params": [ +{ "paramname": "pOutScreenshotHandle" ,"paramtype": "vr::ScreenshotHandle_t *"}, +{ "paramname": "pchPreviewFilename" ,"paramtype": "const char *"}, +{ "paramname": "pchVRFilename" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRScreenshots", + "methodname": "SubmitScreenshot", + "returntype": "vr::EVRScreenshotError", + "params": [ +{ "paramname": "screenshotHandle" ,"paramtype": "vr::ScreenshotHandle_t"}, +{ "paramname": "type" ,"paramtype": "vr::EVRScreenshotType"}, +{ "paramname": "pchSourcePreviewFilename" ,"paramtype": "const char *"}, +{ "paramname": "pchSourceVRFilename" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRResources", + "methodname": "LoadSharedResource", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchResourceName" ,"paramtype": "const char *"}, +{ "paramname": "pchBuffer" ,"paramtype": "char *"}, +{ "paramname": "unBufferLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRResources", + "methodname": "GetResourceFullPath", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchResourceName" ,"paramtype": "const char *"}, +{ "paramname": "pchResourceTypeDirectory" ,"paramtype": "const char *"}, +{ "paramname": "pchPathBuffer" ,"paramtype": "char *"}, +{ "paramname": "unBufferLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRDriverManager", + "methodname": "GetDriverCount", + "returntype": "uint32_t" +} +,{ + "classname": "vr::IVRDriverManager", + "methodname": "GetDriverName", + "returntype": "uint32_t", + "params": [ +{ "paramname": "nDriver" ,"paramtype": "vr::DriverId_t"}, +{ "paramname": "pchValue" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"} + ] +} +] +} \ No newline at end of file diff --git a/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Headers/openvr_capi.h b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Headers/openvr_capi.h new file mode 100644 index 000000000..a6685e579 --- /dev/null +++ b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Headers/openvr_capi.h @@ -0,0 +1,1918 @@ +//======= Copyright (c) Valve Corporation, All rights reserved. =============== +// +// Purpose: Header for flatted SteamAPI. Use this for binding to other languages. +// This file is auto-generated, do not edit it. +// +//============================================================================= + +#ifndef __OPENVR_API_FLAT_H__ +#define __OPENVR_API_FLAT_H__ +#if defined( _WIN32 ) || defined( __clang__ ) +#pragma once +#endif + +#ifdef __cplusplus +#define EXTERN_C extern "C" +#else +#define EXTERN_C +#endif + +#if defined( _WIN32 ) +#define OPENVR_FNTABLE_CALLTYPE __stdcall +#else +#define OPENVR_FNTABLE_CALLTYPE +#endif + +// OPENVR API export macro +#if defined( _WIN32 ) && !defined( _X360 ) + #if defined( OPENVR_API_EXPORTS ) + #define S_API EXTERN_C __declspec( dllexport ) + #elif defined( OPENVR_API_NODLL ) + #define S_API EXTERN_C + #else + #define S_API extern "C" __declspec( dllimport ) + #endif // OPENVR_API_EXPORTS +#elif defined( __GNUC__ ) + #if defined( OPENVR_API_EXPORTS ) + #define S_API EXTERN_C __attribute__ ((visibility("default"))) + #else + #define S_API EXTERN_C + #endif // OPENVR_API_EXPORTS +#else // !WIN32 + #if defined( OPENVR_API_EXPORTS ) + #define S_API EXTERN_C + #else + #define S_API EXTERN_C + #endif // OPENVR_API_EXPORTS +#endif + +#include + +#if defined( __WIN32 ) +typedef char bool; +#else +#include +#endif + +typedef uint64_t PropertyContainerHandle_t; +typedef uint32_t PropertyTypeTag_t; + + +// OpenVR Constants + +static const unsigned int k_nDriverNone = 4294967295; +static const unsigned int k_unMaxDriverDebugResponseSize = 32768; +static const unsigned int k_unTrackedDeviceIndex_Hmd = 0; +static const unsigned int k_unMaxTrackedDeviceCount = 16; +static const unsigned int k_unTrackedDeviceIndexOther = 4294967294; +static const unsigned int k_unTrackedDeviceIndexInvalid = 4294967295; +static const unsigned long k_ulInvalidPropertyContainer = 0; +static const unsigned int k_unInvalidPropertyTag = 0; +static const unsigned int k_unFloatPropertyTag = 1; +static const unsigned int k_unInt32PropertyTag = 2; +static const unsigned int k_unUint64PropertyTag = 3; +static const unsigned int k_unBoolPropertyTag = 4; +static const unsigned int k_unStringPropertyTag = 5; +static const unsigned int k_unHmdMatrix34PropertyTag = 20; +static const unsigned int k_unHmdMatrix44PropertyTag = 21; +static const unsigned int k_unHmdVector3PropertyTag = 22; +static const unsigned int k_unHmdVector4PropertyTag = 23; +static const unsigned int k_unHiddenAreaPropertyTag = 30; +static const unsigned int k_unOpenVRInternalReserved_Start = 1000; +static const unsigned int k_unOpenVRInternalReserved_End = 10000; +static const unsigned int k_unMaxPropertyStringSize = 32768; +static const unsigned int k_unControllerStateAxisCount = 5; +static const unsigned long k_ulOverlayHandleInvalid = 0; +static const unsigned int k_unScreenshotHandleInvalid = 0; +static const char * IVRSystem_Version = "IVRSystem_016"; +static const char * IVRExtendedDisplay_Version = "IVRExtendedDisplay_001"; +static const char * IVRTrackedCamera_Version = "IVRTrackedCamera_003"; +static const unsigned int k_unMaxApplicationKeyLength = 128; +static const char * k_pch_MimeType_HomeApp = "vr/home"; +static const char * k_pch_MimeType_GameTheater = "vr/game_theater"; +static const char * IVRApplications_Version = "IVRApplications_006"; +static const char * IVRChaperone_Version = "IVRChaperone_003"; +static const char * IVRChaperoneSetup_Version = "IVRChaperoneSetup_005"; +static const char * IVRCompositor_Version = "IVRCompositor_020"; +static const unsigned int k_unVROverlayMaxKeyLength = 128; +static const unsigned int k_unVROverlayMaxNameLength = 128; +static const unsigned int k_unMaxOverlayCount = 64; +static const unsigned int k_unMaxOverlayIntersectionMaskPrimitivesCount = 32; +static const char * IVROverlay_Version = "IVROverlay_016"; +static const char * k_pch_Controller_Component_GDC2015 = "gdc2015"; +static const char * k_pch_Controller_Component_Base = "base"; +static const char * k_pch_Controller_Component_Tip = "tip"; +static const char * k_pch_Controller_Component_HandGrip = "handgrip"; +static const char * k_pch_Controller_Component_Status = "status"; +static const char * IVRRenderModels_Version = "IVRRenderModels_005"; +static const unsigned int k_unNotificationTextMaxSize = 256; +static const char * IVRNotifications_Version = "IVRNotifications_002"; +static const unsigned int k_unMaxSettingsKeyLength = 128; +static const char * IVRSettings_Version = "IVRSettings_002"; +static const char * k_pch_SteamVR_Section = "steamvr"; +static const char * k_pch_SteamVR_RequireHmd_String = "requireHmd"; +static const char * k_pch_SteamVR_ForcedDriverKey_String = "forcedDriver"; +static const char * k_pch_SteamVR_ForcedHmdKey_String = "forcedHmd"; +static const char * k_pch_SteamVR_DisplayDebug_Bool = "displayDebug"; +static const char * k_pch_SteamVR_DebugProcessPipe_String = "debugProcessPipe"; +static const char * k_pch_SteamVR_DisplayDebugX_Int32 = "displayDebugX"; +static const char * k_pch_SteamVR_DisplayDebugY_Int32 = "displayDebugY"; +static const char * k_pch_SteamVR_SendSystemButtonToAllApps_Bool = "sendSystemButtonToAllApps"; +static const char * k_pch_SteamVR_LogLevel_Int32 = "loglevel"; +static const char * k_pch_SteamVR_IPD_Float = "ipd"; +static const char * k_pch_SteamVR_Background_String = "background"; +static const char * k_pch_SteamVR_BackgroundUseDomeProjection_Bool = "backgroundUseDomeProjection"; +static const char * k_pch_SteamVR_BackgroundCameraHeight_Float = "backgroundCameraHeight"; +static const char * k_pch_SteamVR_BackgroundDomeRadius_Float = "backgroundDomeRadius"; +static const char * k_pch_SteamVR_GridColor_String = "gridColor"; +static const char * k_pch_SteamVR_PlayAreaColor_String = "playAreaColor"; +static const char * k_pch_SteamVR_ShowStage_Bool = "showStage"; +static const char * k_pch_SteamVR_ActivateMultipleDrivers_Bool = "activateMultipleDrivers"; +static const char * k_pch_SteamVR_DirectMode_Bool = "directMode"; +static const char * k_pch_SteamVR_DirectModeEdidVid_Int32 = "directModeEdidVid"; +static const char * k_pch_SteamVR_DirectModeEdidPid_Int32 = "directModeEdidPid"; +static const char * k_pch_SteamVR_UsingSpeakers_Bool = "usingSpeakers"; +static const char * k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float = "speakersForwardYawOffsetDegrees"; +static const char * k_pch_SteamVR_BaseStationPowerManagement_Bool = "basestationPowerManagement"; +static const char * k_pch_SteamVR_NeverKillProcesses_Bool = "neverKillProcesses"; +static const char * k_pch_SteamVR_SupersampleScale_Float = "supersampleScale"; +static const char * k_pch_SteamVR_AllowAsyncReprojection_Bool = "allowAsyncReprojection"; +static const char * k_pch_SteamVR_AllowReprojection_Bool = "allowInterleavedReprojection"; +static const char * k_pch_SteamVR_ForceReprojection_Bool = "forceReprojection"; +static const char * k_pch_SteamVR_ForceFadeOnBadTracking_Bool = "forceFadeOnBadTracking"; +static const char * k_pch_SteamVR_DefaultMirrorView_Int32 = "defaultMirrorView"; +static const char * k_pch_SteamVR_ShowMirrorView_Bool = "showMirrorView"; +static const char * k_pch_SteamVR_MirrorViewGeometry_String = "mirrorViewGeometry"; +static const char * k_pch_SteamVR_StartMonitorFromAppLaunch = "startMonitorFromAppLaunch"; +static const char * k_pch_SteamVR_StartCompositorFromAppLaunch_Bool = "startCompositorFromAppLaunch"; +static const char * k_pch_SteamVR_StartDashboardFromAppLaunch_Bool = "startDashboardFromAppLaunch"; +static const char * k_pch_SteamVR_StartOverlayAppsFromDashboard_Bool = "startOverlayAppsFromDashboard"; +static const char * k_pch_SteamVR_EnableHomeApp = "enableHomeApp"; +static const char * k_pch_SteamVR_CycleBackgroundImageTimeSec_Int32 = "CycleBackgroundImageTimeSec"; +static const char * k_pch_SteamVR_RetailDemo_Bool = "retailDemo"; +static const char * k_pch_SteamVR_IpdOffset_Float = "ipdOffset"; +static const char * k_pch_SteamVR_AllowSupersampleFiltering_Bool = "allowSupersampleFiltering"; +static const char * k_pch_Lighthouse_Section = "driver_lighthouse"; +static const char * k_pch_Lighthouse_DisableIMU_Bool = "disableimu"; +static const char * k_pch_Lighthouse_UseDisambiguation_String = "usedisambiguation"; +static const char * k_pch_Lighthouse_DisambiguationDebug_Int32 = "disambiguationdebug"; +static const char * k_pch_Lighthouse_PrimaryBasestation_Int32 = "primarybasestation"; +static const char * k_pch_Lighthouse_DBHistory_Bool = "dbhistory"; +static const char * k_pch_Null_Section = "driver_null"; +static const char * k_pch_Null_SerialNumber_String = "serialNumber"; +static const char * k_pch_Null_ModelNumber_String = "modelNumber"; +static const char * k_pch_Null_WindowX_Int32 = "windowX"; +static const char * k_pch_Null_WindowY_Int32 = "windowY"; +static const char * k_pch_Null_WindowWidth_Int32 = "windowWidth"; +static const char * k_pch_Null_WindowHeight_Int32 = "windowHeight"; +static const char * k_pch_Null_RenderWidth_Int32 = "renderWidth"; +static const char * k_pch_Null_RenderHeight_Int32 = "renderHeight"; +static const char * k_pch_Null_SecondsFromVsyncToPhotons_Float = "secondsFromVsyncToPhotons"; +static const char * k_pch_Null_DisplayFrequency_Float = "displayFrequency"; +static const char * k_pch_UserInterface_Section = "userinterface"; +static const char * k_pch_UserInterface_StatusAlwaysOnTop_Bool = "StatusAlwaysOnTop"; +static const char * k_pch_UserInterface_MinimizeToTray_Bool = "MinimizeToTray"; +static const char * k_pch_UserInterface_Screenshots_Bool = "screenshots"; +static const char * k_pch_UserInterface_ScreenshotType_Int = "screenshotType"; +static const char * k_pch_Notifications_Section = "notifications"; +static const char * k_pch_Notifications_DoNotDisturb_Bool = "DoNotDisturb"; +static const char * k_pch_Keyboard_Section = "keyboard"; +static const char * k_pch_Keyboard_TutorialCompletions = "TutorialCompletions"; +static const char * k_pch_Keyboard_ScaleX = "ScaleX"; +static const char * k_pch_Keyboard_ScaleY = "ScaleY"; +static const char * k_pch_Keyboard_OffsetLeftX = "OffsetLeftX"; +static const char * k_pch_Keyboard_OffsetRightX = "OffsetRightX"; +static const char * k_pch_Keyboard_OffsetY = "OffsetY"; +static const char * k_pch_Keyboard_Smoothing = "Smoothing"; +static const char * k_pch_Perf_Section = "perfcheck"; +static const char * k_pch_Perf_HeuristicActive_Bool = "heuristicActive"; +static const char * k_pch_Perf_NotifyInHMD_Bool = "warnInHMD"; +static const char * k_pch_Perf_NotifyOnlyOnce_Bool = "warnOnlyOnce"; +static const char * k_pch_Perf_AllowTimingStore_Bool = "allowTimingStore"; +static const char * k_pch_Perf_SaveTimingsOnExit_Bool = "saveTimingsOnExit"; +static const char * k_pch_Perf_TestData_Float = "perfTestData"; +static const char * k_pch_Perf_LinuxGPUProfiling_Bool = "linuxGPUProfiling"; +static const char * k_pch_CollisionBounds_Section = "collisionBounds"; +static const char * k_pch_CollisionBounds_Style_Int32 = "CollisionBoundsStyle"; +static const char * k_pch_CollisionBounds_GroundPerimeterOn_Bool = "CollisionBoundsGroundPerimeterOn"; +static const char * k_pch_CollisionBounds_CenterMarkerOn_Bool = "CollisionBoundsCenterMarkerOn"; +static const char * k_pch_CollisionBounds_PlaySpaceOn_Bool = "CollisionBoundsPlaySpaceOn"; +static const char * k_pch_CollisionBounds_FadeDistance_Float = "CollisionBoundsFadeDistance"; +static const char * k_pch_CollisionBounds_ColorGammaR_Int32 = "CollisionBoundsColorGammaR"; +static const char * k_pch_CollisionBounds_ColorGammaG_Int32 = "CollisionBoundsColorGammaG"; +static const char * k_pch_CollisionBounds_ColorGammaB_Int32 = "CollisionBoundsColorGammaB"; +static const char * k_pch_CollisionBounds_ColorGammaA_Int32 = "CollisionBoundsColorGammaA"; +static const char * k_pch_Camera_Section = "camera"; +static const char * k_pch_Camera_EnableCamera_Bool = "enableCamera"; +static const char * k_pch_Camera_EnableCameraInDashboard_Bool = "enableCameraInDashboard"; +static const char * k_pch_Camera_EnableCameraForCollisionBounds_Bool = "enableCameraForCollisionBounds"; +static const char * k_pch_Camera_EnableCameraForRoomView_Bool = "enableCameraForRoomView"; +static const char * k_pch_Camera_BoundsColorGammaR_Int32 = "cameraBoundsColorGammaR"; +static const char * k_pch_Camera_BoundsColorGammaG_Int32 = "cameraBoundsColorGammaG"; +static const char * k_pch_Camera_BoundsColorGammaB_Int32 = "cameraBoundsColorGammaB"; +static const char * k_pch_Camera_BoundsColorGammaA_Int32 = "cameraBoundsColorGammaA"; +static const char * k_pch_Camera_BoundsStrength_Int32 = "cameraBoundsStrength"; +static const char * k_pch_audio_Section = "audio"; +static const char * k_pch_audio_OnPlaybackDevice_String = "onPlaybackDevice"; +static const char * k_pch_audio_OnRecordDevice_String = "onRecordDevice"; +static const char * k_pch_audio_OnPlaybackMirrorDevice_String = "onPlaybackMirrorDevice"; +static const char * k_pch_audio_OffPlaybackDevice_String = "offPlaybackDevice"; +static const char * k_pch_audio_OffRecordDevice_String = "offRecordDevice"; +static const char * k_pch_audio_VIVEHDMIGain = "viveHDMIGain"; +static const char * k_pch_Power_Section = "power"; +static const char * k_pch_Power_PowerOffOnExit_Bool = "powerOffOnExit"; +static const char * k_pch_Power_TurnOffScreensTimeout_Float = "turnOffScreensTimeout"; +static const char * k_pch_Power_TurnOffControllersTimeout_Float = "turnOffControllersTimeout"; +static const char * k_pch_Power_ReturnToWatchdogTimeout_Float = "returnToWatchdogTimeout"; +static const char * k_pch_Power_AutoLaunchSteamVROnButtonPress = "autoLaunchSteamVROnButtonPress"; +static const char * k_pch_Dashboard_Section = "dashboard"; +static const char * k_pch_Dashboard_EnableDashboard_Bool = "enableDashboard"; +static const char * k_pch_Dashboard_ArcadeMode_Bool = "arcadeMode"; +static const char * k_pch_modelskin_Section = "modelskins"; +static const char * k_pch_Driver_Enable_Bool = "enable"; +static const char * IVRScreenshots_Version = "IVRScreenshots_001"; +static const char * IVRResources_Version = "IVRResources_001"; +static const char * IVRDriverManager_Version = "IVRDriverManager_001"; + +// OpenVR Enums + +typedef enum EVREye +{ + EVREye_Eye_Left = 0, + EVREye_Eye_Right = 1, +} EVREye; + +typedef enum ETextureType +{ + ETextureType_TextureType_DirectX = 0, + ETextureType_TextureType_OpenGL = 1, + ETextureType_TextureType_Vulkan = 2, + ETextureType_TextureType_IOSurface = 3, + ETextureType_TextureType_DirectX12 = 4, +} ETextureType; + +typedef enum EColorSpace +{ + EColorSpace_ColorSpace_Auto = 0, + EColorSpace_ColorSpace_Gamma = 1, + EColorSpace_ColorSpace_Linear = 2, +} EColorSpace; + +typedef enum ETrackingResult +{ + ETrackingResult_TrackingResult_Uninitialized = 1, + ETrackingResult_TrackingResult_Calibrating_InProgress = 100, + ETrackingResult_TrackingResult_Calibrating_OutOfRange = 101, + ETrackingResult_TrackingResult_Running_OK = 200, + ETrackingResult_TrackingResult_Running_OutOfRange = 201, +} ETrackingResult; + +typedef enum ETrackedDeviceClass +{ + ETrackedDeviceClass_TrackedDeviceClass_Invalid = 0, + ETrackedDeviceClass_TrackedDeviceClass_HMD = 1, + ETrackedDeviceClass_TrackedDeviceClass_Controller = 2, + ETrackedDeviceClass_TrackedDeviceClass_GenericTracker = 3, + ETrackedDeviceClass_TrackedDeviceClass_TrackingReference = 4, + ETrackedDeviceClass_TrackedDeviceClass_DisplayRedirect = 5, +} ETrackedDeviceClass; + +typedef enum ETrackedControllerRole +{ + ETrackedControllerRole_TrackedControllerRole_Invalid = 0, + ETrackedControllerRole_TrackedControllerRole_LeftHand = 1, + ETrackedControllerRole_TrackedControllerRole_RightHand = 2, +} ETrackedControllerRole; + +typedef enum ETrackingUniverseOrigin +{ + ETrackingUniverseOrigin_TrackingUniverseSeated = 0, + ETrackingUniverseOrigin_TrackingUniverseStanding = 1, + ETrackingUniverseOrigin_TrackingUniverseRawAndUncalibrated = 2, +} ETrackingUniverseOrigin; + +typedef enum ETrackedDeviceProperty +{ + ETrackedDeviceProperty_Prop_Invalid = 0, + ETrackedDeviceProperty_Prop_TrackingSystemName_String = 1000, + ETrackedDeviceProperty_Prop_ModelNumber_String = 1001, + ETrackedDeviceProperty_Prop_SerialNumber_String = 1002, + ETrackedDeviceProperty_Prop_RenderModelName_String = 1003, + ETrackedDeviceProperty_Prop_WillDriftInYaw_Bool = 1004, + ETrackedDeviceProperty_Prop_ManufacturerName_String = 1005, + ETrackedDeviceProperty_Prop_TrackingFirmwareVersion_String = 1006, + ETrackedDeviceProperty_Prop_HardwareRevision_String = 1007, + ETrackedDeviceProperty_Prop_AllWirelessDongleDescriptions_String = 1008, + ETrackedDeviceProperty_Prop_ConnectedWirelessDongle_String = 1009, + ETrackedDeviceProperty_Prop_DeviceIsWireless_Bool = 1010, + ETrackedDeviceProperty_Prop_DeviceIsCharging_Bool = 1011, + ETrackedDeviceProperty_Prop_DeviceBatteryPercentage_Float = 1012, + ETrackedDeviceProperty_Prop_StatusDisplayTransform_Matrix34 = 1013, + ETrackedDeviceProperty_Prop_Firmware_UpdateAvailable_Bool = 1014, + ETrackedDeviceProperty_Prop_Firmware_ManualUpdate_Bool = 1015, + ETrackedDeviceProperty_Prop_Firmware_ManualUpdateURL_String = 1016, + ETrackedDeviceProperty_Prop_HardwareRevision_Uint64 = 1017, + ETrackedDeviceProperty_Prop_FirmwareVersion_Uint64 = 1018, + ETrackedDeviceProperty_Prop_FPGAVersion_Uint64 = 1019, + ETrackedDeviceProperty_Prop_VRCVersion_Uint64 = 1020, + ETrackedDeviceProperty_Prop_RadioVersion_Uint64 = 1021, + ETrackedDeviceProperty_Prop_DongleVersion_Uint64 = 1022, + ETrackedDeviceProperty_Prop_BlockServerShutdown_Bool = 1023, + ETrackedDeviceProperty_Prop_CanUnifyCoordinateSystemWithHmd_Bool = 1024, + ETrackedDeviceProperty_Prop_ContainsProximitySensor_Bool = 1025, + ETrackedDeviceProperty_Prop_DeviceProvidesBatteryStatus_Bool = 1026, + ETrackedDeviceProperty_Prop_DeviceCanPowerOff_Bool = 1027, + ETrackedDeviceProperty_Prop_Firmware_ProgrammingTarget_String = 1028, + ETrackedDeviceProperty_Prop_DeviceClass_Int32 = 1029, + ETrackedDeviceProperty_Prop_HasCamera_Bool = 1030, + ETrackedDeviceProperty_Prop_DriverVersion_String = 1031, + ETrackedDeviceProperty_Prop_Firmware_ForceUpdateRequired_Bool = 1032, + ETrackedDeviceProperty_Prop_ViveSystemButtonFixRequired_Bool = 1033, + ETrackedDeviceProperty_Prop_ParentDriver_Uint64 = 1034, + ETrackedDeviceProperty_Prop_ResourceRoot_String = 1035, + ETrackedDeviceProperty_Prop_ReportsTimeSinceVSync_Bool = 2000, + ETrackedDeviceProperty_Prop_SecondsFromVsyncToPhotons_Float = 2001, + ETrackedDeviceProperty_Prop_DisplayFrequency_Float = 2002, + ETrackedDeviceProperty_Prop_UserIpdMeters_Float = 2003, + ETrackedDeviceProperty_Prop_CurrentUniverseId_Uint64 = 2004, + ETrackedDeviceProperty_Prop_PreviousUniverseId_Uint64 = 2005, + ETrackedDeviceProperty_Prop_DisplayFirmwareVersion_Uint64 = 2006, + ETrackedDeviceProperty_Prop_IsOnDesktop_Bool = 2007, + ETrackedDeviceProperty_Prop_DisplayMCType_Int32 = 2008, + ETrackedDeviceProperty_Prop_DisplayMCOffset_Float = 2009, + ETrackedDeviceProperty_Prop_DisplayMCScale_Float = 2010, + ETrackedDeviceProperty_Prop_EdidVendorID_Int32 = 2011, + ETrackedDeviceProperty_Prop_DisplayMCImageLeft_String = 2012, + ETrackedDeviceProperty_Prop_DisplayMCImageRight_String = 2013, + ETrackedDeviceProperty_Prop_DisplayGCBlackClamp_Float = 2014, + ETrackedDeviceProperty_Prop_EdidProductID_Int32 = 2015, + ETrackedDeviceProperty_Prop_CameraToHeadTransform_Matrix34 = 2016, + ETrackedDeviceProperty_Prop_DisplayGCType_Int32 = 2017, + ETrackedDeviceProperty_Prop_DisplayGCOffset_Float = 2018, + ETrackedDeviceProperty_Prop_DisplayGCScale_Float = 2019, + ETrackedDeviceProperty_Prop_DisplayGCPrescale_Float = 2020, + ETrackedDeviceProperty_Prop_DisplayGCImage_String = 2021, + ETrackedDeviceProperty_Prop_LensCenterLeftU_Float = 2022, + ETrackedDeviceProperty_Prop_LensCenterLeftV_Float = 2023, + ETrackedDeviceProperty_Prop_LensCenterRightU_Float = 2024, + ETrackedDeviceProperty_Prop_LensCenterRightV_Float = 2025, + ETrackedDeviceProperty_Prop_UserHeadToEyeDepthMeters_Float = 2026, + ETrackedDeviceProperty_Prop_CameraFirmwareVersion_Uint64 = 2027, + ETrackedDeviceProperty_Prop_CameraFirmwareDescription_String = 2028, + ETrackedDeviceProperty_Prop_DisplayFPGAVersion_Uint64 = 2029, + ETrackedDeviceProperty_Prop_DisplayBootloaderVersion_Uint64 = 2030, + ETrackedDeviceProperty_Prop_DisplayHardwareVersion_Uint64 = 2031, + ETrackedDeviceProperty_Prop_AudioFirmwareVersion_Uint64 = 2032, + ETrackedDeviceProperty_Prop_CameraCompatibilityMode_Int32 = 2033, + ETrackedDeviceProperty_Prop_ScreenshotHorizontalFieldOfViewDegrees_Float = 2034, + ETrackedDeviceProperty_Prop_ScreenshotVerticalFieldOfViewDegrees_Float = 2035, + ETrackedDeviceProperty_Prop_DisplaySuppressed_Bool = 2036, + ETrackedDeviceProperty_Prop_DisplayAllowNightMode_Bool = 2037, + ETrackedDeviceProperty_Prop_DisplayMCImageWidth_Int32 = 2038, + ETrackedDeviceProperty_Prop_DisplayMCImageHeight_Int32 = 2039, + ETrackedDeviceProperty_Prop_DisplayMCImageNumChannels_Int32 = 2040, + ETrackedDeviceProperty_Prop_DisplayMCImageData_Binary = 2041, + ETrackedDeviceProperty_Prop_SecondsFromPhotonsToVblank_Float = 2042, + ETrackedDeviceProperty_Prop_DriverDirectModeSendsVsyncEvents_Bool = 2043, + ETrackedDeviceProperty_Prop_DisplayDebugMode_Bool = 2044, + ETrackedDeviceProperty_Prop_GraphicsAdapterLuid_Uint64 = 2045, + ETrackedDeviceProperty_Prop_AttachedDeviceId_String = 3000, + ETrackedDeviceProperty_Prop_SupportedButtons_Uint64 = 3001, + ETrackedDeviceProperty_Prop_Axis0Type_Int32 = 3002, + ETrackedDeviceProperty_Prop_Axis1Type_Int32 = 3003, + ETrackedDeviceProperty_Prop_Axis2Type_Int32 = 3004, + ETrackedDeviceProperty_Prop_Axis3Type_Int32 = 3005, + ETrackedDeviceProperty_Prop_Axis4Type_Int32 = 3006, + ETrackedDeviceProperty_Prop_ControllerRoleHint_Int32 = 3007, + ETrackedDeviceProperty_Prop_FieldOfViewLeftDegrees_Float = 4000, + ETrackedDeviceProperty_Prop_FieldOfViewRightDegrees_Float = 4001, + ETrackedDeviceProperty_Prop_FieldOfViewTopDegrees_Float = 4002, + ETrackedDeviceProperty_Prop_FieldOfViewBottomDegrees_Float = 4003, + ETrackedDeviceProperty_Prop_TrackingRangeMinimumMeters_Float = 4004, + ETrackedDeviceProperty_Prop_TrackingRangeMaximumMeters_Float = 4005, + ETrackedDeviceProperty_Prop_ModeLabel_String = 4006, + ETrackedDeviceProperty_Prop_IconPathName_String = 5000, + ETrackedDeviceProperty_Prop_NamedIconPathDeviceOff_String = 5001, + ETrackedDeviceProperty_Prop_NamedIconPathDeviceSearching_String = 5002, + ETrackedDeviceProperty_Prop_NamedIconPathDeviceSearchingAlert_String = 5003, + ETrackedDeviceProperty_Prop_NamedIconPathDeviceReady_String = 5004, + ETrackedDeviceProperty_Prop_NamedIconPathDeviceReadyAlert_String = 5005, + ETrackedDeviceProperty_Prop_NamedIconPathDeviceNotReady_String = 5006, + ETrackedDeviceProperty_Prop_NamedIconPathDeviceStandby_String = 5007, + ETrackedDeviceProperty_Prop_NamedIconPathDeviceAlertLow_String = 5008, + ETrackedDeviceProperty_Prop_DisplayHiddenArea_Binary_Start = 5100, + ETrackedDeviceProperty_Prop_DisplayHiddenArea_Binary_End = 5150, + ETrackedDeviceProperty_Prop_UserConfigPath_String = 6000, + ETrackedDeviceProperty_Prop_InstallPath_String = 6001, + ETrackedDeviceProperty_Prop_HasDisplayComponent_Bool = 6002, + ETrackedDeviceProperty_Prop_HasControllerComponent_Bool = 6003, + ETrackedDeviceProperty_Prop_HasCameraComponent_Bool = 6004, + ETrackedDeviceProperty_Prop_HasDriverDirectModeComponent_Bool = 6005, + ETrackedDeviceProperty_Prop_HasVirtualDisplayComponent_Bool = 6006, + ETrackedDeviceProperty_Prop_VendorSpecific_Reserved_Start = 10000, + ETrackedDeviceProperty_Prop_VendorSpecific_Reserved_End = 10999, +} ETrackedDeviceProperty; + +typedef enum ETrackedPropertyError +{ + ETrackedPropertyError_TrackedProp_Success = 0, + ETrackedPropertyError_TrackedProp_WrongDataType = 1, + ETrackedPropertyError_TrackedProp_WrongDeviceClass = 2, + ETrackedPropertyError_TrackedProp_BufferTooSmall = 3, + ETrackedPropertyError_TrackedProp_UnknownProperty = 4, + ETrackedPropertyError_TrackedProp_InvalidDevice = 5, + ETrackedPropertyError_TrackedProp_CouldNotContactServer = 6, + ETrackedPropertyError_TrackedProp_ValueNotProvidedByDevice = 7, + ETrackedPropertyError_TrackedProp_StringExceedsMaximumLength = 8, + ETrackedPropertyError_TrackedProp_NotYetAvailable = 9, + ETrackedPropertyError_TrackedProp_PermissionDenied = 10, + ETrackedPropertyError_TrackedProp_InvalidOperation = 11, +} ETrackedPropertyError; + +typedef enum EVRSubmitFlags +{ + EVRSubmitFlags_Submit_Default = 0, + EVRSubmitFlags_Submit_LensDistortionAlreadyApplied = 1, + EVRSubmitFlags_Submit_GlRenderBuffer = 2, + EVRSubmitFlags_Submit_Reserved = 4, +} EVRSubmitFlags; + +typedef enum EVRState +{ + EVRState_VRState_Undefined = -1, + EVRState_VRState_Off = 0, + EVRState_VRState_Searching = 1, + EVRState_VRState_Searching_Alert = 2, + EVRState_VRState_Ready = 3, + EVRState_VRState_Ready_Alert = 4, + EVRState_VRState_NotReady = 5, + EVRState_VRState_Standby = 6, + EVRState_VRState_Ready_Alert_Low = 7, +} EVRState; + +typedef enum EVREventType +{ + EVREventType_VREvent_None = 0, + EVREventType_VREvent_TrackedDeviceActivated = 100, + EVREventType_VREvent_TrackedDeviceDeactivated = 101, + EVREventType_VREvent_TrackedDeviceUpdated = 102, + EVREventType_VREvent_TrackedDeviceUserInteractionStarted = 103, + EVREventType_VREvent_TrackedDeviceUserInteractionEnded = 104, + EVREventType_VREvent_IpdChanged = 105, + EVREventType_VREvent_EnterStandbyMode = 106, + EVREventType_VREvent_LeaveStandbyMode = 107, + EVREventType_VREvent_TrackedDeviceRoleChanged = 108, + EVREventType_VREvent_WatchdogWakeUpRequested = 109, + EVREventType_VREvent_LensDistortionChanged = 110, + EVREventType_VREvent_PropertyChanged = 111, + EVREventType_VREvent_ButtonPress = 200, + EVREventType_VREvent_ButtonUnpress = 201, + EVREventType_VREvent_ButtonTouch = 202, + EVREventType_VREvent_ButtonUntouch = 203, + EVREventType_VREvent_MouseMove = 300, + EVREventType_VREvent_MouseButtonDown = 301, + EVREventType_VREvent_MouseButtonUp = 302, + EVREventType_VREvent_FocusEnter = 303, + EVREventType_VREvent_FocusLeave = 304, + EVREventType_VREvent_Scroll = 305, + EVREventType_VREvent_TouchPadMove = 306, + EVREventType_VREvent_OverlayFocusChanged = 307, + EVREventType_VREvent_InputFocusCaptured = 400, + EVREventType_VREvent_InputFocusReleased = 401, + EVREventType_VREvent_SceneFocusLost = 402, + EVREventType_VREvent_SceneFocusGained = 403, + EVREventType_VREvent_SceneApplicationChanged = 404, + EVREventType_VREvent_SceneFocusChanged = 405, + EVREventType_VREvent_InputFocusChanged = 406, + EVREventType_VREvent_SceneApplicationSecondaryRenderingStarted = 407, + EVREventType_VREvent_HideRenderModels = 410, + EVREventType_VREvent_ShowRenderModels = 411, + EVREventType_VREvent_OverlayShown = 500, + EVREventType_VREvent_OverlayHidden = 501, + EVREventType_VREvent_DashboardActivated = 502, + EVREventType_VREvent_DashboardDeactivated = 503, + EVREventType_VREvent_DashboardThumbSelected = 504, + EVREventType_VREvent_DashboardRequested = 505, + EVREventType_VREvent_ResetDashboard = 506, + EVREventType_VREvent_RenderToast = 507, + EVREventType_VREvent_ImageLoaded = 508, + EVREventType_VREvent_ShowKeyboard = 509, + EVREventType_VREvent_HideKeyboard = 510, + EVREventType_VREvent_OverlayGamepadFocusGained = 511, + EVREventType_VREvent_OverlayGamepadFocusLost = 512, + EVREventType_VREvent_OverlaySharedTextureChanged = 513, + EVREventType_VREvent_DashboardGuideButtonDown = 514, + EVREventType_VREvent_DashboardGuideButtonUp = 515, + EVREventType_VREvent_ScreenshotTriggered = 516, + EVREventType_VREvent_ImageFailed = 517, + EVREventType_VREvent_DashboardOverlayCreated = 518, + EVREventType_VREvent_RequestScreenshot = 520, + EVREventType_VREvent_ScreenshotTaken = 521, + EVREventType_VREvent_ScreenshotFailed = 522, + EVREventType_VREvent_SubmitScreenshotToDashboard = 523, + EVREventType_VREvent_ScreenshotProgressToDashboard = 524, + EVREventType_VREvent_PrimaryDashboardDeviceChanged = 525, + EVREventType_VREvent_Notification_Shown = 600, + EVREventType_VREvent_Notification_Hidden = 601, + EVREventType_VREvent_Notification_BeginInteraction = 602, + EVREventType_VREvent_Notification_Destroyed = 603, + EVREventType_VREvent_Quit = 700, + EVREventType_VREvent_ProcessQuit = 701, + EVREventType_VREvent_QuitAborted_UserPrompt = 702, + EVREventType_VREvent_QuitAcknowledged = 703, + EVREventType_VREvent_DriverRequestedQuit = 704, + EVREventType_VREvent_ChaperoneDataHasChanged = 800, + EVREventType_VREvent_ChaperoneUniverseHasChanged = 801, + EVREventType_VREvent_ChaperoneTempDataHasChanged = 802, + EVREventType_VREvent_ChaperoneSettingsHaveChanged = 803, + EVREventType_VREvent_SeatedZeroPoseReset = 804, + EVREventType_VREvent_AudioSettingsHaveChanged = 820, + EVREventType_VREvent_BackgroundSettingHasChanged = 850, + EVREventType_VREvent_CameraSettingsHaveChanged = 851, + EVREventType_VREvent_ReprojectionSettingHasChanged = 852, + EVREventType_VREvent_ModelSkinSettingsHaveChanged = 853, + EVREventType_VREvent_EnvironmentSettingsHaveChanged = 854, + EVREventType_VREvent_PowerSettingsHaveChanged = 855, + EVREventType_VREvent_EnableHomeAppSettingsHaveChanged = 856, + EVREventType_VREvent_StatusUpdate = 900, + EVREventType_VREvent_MCImageUpdated = 1000, + EVREventType_VREvent_FirmwareUpdateStarted = 1100, + EVREventType_VREvent_FirmwareUpdateFinished = 1101, + EVREventType_VREvent_KeyboardClosed = 1200, + EVREventType_VREvent_KeyboardCharInput = 1201, + EVREventType_VREvent_KeyboardDone = 1202, + EVREventType_VREvent_ApplicationTransitionStarted = 1300, + EVREventType_VREvent_ApplicationTransitionAborted = 1301, + EVREventType_VREvent_ApplicationTransitionNewAppStarted = 1302, + EVREventType_VREvent_ApplicationListUpdated = 1303, + EVREventType_VREvent_ApplicationMimeTypeLoad = 1304, + EVREventType_VREvent_ApplicationTransitionNewAppLaunchComplete = 1305, + EVREventType_VREvent_ProcessConnected = 1306, + EVREventType_VREvent_ProcessDisconnected = 1307, + EVREventType_VREvent_Compositor_MirrorWindowShown = 1400, + EVREventType_VREvent_Compositor_MirrorWindowHidden = 1401, + EVREventType_VREvent_Compositor_ChaperoneBoundsShown = 1410, + EVREventType_VREvent_Compositor_ChaperoneBoundsHidden = 1411, + EVREventType_VREvent_TrackedCamera_StartVideoStream = 1500, + EVREventType_VREvent_TrackedCamera_StopVideoStream = 1501, + EVREventType_VREvent_TrackedCamera_PauseVideoStream = 1502, + EVREventType_VREvent_TrackedCamera_ResumeVideoStream = 1503, + EVREventType_VREvent_TrackedCamera_EditingSurface = 1550, + EVREventType_VREvent_PerformanceTest_EnableCapture = 1600, + EVREventType_VREvent_PerformanceTest_DisableCapture = 1601, + EVREventType_VREvent_PerformanceTest_FidelityLevel = 1602, + EVREventType_VREvent_MessageOverlay_Closed = 1650, + EVREventType_VREvent_VendorSpecific_Reserved_Start = 10000, + EVREventType_VREvent_VendorSpecific_Reserved_End = 19999, +} EVREventType; + +typedef enum EDeviceActivityLevel +{ + EDeviceActivityLevel_k_EDeviceActivityLevel_Unknown = -1, + EDeviceActivityLevel_k_EDeviceActivityLevel_Idle = 0, + EDeviceActivityLevel_k_EDeviceActivityLevel_UserInteraction = 1, + EDeviceActivityLevel_k_EDeviceActivityLevel_UserInteraction_Timeout = 2, + EDeviceActivityLevel_k_EDeviceActivityLevel_Standby = 3, +} EDeviceActivityLevel; + +typedef enum EVRButtonId +{ + EVRButtonId_k_EButton_System = 0, + EVRButtonId_k_EButton_ApplicationMenu = 1, + EVRButtonId_k_EButton_Grip = 2, + EVRButtonId_k_EButton_DPad_Left = 3, + EVRButtonId_k_EButton_DPad_Up = 4, + EVRButtonId_k_EButton_DPad_Right = 5, + EVRButtonId_k_EButton_DPad_Down = 6, + EVRButtonId_k_EButton_A = 7, + EVRButtonId_k_EButton_ProximitySensor = 31, + EVRButtonId_k_EButton_Axis0 = 32, + EVRButtonId_k_EButton_Axis1 = 33, + EVRButtonId_k_EButton_Axis2 = 34, + EVRButtonId_k_EButton_Axis3 = 35, + EVRButtonId_k_EButton_Axis4 = 36, + EVRButtonId_k_EButton_SteamVR_Touchpad = 32, + EVRButtonId_k_EButton_SteamVR_Trigger = 33, + EVRButtonId_k_EButton_Dashboard_Back = 2, + EVRButtonId_k_EButton_Max = 64, +} EVRButtonId; + +typedef enum EVRMouseButton +{ + EVRMouseButton_VRMouseButton_Left = 1, + EVRMouseButton_VRMouseButton_Right = 2, + EVRMouseButton_VRMouseButton_Middle = 4, +} EVRMouseButton; + +typedef enum EHiddenAreaMeshType +{ + EHiddenAreaMeshType_k_eHiddenAreaMesh_Standard = 0, + EHiddenAreaMeshType_k_eHiddenAreaMesh_Inverse = 1, + EHiddenAreaMeshType_k_eHiddenAreaMesh_LineLoop = 2, + EHiddenAreaMeshType_k_eHiddenAreaMesh_Max = 3, +} EHiddenAreaMeshType; + +typedef enum EVRControllerAxisType +{ + EVRControllerAxisType_k_eControllerAxis_None = 0, + EVRControllerAxisType_k_eControllerAxis_TrackPad = 1, + EVRControllerAxisType_k_eControllerAxis_Joystick = 2, + EVRControllerAxisType_k_eControllerAxis_Trigger = 3, +} EVRControllerAxisType; + +typedef enum EVRControllerEventOutputType +{ + EVRControllerEventOutputType_ControllerEventOutput_OSEvents = 0, + EVRControllerEventOutputType_ControllerEventOutput_VREvents = 1, +} EVRControllerEventOutputType; + +typedef enum ECollisionBoundsStyle +{ + ECollisionBoundsStyle_COLLISION_BOUNDS_STYLE_BEGINNER = 0, + ECollisionBoundsStyle_COLLISION_BOUNDS_STYLE_INTERMEDIATE = 1, + ECollisionBoundsStyle_COLLISION_BOUNDS_STYLE_SQUARES = 2, + ECollisionBoundsStyle_COLLISION_BOUNDS_STYLE_ADVANCED = 3, + ECollisionBoundsStyle_COLLISION_BOUNDS_STYLE_NONE = 4, + ECollisionBoundsStyle_COLLISION_BOUNDS_STYLE_COUNT = 5, +} ECollisionBoundsStyle; + +typedef enum EVROverlayError +{ + EVROverlayError_VROverlayError_None = 0, + EVROverlayError_VROverlayError_UnknownOverlay = 10, + EVROverlayError_VROverlayError_InvalidHandle = 11, + EVROverlayError_VROverlayError_PermissionDenied = 12, + EVROverlayError_VROverlayError_OverlayLimitExceeded = 13, + EVROverlayError_VROverlayError_WrongVisibilityType = 14, + EVROverlayError_VROverlayError_KeyTooLong = 15, + EVROverlayError_VROverlayError_NameTooLong = 16, + EVROverlayError_VROverlayError_KeyInUse = 17, + EVROverlayError_VROverlayError_WrongTransformType = 18, + EVROverlayError_VROverlayError_InvalidTrackedDevice = 19, + EVROverlayError_VROverlayError_InvalidParameter = 20, + EVROverlayError_VROverlayError_ThumbnailCantBeDestroyed = 21, + EVROverlayError_VROverlayError_ArrayTooSmall = 22, + EVROverlayError_VROverlayError_RequestFailed = 23, + EVROverlayError_VROverlayError_InvalidTexture = 24, + EVROverlayError_VROverlayError_UnableToLoadFile = 25, + EVROverlayError_VROverlayError_KeyboardAlreadyInUse = 26, + EVROverlayError_VROverlayError_NoNeighbor = 27, + EVROverlayError_VROverlayError_TooManyMaskPrimitives = 29, + EVROverlayError_VROverlayError_BadMaskPrimitive = 30, +} EVROverlayError; + +typedef enum EVRApplicationType +{ + EVRApplicationType_VRApplication_Other = 0, + EVRApplicationType_VRApplication_Scene = 1, + EVRApplicationType_VRApplication_Overlay = 2, + EVRApplicationType_VRApplication_Background = 3, + EVRApplicationType_VRApplication_Utility = 4, + EVRApplicationType_VRApplication_VRMonitor = 5, + EVRApplicationType_VRApplication_SteamWatchdog = 6, + EVRApplicationType_VRApplication_Bootstrapper = 7, + EVRApplicationType_VRApplication_Max = 8, +} EVRApplicationType; + +typedef enum EVRFirmwareError +{ + EVRFirmwareError_VRFirmwareError_None = 0, + EVRFirmwareError_VRFirmwareError_Success = 1, + EVRFirmwareError_VRFirmwareError_Fail = 2, +} EVRFirmwareError; + +typedef enum EVRNotificationError +{ + EVRNotificationError_VRNotificationError_OK = 0, + EVRNotificationError_VRNotificationError_InvalidNotificationId = 100, + EVRNotificationError_VRNotificationError_NotificationQueueFull = 101, + EVRNotificationError_VRNotificationError_InvalidOverlayHandle = 102, + EVRNotificationError_VRNotificationError_SystemWithUserValueAlreadyExists = 103, +} EVRNotificationError; + +typedef enum EVRInitError +{ + EVRInitError_VRInitError_None = 0, + EVRInitError_VRInitError_Unknown = 1, + EVRInitError_VRInitError_Init_InstallationNotFound = 100, + EVRInitError_VRInitError_Init_InstallationCorrupt = 101, + EVRInitError_VRInitError_Init_VRClientDLLNotFound = 102, + EVRInitError_VRInitError_Init_FileNotFound = 103, + EVRInitError_VRInitError_Init_FactoryNotFound = 104, + EVRInitError_VRInitError_Init_InterfaceNotFound = 105, + EVRInitError_VRInitError_Init_InvalidInterface = 106, + EVRInitError_VRInitError_Init_UserConfigDirectoryInvalid = 107, + EVRInitError_VRInitError_Init_HmdNotFound = 108, + EVRInitError_VRInitError_Init_NotInitialized = 109, + EVRInitError_VRInitError_Init_PathRegistryNotFound = 110, + EVRInitError_VRInitError_Init_NoConfigPath = 111, + EVRInitError_VRInitError_Init_NoLogPath = 112, + EVRInitError_VRInitError_Init_PathRegistryNotWritable = 113, + EVRInitError_VRInitError_Init_AppInfoInitFailed = 114, + EVRInitError_VRInitError_Init_Retry = 115, + EVRInitError_VRInitError_Init_InitCanceledByUser = 116, + EVRInitError_VRInitError_Init_AnotherAppLaunching = 117, + EVRInitError_VRInitError_Init_SettingsInitFailed = 118, + EVRInitError_VRInitError_Init_ShuttingDown = 119, + EVRInitError_VRInitError_Init_TooManyObjects = 120, + EVRInitError_VRInitError_Init_NoServerForBackgroundApp = 121, + EVRInitError_VRInitError_Init_NotSupportedWithCompositor = 122, + EVRInitError_VRInitError_Init_NotAvailableToUtilityApps = 123, + EVRInitError_VRInitError_Init_Internal = 124, + EVRInitError_VRInitError_Init_HmdDriverIdIsNone = 125, + EVRInitError_VRInitError_Init_HmdNotFoundPresenceFailed = 126, + EVRInitError_VRInitError_Init_VRMonitorNotFound = 127, + EVRInitError_VRInitError_Init_VRMonitorStartupFailed = 128, + EVRInitError_VRInitError_Init_LowPowerWatchdogNotSupported = 129, + EVRInitError_VRInitError_Init_InvalidApplicationType = 130, + EVRInitError_VRInitError_Init_NotAvailableToWatchdogApps = 131, + EVRInitError_VRInitError_Init_WatchdogDisabledInSettings = 132, + EVRInitError_VRInitError_Init_VRDashboardNotFound = 133, + EVRInitError_VRInitError_Init_VRDashboardStartupFailed = 134, + EVRInitError_VRInitError_Init_VRHomeNotFound = 135, + EVRInitError_VRInitError_Init_VRHomeStartupFailed = 136, + EVRInitError_VRInitError_Driver_Failed = 200, + EVRInitError_VRInitError_Driver_Unknown = 201, + EVRInitError_VRInitError_Driver_HmdUnknown = 202, + EVRInitError_VRInitError_Driver_NotLoaded = 203, + EVRInitError_VRInitError_Driver_RuntimeOutOfDate = 204, + EVRInitError_VRInitError_Driver_HmdInUse = 205, + EVRInitError_VRInitError_Driver_NotCalibrated = 206, + EVRInitError_VRInitError_Driver_CalibrationInvalid = 207, + EVRInitError_VRInitError_Driver_HmdDisplayNotFound = 208, + EVRInitError_VRInitError_Driver_TrackedDeviceInterfaceUnknown = 209, + EVRInitError_VRInitError_Driver_HmdDriverIdOutOfBounds = 211, + EVRInitError_VRInitError_Driver_HmdDisplayMirrored = 212, + EVRInitError_VRInitError_IPC_ServerInitFailed = 300, + EVRInitError_VRInitError_IPC_ConnectFailed = 301, + EVRInitError_VRInitError_IPC_SharedStateInitFailed = 302, + EVRInitError_VRInitError_IPC_CompositorInitFailed = 303, + EVRInitError_VRInitError_IPC_MutexInitFailed = 304, + EVRInitError_VRInitError_IPC_Failed = 305, + EVRInitError_VRInitError_IPC_CompositorConnectFailed = 306, + EVRInitError_VRInitError_IPC_CompositorInvalidConnectResponse = 307, + EVRInitError_VRInitError_IPC_ConnectFailedAfterMultipleAttempts = 308, + EVRInitError_VRInitError_Compositor_Failed = 400, + EVRInitError_VRInitError_Compositor_D3D11HardwareRequired = 401, + EVRInitError_VRInitError_Compositor_FirmwareRequiresUpdate = 402, + EVRInitError_VRInitError_Compositor_OverlayInitFailed = 403, + EVRInitError_VRInitError_Compositor_ScreenshotsInitFailed = 404, + EVRInitError_VRInitError_Compositor_UnableToCreateDevice = 405, + EVRInitError_VRInitError_VendorSpecific_UnableToConnectToOculusRuntime = 1000, + EVRInitError_VRInitError_VendorSpecific_HmdFound_CantOpenDevice = 1101, + EVRInitError_VRInitError_VendorSpecific_HmdFound_UnableToRequestConfigStart = 1102, + EVRInitError_VRInitError_VendorSpecific_HmdFound_NoStoredConfig = 1103, + EVRInitError_VRInitError_VendorSpecific_HmdFound_ConfigTooBig = 1104, + EVRInitError_VRInitError_VendorSpecific_HmdFound_ConfigTooSmall = 1105, + EVRInitError_VRInitError_VendorSpecific_HmdFound_UnableToInitZLib = 1106, + EVRInitError_VRInitError_VendorSpecific_HmdFound_CantReadFirmwareVersion = 1107, + EVRInitError_VRInitError_VendorSpecific_HmdFound_UnableToSendUserDataStart = 1108, + EVRInitError_VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataStart = 1109, + EVRInitError_VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataNext = 1110, + EVRInitError_VRInitError_VendorSpecific_HmdFound_UserDataAddressRange = 1111, + EVRInitError_VRInitError_VendorSpecific_HmdFound_UserDataError = 1112, + EVRInitError_VRInitError_VendorSpecific_HmdFound_ConfigFailedSanityCheck = 1113, + EVRInitError_VRInitError_Steam_SteamInstallationNotFound = 2000, +} EVRInitError; + +typedef enum EVRScreenshotType +{ + EVRScreenshotType_VRScreenshotType_None = 0, + EVRScreenshotType_VRScreenshotType_Mono = 1, + EVRScreenshotType_VRScreenshotType_Stereo = 2, + EVRScreenshotType_VRScreenshotType_Cubemap = 3, + EVRScreenshotType_VRScreenshotType_MonoPanorama = 4, + EVRScreenshotType_VRScreenshotType_StereoPanorama = 5, +} EVRScreenshotType; + +typedef enum EVRScreenshotPropertyFilenames +{ + EVRScreenshotPropertyFilenames_VRScreenshotPropertyFilenames_Preview = 0, + EVRScreenshotPropertyFilenames_VRScreenshotPropertyFilenames_VR = 1, +} EVRScreenshotPropertyFilenames; + +typedef enum EVRTrackedCameraError +{ + EVRTrackedCameraError_VRTrackedCameraError_None = 0, + EVRTrackedCameraError_VRTrackedCameraError_OperationFailed = 100, + EVRTrackedCameraError_VRTrackedCameraError_InvalidHandle = 101, + EVRTrackedCameraError_VRTrackedCameraError_InvalidFrameHeaderVersion = 102, + EVRTrackedCameraError_VRTrackedCameraError_OutOfHandles = 103, + EVRTrackedCameraError_VRTrackedCameraError_IPCFailure = 104, + EVRTrackedCameraError_VRTrackedCameraError_NotSupportedForThisDevice = 105, + EVRTrackedCameraError_VRTrackedCameraError_SharedMemoryFailure = 106, + EVRTrackedCameraError_VRTrackedCameraError_FrameBufferingFailure = 107, + EVRTrackedCameraError_VRTrackedCameraError_StreamSetupFailure = 108, + EVRTrackedCameraError_VRTrackedCameraError_InvalidGLTextureId = 109, + EVRTrackedCameraError_VRTrackedCameraError_InvalidSharedTextureHandle = 110, + EVRTrackedCameraError_VRTrackedCameraError_FailedToGetGLTextureId = 111, + EVRTrackedCameraError_VRTrackedCameraError_SharedTextureFailure = 112, + EVRTrackedCameraError_VRTrackedCameraError_NoFrameAvailable = 113, + EVRTrackedCameraError_VRTrackedCameraError_InvalidArgument = 114, + EVRTrackedCameraError_VRTrackedCameraError_InvalidFrameBufferSize = 115, +} EVRTrackedCameraError; + +typedef enum EVRTrackedCameraFrameType +{ + EVRTrackedCameraFrameType_VRTrackedCameraFrameType_Distorted = 0, + EVRTrackedCameraFrameType_VRTrackedCameraFrameType_Undistorted = 1, + EVRTrackedCameraFrameType_VRTrackedCameraFrameType_MaximumUndistorted = 2, + EVRTrackedCameraFrameType_MAX_CAMERA_FRAME_TYPES = 3, +} EVRTrackedCameraFrameType; + +typedef enum EVRApplicationError +{ + EVRApplicationError_VRApplicationError_None = 0, + EVRApplicationError_VRApplicationError_AppKeyAlreadyExists = 100, + EVRApplicationError_VRApplicationError_NoManifest = 101, + EVRApplicationError_VRApplicationError_NoApplication = 102, + EVRApplicationError_VRApplicationError_InvalidIndex = 103, + EVRApplicationError_VRApplicationError_UnknownApplication = 104, + EVRApplicationError_VRApplicationError_IPCFailed = 105, + EVRApplicationError_VRApplicationError_ApplicationAlreadyRunning = 106, + EVRApplicationError_VRApplicationError_InvalidManifest = 107, + EVRApplicationError_VRApplicationError_InvalidApplication = 108, + EVRApplicationError_VRApplicationError_LaunchFailed = 109, + EVRApplicationError_VRApplicationError_ApplicationAlreadyStarting = 110, + EVRApplicationError_VRApplicationError_LaunchInProgress = 111, + EVRApplicationError_VRApplicationError_OldApplicationQuitting = 112, + EVRApplicationError_VRApplicationError_TransitionAborted = 113, + EVRApplicationError_VRApplicationError_IsTemplate = 114, + EVRApplicationError_VRApplicationError_BufferTooSmall = 200, + EVRApplicationError_VRApplicationError_PropertyNotSet = 201, + EVRApplicationError_VRApplicationError_UnknownProperty = 202, + EVRApplicationError_VRApplicationError_InvalidParameter = 203, +} EVRApplicationError; + +typedef enum EVRApplicationProperty +{ + EVRApplicationProperty_VRApplicationProperty_Name_String = 0, + EVRApplicationProperty_VRApplicationProperty_LaunchType_String = 11, + EVRApplicationProperty_VRApplicationProperty_WorkingDirectory_String = 12, + EVRApplicationProperty_VRApplicationProperty_BinaryPath_String = 13, + EVRApplicationProperty_VRApplicationProperty_Arguments_String = 14, + EVRApplicationProperty_VRApplicationProperty_URL_String = 15, + EVRApplicationProperty_VRApplicationProperty_Description_String = 50, + EVRApplicationProperty_VRApplicationProperty_NewsURL_String = 51, + EVRApplicationProperty_VRApplicationProperty_ImagePath_String = 52, + EVRApplicationProperty_VRApplicationProperty_Source_String = 53, + EVRApplicationProperty_VRApplicationProperty_IsDashboardOverlay_Bool = 60, + EVRApplicationProperty_VRApplicationProperty_IsTemplate_Bool = 61, + EVRApplicationProperty_VRApplicationProperty_IsInstanced_Bool = 62, + EVRApplicationProperty_VRApplicationProperty_IsInternal_Bool = 63, + EVRApplicationProperty_VRApplicationProperty_LastLaunchTime_Uint64 = 70, +} EVRApplicationProperty; + +typedef enum EVRApplicationTransitionState +{ + EVRApplicationTransitionState_VRApplicationTransition_None = 0, + EVRApplicationTransitionState_VRApplicationTransition_OldAppQuitSent = 10, + EVRApplicationTransitionState_VRApplicationTransition_WaitingForExternalLaunch = 11, + EVRApplicationTransitionState_VRApplicationTransition_NewAppLaunched = 20, +} EVRApplicationTransitionState; + +typedef enum ChaperoneCalibrationState +{ + ChaperoneCalibrationState_OK = 1, + ChaperoneCalibrationState_Warning = 100, + ChaperoneCalibrationState_Warning_BaseStationMayHaveMoved = 101, + ChaperoneCalibrationState_Warning_BaseStationRemoved = 102, + ChaperoneCalibrationState_Warning_SeatedBoundsInvalid = 103, + ChaperoneCalibrationState_Error = 200, + ChaperoneCalibrationState_Error_BaseStationUninitialized = 201, + ChaperoneCalibrationState_Error_BaseStationConflict = 202, + ChaperoneCalibrationState_Error_PlayAreaInvalid = 203, + ChaperoneCalibrationState_Error_CollisionBoundsInvalid = 204, +} ChaperoneCalibrationState; + +typedef enum EChaperoneConfigFile +{ + EChaperoneConfigFile_Live = 1, + EChaperoneConfigFile_Temp = 2, +} EChaperoneConfigFile; + +typedef enum EChaperoneImportFlags +{ + EChaperoneImportFlags_EChaperoneImport_BoundsOnly = 1, +} EChaperoneImportFlags; + +typedef enum EVRCompositorError +{ + EVRCompositorError_VRCompositorError_None = 0, + EVRCompositorError_VRCompositorError_RequestFailed = 1, + EVRCompositorError_VRCompositorError_IncompatibleVersion = 100, + EVRCompositorError_VRCompositorError_DoNotHaveFocus = 101, + EVRCompositorError_VRCompositorError_InvalidTexture = 102, + EVRCompositorError_VRCompositorError_IsNotSceneApplication = 103, + EVRCompositorError_VRCompositorError_TextureIsOnWrongDevice = 104, + EVRCompositorError_VRCompositorError_TextureUsesUnsupportedFormat = 105, + EVRCompositorError_VRCompositorError_SharedTexturesNotSupported = 106, + EVRCompositorError_VRCompositorError_IndexOutOfRange = 107, + EVRCompositorError_VRCompositorError_AlreadySubmitted = 108, +} EVRCompositorError; + +typedef enum VROverlayInputMethod +{ + VROverlayInputMethod_None = 0, + VROverlayInputMethod_Mouse = 1, +} VROverlayInputMethod; + +typedef enum VROverlayTransformType +{ + VROverlayTransformType_VROverlayTransform_Absolute = 0, + VROverlayTransformType_VROverlayTransform_TrackedDeviceRelative = 1, + VROverlayTransformType_VROverlayTransform_SystemOverlay = 2, + VROverlayTransformType_VROverlayTransform_TrackedComponent = 3, +} VROverlayTransformType; + +typedef enum VROverlayFlags +{ + VROverlayFlags_None = 0, + VROverlayFlags_Curved = 1, + VROverlayFlags_RGSS4X = 2, + VROverlayFlags_NoDashboardTab = 3, + VROverlayFlags_AcceptsGamepadEvents = 4, + VROverlayFlags_ShowGamepadFocus = 5, + VROverlayFlags_SendVRScrollEvents = 6, + VROverlayFlags_SendVRTouchpadEvents = 7, + VROverlayFlags_ShowTouchPadScrollWheel = 8, + VROverlayFlags_TransferOwnershipToInternalProcess = 9, + VROverlayFlags_SideBySide_Parallel = 10, + VROverlayFlags_SideBySide_Crossed = 11, + VROverlayFlags_Panorama = 12, + VROverlayFlags_StereoPanorama = 13, + VROverlayFlags_SortWithNonSceneOverlays = 14, + VROverlayFlags_VisibleInDashboard = 15, +} VROverlayFlags; + +typedef enum VRMessageOverlayResponse +{ + VRMessageOverlayResponse_ButtonPress_0 = 0, + VRMessageOverlayResponse_ButtonPress_1 = 1, + VRMessageOverlayResponse_ButtonPress_2 = 2, + VRMessageOverlayResponse_ButtonPress_3 = 3, + VRMessageOverlayResponse_CouldntFindSystemOverlay = 4, + VRMessageOverlayResponse_CouldntFindOrCreateClientOverlay = 5, + VRMessageOverlayResponse_ApplicationQuit = 6, +} VRMessageOverlayResponse; + +typedef enum EGamepadTextInputMode +{ + EGamepadTextInputMode_k_EGamepadTextInputModeNormal = 0, + EGamepadTextInputMode_k_EGamepadTextInputModePassword = 1, + EGamepadTextInputMode_k_EGamepadTextInputModeSubmit = 2, +} EGamepadTextInputMode; + +typedef enum EGamepadTextInputLineMode +{ + EGamepadTextInputLineMode_k_EGamepadTextInputLineModeSingleLine = 0, + EGamepadTextInputLineMode_k_EGamepadTextInputLineModeMultipleLines = 1, +} EGamepadTextInputLineMode; + +typedef enum EOverlayDirection +{ + EOverlayDirection_OverlayDirection_Up = 0, + EOverlayDirection_OverlayDirection_Down = 1, + EOverlayDirection_OverlayDirection_Left = 2, + EOverlayDirection_OverlayDirection_Right = 3, + EOverlayDirection_OverlayDirection_Count = 4, +} EOverlayDirection; + +typedef enum EVROverlayIntersectionMaskPrimitiveType +{ + EVROverlayIntersectionMaskPrimitiveType_OverlayIntersectionPrimitiveType_Rectangle = 0, + EVROverlayIntersectionMaskPrimitiveType_OverlayIntersectionPrimitiveType_Circle = 1, +} EVROverlayIntersectionMaskPrimitiveType; + +typedef enum EVRRenderModelError +{ + EVRRenderModelError_VRRenderModelError_None = 0, + EVRRenderModelError_VRRenderModelError_Loading = 100, + EVRRenderModelError_VRRenderModelError_NotSupported = 200, + EVRRenderModelError_VRRenderModelError_InvalidArg = 300, + EVRRenderModelError_VRRenderModelError_InvalidModel = 301, + EVRRenderModelError_VRRenderModelError_NoShapes = 302, + EVRRenderModelError_VRRenderModelError_MultipleShapes = 303, + EVRRenderModelError_VRRenderModelError_TooManyVertices = 304, + EVRRenderModelError_VRRenderModelError_MultipleTextures = 305, + EVRRenderModelError_VRRenderModelError_BufferTooSmall = 306, + EVRRenderModelError_VRRenderModelError_NotEnoughNormals = 307, + EVRRenderModelError_VRRenderModelError_NotEnoughTexCoords = 308, + EVRRenderModelError_VRRenderModelError_InvalidTexture = 400, +} EVRRenderModelError; + +typedef enum EVRComponentProperty +{ + EVRComponentProperty_VRComponentProperty_IsStatic = 1, + EVRComponentProperty_VRComponentProperty_IsVisible = 2, + EVRComponentProperty_VRComponentProperty_IsTouched = 4, + EVRComponentProperty_VRComponentProperty_IsPressed = 8, + EVRComponentProperty_VRComponentProperty_IsScrolled = 16, +} EVRComponentProperty; + +typedef enum EVRNotificationType +{ + EVRNotificationType_Transient = 0, + EVRNotificationType_Persistent = 1, + EVRNotificationType_Transient_SystemWithUserValue = 2, +} EVRNotificationType; + +typedef enum EVRNotificationStyle +{ + EVRNotificationStyle_None = 0, + EVRNotificationStyle_Application = 100, + EVRNotificationStyle_Contact_Disabled = 200, + EVRNotificationStyle_Contact_Enabled = 201, + EVRNotificationStyle_Contact_Active = 202, +} EVRNotificationStyle; + +typedef enum EVRSettingsError +{ + EVRSettingsError_VRSettingsError_None = 0, + EVRSettingsError_VRSettingsError_IPCFailed = 1, + EVRSettingsError_VRSettingsError_WriteFailed = 2, + EVRSettingsError_VRSettingsError_ReadFailed = 3, + EVRSettingsError_VRSettingsError_JsonParseFailed = 4, + EVRSettingsError_VRSettingsError_UnsetSettingHasNoDefault = 5, +} EVRSettingsError; + +typedef enum EVRScreenshotError +{ + EVRScreenshotError_VRScreenshotError_None = 0, + EVRScreenshotError_VRScreenshotError_RequestFailed = 1, + EVRScreenshotError_VRScreenshotError_IncompatibleVersion = 100, + EVRScreenshotError_VRScreenshotError_NotFound = 101, + EVRScreenshotError_VRScreenshotError_BufferTooSmall = 102, + EVRScreenshotError_VRScreenshotError_ScreenshotAlreadyInProgress = 108, +} EVRScreenshotError; + + +// OpenVR typedefs + +typedef uint32_t TrackedDeviceIndex_t; +typedef uint32_t VRNotificationId; +typedef uint64_t VROverlayHandle_t; + +typedef void * glSharedTextureHandle_t; +typedef int32_t glInt_t; +typedef uint32_t glUInt_t; +typedef uint64_t SharedTextureHandle_t; +typedef uint32_t DriverId_t; +typedef uint32_t TrackedDeviceIndex_t; +typedef uint64_t PropertyContainerHandle_t; +typedef uint32_t PropertyTypeTag_t; +typedef uint64_t VROverlayHandle_t; +typedef uint64_t TrackedCameraHandle_t; +typedef uint32_t ScreenshotHandle_t; +typedef uint32_t VRComponentProperties; +typedef int32_t TextureID_t; +typedef uint32_t VRNotificationId; +typedef EVRInitError HmdError; +typedef EVREye Hmd_Eye; +typedef EColorSpace ColorSpace; +typedef ETrackingResult HmdTrackingResult; +typedef ETrackedDeviceClass TrackedDeviceClass; +typedef ETrackingUniverseOrigin TrackingUniverseOrigin; +typedef ETrackedDeviceProperty TrackedDeviceProperty; +typedef ETrackedPropertyError TrackedPropertyError; +typedef EVRSubmitFlags VRSubmitFlags_t; +typedef EVRState VRState_t; +typedef ECollisionBoundsStyle CollisionBoundsStyle_t; +typedef EVROverlayError VROverlayError; +typedef EVRFirmwareError VRFirmwareError; +typedef EVRCompositorError VRCompositorError; +typedef EVRScreenshotError VRScreenshotsError; + +// OpenVR Structs + +typedef struct HmdMatrix34_t +{ + float m[3][4]; //float[3][4] +} HmdMatrix34_t; + +typedef struct HmdMatrix44_t +{ + float m[4][4]; //float[4][4] +} HmdMatrix44_t; + +typedef struct HmdVector3_t +{ + float v[3]; //float[3] +} HmdVector3_t; + +typedef struct HmdVector4_t +{ + float v[4]; //float[4] +} HmdVector4_t; + +typedef struct HmdVector3d_t +{ + double v[3]; //double[3] +} HmdVector3d_t; + +typedef struct HmdVector2_t +{ + float v[2]; //float[2] +} HmdVector2_t; + +typedef struct HmdQuaternion_t +{ + double w; + double x; + double y; + double z; +} HmdQuaternion_t; + +typedef struct HmdColor_t +{ + float r; + float g; + float b; + float a; +} HmdColor_t; + +typedef struct HmdQuad_t +{ + struct HmdVector3_t vCorners[4]; //struct vr::HmdVector3_t[4] +} HmdQuad_t; + +typedef struct HmdRect2_t +{ + struct HmdVector2_t vTopLeft; + struct HmdVector2_t vBottomRight; +} HmdRect2_t; + +typedef struct DistortionCoordinates_t +{ + float rfRed[2]; //float[2] + float rfGreen[2]; //float[2] + float rfBlue[2]; //float[2] +} DistortionCoordinates_t; + +typedef struct Texture_t +{ + void * handle; // void * + enum ETextureType eType; + enum EColorSpace eColorSpace; +} Texture_t; + +typedef struct TrackedDevicePose_t +{ + struct HmdMatrix34_t mDeviceToAbsoluteTracking; + struct HmdVector3_t vVelocity; + struct HmdVector3_t vAngularVelocity; + enum ETrackingResult eTrackingResult; + bool bPoseIsValid; + bool bDeviceIsConnected; +} TrackedDevicePose_t; + +typedef struct VRTextureBounds_t +{ + float uMin; + float vMin; + float uMax; + float vMax; +} VRTextureBounds_t; + +typedef struct VRVulkanTextureData_t +{ + uint64_t m_nImage; + struct VkDevice_T * m_pDevice; // struct VkDevice_T * + struct VkPhysicalDevice_T * m_pPhysicalDevice; // struct VkPhysicalDevice_T * + struct VkInstance_T * m_pInstance; // struct VkInstance_T * + struct VkQueue_T * m_pQueue; // struct VkQueue_T * + uint32_t m_nQueueFamilyIndex; + uint32_t m_nWidth; + uint32_t m_nHeight; + uint32_t m_nFormat; + uint32_t m_nSampleCount; +} VRVulkanTextureData_t; + +typedef struct D3D12TextureData_t +{ + struct ID3D12Resource * m_pResource; // struct ID3D12Resource * + struct ID3D12CommandQueue * m_pCommandQueue; // struct ID3D12CommandQueue * + uint32_t m_nNodeMask; +} D3D12TextureData_t; + +typedef struct VREvent_Controller_t +{ + uint32_t button; +} VREvent_Controller_t; + +typedef struct VREvent_Mouse_t +{ + float x; + float y; + uint32_t button; +} VREvent_Mouse_t; + +typedef struct VREvent_Scroll_t +{ + float xdelta; + float ydelta; + uint32_t repeatCount; +} VREvent_Scroll_t; + +typedef struct VREvent_TouchPadMove_t +{ + bool bFingerDown; + float flSecondsFingerDown; + float fValueXFirst; + float fValueYFirst; + float fValueXRaw; + float fValueYRaw; +} VREvent_TouchPadMove_t; + +typedef struct VREvent_Notification_t +{ + uint64_t ulUserValue; + uint32_t notificationId; +} VREvent_Notification_t; + +typedef struct VREvent_Process_t +{ + uint32_t pid; + uint32_t oldPid; + bool bForced; +} VREvent_Process_t; + +typedef struct VREvent_Overlay_t +{ + uint64_t overlayHandle; +} VREvent_Overlay_t; + +typedef struct VREvent_Status_t +{ + uint32_t statusState; +} VREvent_Status_t; + +typedef struct VREvent_Keyboard_t +{ + char * cNewInput[8]; //char[8] + uint64_t uUserValue; +} VREvent_Keyboard_t; + +typedef struct VREvent_Ipd_t +{ + float ipdMeters; +} VREvent_Ipd_t; + +typedef struct VREvent_Chaperone_t +{ + uint64_t m_nPreviousUniverse; + uint64_t m_nCurrentUniverse; +} VREvent_Chaperone_t; + +typedef struct VREvent_Reserved_t +{ + uint64_t reserved0; + uint64_t reserved1; +} VREvent_Reserved_t; + +typedef struct VREvent_PerformanceTest_t +{ + uint32_t m_nFidelityLevel; +} VREvent_PerformanceTest_t; + +typedef struct VREvent_SeatedZeroPoseReset_t +{ + bool bResetBySystemMenu; +} VREvent_SeatedZeroPoseReset_t; + +typedef struct VREvent_Screenshot_t +{ + uint32_t handle; + uint32_t type; +} VREvent_Screenshot_t; + +typedef struct VREvent_ScreenshotProgress_t +{ + float progress; +} VREvent_ScreenshotProgress_t; + +typedef struct VREvent_ApplicationLaunch_t +{ + uint32_t pid; + uint32_t unArgsHandle; +} VREvent_ApplicationLaunch_t; + +typedef struct VREvent_EditingCameraSurface_t +{ + uint64_t overlayHandle; + uint32_t nVisualMode; +} VREvent_EditingCameraSurface_t; + +typedef struct VREvent_MessageOverlay_t +{ + uint32_t unVRMessageOverlayResponse; +} VREvent_MessageOverlay_t; + +typedef struct VREvent_Property_t +{ + PropertyContainerHandle_t container; + enum ETrackedDeviceProperty prop; +} VREvent_Property_t; + +typedef struct HiddenAreaMesh_t +{ + struct HmdVector2_t * pVertexData; // const struct vr::HmdVector2_t * + uint32_t unTriangleCount; +} HiddenAreaMesh_t; + +typedef struct VRControllerAxis_t +{ + float x; + float y; +} VRControllerAxis_t; + +typedef struct VRControllerState_t +{ + uint32_t unPacketNum; + uint64_t ulButtonPressed; + uint64_t ulButtonTouched; + struct VRControllerAxis_t rAxis[5]; //struct vr::VRControllerAxis_t[5] +} VRControllerState_t; + +typedef struct Compositor_OverlaySettings +{ + uint32_t size; + bool curved; + bool antialias; + float scale; + float distance; + float alpha; + float uOffset; + float vOffset; + float uScale; + float vScale; + float gridDivs; + float gridWidth; + float gridScale; + struct HmdMatrix44_t transform; +} Compositor_OverlaySettings; + +typedef struct CameraVideoStreamFrameHeader_t +{ + enum EVRTrackedCameraFrameType eFrameType; + uint32_t nWidth; + uint32_t nHeight; + uint32_t nBytesPerPixel; + uint32_t nFrameSequence; + struct TrackedDevicePose_t standingTrackedDevicePose; +} CameraVideoStreamFrameHeader_t; + +typedef struct AppOverrideKeys_t +{ + char * pchKey; // const char * + char * pchValue; // const char * +} AppOverrideKeys_t; + +typedef struct Compositor_FrameTiming +{ + uint32_t m_nSize; + uint32_t m_nFrameIndex; + uint32_t m_nNumFramePresents; + uint32_t m_nNumMisPresented; + uint32_t m_nNumDroppedFrames; + uint32_t m_nReprojectionFlags; + double m_flSystemTimeInSeconds; + float m_flPreSubmitGpuMs; + float m_flPostSubmitGpuMs; + float m_flTotalRenderGpuMs; + float m_flCompositorRenderGpuMs; + float m_flCompositorRenderCpuMs; + float m_flCompositorIdleCpuMs; + float m_flClientFrameIntervalMs; + float m_flPresentCallCpuMs; + float m_flWaitForPresentCpuMs; + float m_flSubmitFrameMs; + float m_flWaitGetPosesCalledMs; + float m_flNewPosesReadyMs; + float m_flNewFrameReadyMs; + float m_flCompositorUpdateStartMs; + float m_flCompositorUpdateEndMs; + float m_flCompositorRenderStartMs; + TrackedDevicePose_t m_HmdPose; +} Compositor_FrameTiming; + +typedef struct Compositor_CumulativeStats +{ + uint32_t m_nPid; + uint32_t m_nNumFramePresents; + uint32_t m_nNumDroppedFrames; + uint32_t m_nNumReprojectedFrames; + uint32_t m_nNumFramePresentsOnStartup; + uint32_t m_nNumDroppedFramesOnStartup; + uint32_t m_nNumReprojectedFramesOnStartup; + uint32_t m_nNumLoading; + uint32_t m_nNumFramePresentsLoading; + uint32_t m_nNumDroppedFramesLoading; + uint32_t m_nNumReprojectedFramesLoading; + uint32_t m_nNumTimedOut; + uint32_t m_nNumFramePresentsTimedOut; + uint32_t m_nNumDroppedFramesTimedOut; + uint32_t m_nNumReprojectedFramesTimedOut; +} Compositor_CumulativeStats; + +typedef struct VROverlayIntersectionParams_t +{ + struct HmdVector3_t vSource; + struct HmdVector3_t vDirection; + enum ETrackingUniverseOrigin eOrigin; +} VROverlayIntersectionParams_t; + +typedef struct VROverlayIntersectionResults_t +{ + struct HmdVector3_t vPoint; + struct HmdVector3_t vNormal; + struct HmdVector2_t vUVs; + float fDistance; +} VROverlayIntersectionResults_t; + +typedef struct IntersectionMaskRectangle_t +{ + float m_flTopLeftX; + float m_flTopLeftY; + float m_flWidth; + float m_flHeight; +} IntersectionMaskRectangle_t; + +typedef struct IntersectionMaskCircle_t +{ + float m_flCenterX; + float m_flCenterY; + float m_flRadius; +} IntersectionMaskCircle_t; + +typedef struct RenderModel_ComponentState_t +{ + struct HmdMatrix34_t mTrackingToComponentRenderModel; + struct HmdMatrix34_t mTrackingToComponentLocal; + VRComponentProperties uProperties; +} RenderModel_ComponentState_t; + +typedef struct RenderModel_Vertex_t +{ + struct HmdVector3_t vPosition; + struct HmdVector3_t vNormal; + float rfTextureCoord[2]; //float[2] +} RenderModel_Vertex_t; + +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( push, 4 ) +#endif +typedef struct RenderModel_TextureMap_t +{ + uint16_t unWidth; + uint16_t unHeight; + uint8_t * rubTextureMapData; // const uint8_t * +} RenderModel_TextureMap_t; + +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( pop ) +#endif +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( push, 4 ) +#endif +typedef struct RenderModel_t +{ + struct RenderModel_Vertex_t * rVertexData; // const struct vr::RenderModel_Vertex_t * + uint32_t unVertexCount; + uint16_t * rIndexData; // const uint16_t * + uint32_t unTriangleCount; + TextureID_t diffuseTextureId; +} RenderModel_t; + +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( pop ) +#endif +typedef struct RenderModel_ControllerMode_State_t +{ + bool bScrollWheelVisible; +} RenderModel_ControllerMode_State_t; + +typedef struct NotificationBitmap_t +{ + void * m_pImageData; // void * + int32_t m_nWidth; + int32_t m_nHeight; + int32_t m_nBytesPerPixel; +} NotificationBitmap_t; + +typedef struct COpenVRContext +{ + intptr_t m_pVRSystem; // class vr::IVRSystem * + intptr_t m_pVRChaperone; // class vr::IVRChaperone * + intptr_t m_pVRChaperoneSetup; // class vr::IVRChaperoneSetup * + intptr_t m_pVRCompositor; // class vr::IVRCompositor * + intptr_t m_pVROverlay; // class vr::IVROverlay * + intptr_t m_pVRResources; // class vr::IVRResources * + intptr_t m_pVRRenderModels; // class vr::IVRRenderModels * + intptr_t m_pVRExtendedDisplay; // class vr::IVRExtendedDisplay * + intptr_t m_pVRSettings; // class vr::IVRSettings * + intptr_t m_pVRApplications; // class vr::IVRApplications * + intptr_t m_pVRTrackedCamera; // class vr::IVRTrackedCamera * + intptr_t m_pVRScreenshots; // class vr::IVRScreenshots * + intptr_t m_pVRDriverManager; // class vr::IVRDriverManager * +} COpenVRContext; + + +typedef union +{ + VREvent_Reserved_t reserved; + VREvent_Controller_t controller; + VREvent_Mouse_t mouse; + VREvent_Scroll_t scroll; + VREvent_Process_t process; + VREvent_Notification_t notification; + VREvent_Overlay_t overlay; + VREvent_Status_t status; + VREvent_Keyboard_t keyboard; + VREvent_Ipd_t ipd; + VREvent_Chaperone_t chaperone; + VREvent_PerformanceTest_t performanceTest; + VREvent_TouchPadMove_t touchPadMove; + VREvent_SeatedZeroPoseReset_t seatedZeroPoseReset; +} VREvent_Data_t; + +/** An event posted by the server to all running applications */ +struct VREvent_t +{ + uint32_t eventType; // EVREventType enum + TrackedDeviceIndex_t trackedDeviceIndex; + float eventAgeSeconds; + // event data must be the end of the struct as its size is variable + VREvent_Data_t data; +}; + + +typedef union +{ + IntersectionMaskRectangle_t m_Rectangle; + IntersectionMaskCircle_t m_Circle; +} VROverlayIntersectionMaskPrimitive_Data_t; + +struct VROverlayIntersectionMaskPrimitive_t +{ + EVROverlayIntersectionMaskPrimitiveType m_nPrimitiveType; + VROverlayIntersectionMaskPrimitive_Data_t m_Primitive; +}; + + +// OpenVR Function Pointer Tables + +struct VR_IVRSystem_FnTable +{ + void (OPENVR_FNTABLE_CALLTYPE *GetRecommendedRenderTargetSize)(uint32_t * pnWidth, uint32_t * pnHeight); + struct HmdMatrix44_t (OPENVR_FNTABLE_CALLTYPE *GetProjectionMatrix)(EVREye eEye, float fNearZ, float fFarZ); + void (OPENVR_FNTABLE_CALLTYPE *GetProjectionRaw)(EVREye eEye, float * pfLeft, float * pfRight, float * pfTop, float * pfBottom); + bool (OPENVR_FNTABLE_CALLTYPE *ComputeDistortion)(EVREye eEye, float fU, float fV, struct DistortionCoordinates_t * pDistortionCoordinates); + struct HmdMatrix34_t (OPENVR_FNTABLE_CALLTYPE *GetEyeToHeadTransform)(EVREye eEye); + bool (OPENVR_FNTABLE_CALLTYPE *GetTimeSinceLastVsync)(float * pfSecondsSinceLastVsync, uint64_t * pulFrameCounter); + int32_t (OPENVR_FNTABLE_CALLTYPE *GetD3D9AdapterIndex)(); + void (OPENVR_FNTABLE_CALLTYPE *GetDXGIOutputInfo)(int32_t * pnAdapterIndex); + void (OPENVR_FNTABLE_CALLTYPE *GetOutputDevice)(uint64_t * pnDevice, ETextureType textureType); + bool (OPENVR_FNTABLE_CALLTYPE *IsDisplayOnDesktop)(); + bool (OPENVR_FNTABLE_CALLTYPE *SetDisplayVisibility)(bool bIsVisibleOnDesktop); + void (OPENVR_FNTABLE_CALLTYPE *GetDeviceToAbsoluteTrackingPose)(ETrackingUniverseOrigin eOrigin, float fPredictedSecondsToPhotonsFromNow, struct TrackedDevicePose_t * pTrackedDevicePoseArray, uint32_t unTrackedDevicePoseArrayCount); + void (OPENVR_FNTABLE_CALLTYPE *ResetSeatedZeroPose)(); + struct HmdMatrix34_t (OPENVR_FNTABLE_CALLTYPE *GetSeatedZeroPoseToStandingAbsoluteTrackingPose)(); + struct HmdMatrix34_t (OPENVR_FNTABLE_CALLTYPE *GetRawZeroPoseToStandingAbsoluteTrackingPose)(); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetSortedTrackedDeviceIndicesOfClass)(ETrackedDeviceClass eTrackedDeviceClass, TrackedDeviceIndex_t * punTrackedDeviceIndexArray, uint32_t unTrackedDeviceIndexArrayCount, TrackedDeviceIndex_t unRelativeToTrackedDeviceIndex); + EDeviceActivityLevel (OPENVR_FNTABLE_CALLTYPE *GetTrackedDeviceActivityLevel)(TrackedDeviceIndex_t unDeviceId); + void (OPENVR_FNTABLE_CALLTYPE *ApplyTransform)(struct TrackedDevicePose_t * pOutputPose, struct TrackedDevicePose_t * pTrackedDevicePose, struct HmdMatrix34_t * pTransform); + TrackedDeviceIndex_t (OPENVR_FNTABLE_CALLTYPE *GetTrackedDeviceIndexForControllerRole)(ETrackedControllerRole unDeviceType); + ETrackedControllerRole (OPENVR_FNTABLE_CALLTYPE *GetControllerRoleForTrackedDeviceIndex)(TrackedDeviceIndex_t unDeviceIndex); + ETrackedDeviceClass (OPENVR_FNTABLE_CALLTYPE *GetTrackedDeviceClass)(TrackedDeviceIndex_t unDeviceIndex); + bool (OPENVR_FNTABLE_CALLTYPE *IsTrackedDeviceConnected)(TrackedDeviceIndex_t unDeviceIndex); + bool (OPENVR_FNTABLE_CALLTYPE *GetBoolTrackedDeviceProperty)(TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError * pError); + float (OPENVR_FNTABLE_CALLTYPE *GetFloatTrackedDeviceProperty)(TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError * pError); + int32_t (OPENVR_FNTABLE_CALLTYPE *GetInt32TrackedDeviceProperty)(TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError * pError); + uint64_t (OPENVR_FNTABLE_CALLTYPE *GetUint64TrackedDeviceProperty)(TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError * pError); + struct HmdMatrix34_t (OPENVR_FNTABLE_CALLTYPE *GetMatrix34TrackedDeviceProperty)(TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError * pError); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetStringTrackedDeviceProperty)(TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, char * pchValue, uint32_t unBufferSize, ETrackedPropertyError * pError); + char * (OPENVR_FNTABLE_CALLTYPE *GetPropErrorNameFromEnum)(ETrackedPropertyError error); + bool (OPENVR_FNTABLE_CALLTYPE *PollNextEvent)(struct VREvent_t * pEvent, uint32_t uncbVREvent); + bool (OPENVR_FNTABLE_CALLTYPE *PollNextEventWithPose)(ETrackingUniverseOrigin eOrigin, struct VREvent_t * pEvent, uint32_t uncbVREvent, TrackedDevicePose_t * pTrackedDevicePose); + char * (OPENVR_FNTABLE_CALLTYPE *GetEventTypeNameFromEnum)(EVREventType eType); + struct HiddenAreaMesh_t (OPENVR_FNTABLE_CALLTYPE *GetHiddenAreaMesh)(EVREye eEye, EHiddenAreaMeshType type); + bool (OPENVR_FNTABLE_CALLTYPE *GetControllerState)(TrackedDeviceIndex_t unControllerDeviceIndex, VRControllerState_t * pControllerState, uint32_t unControllerStateSize); + bool (OPENVR_FNTABLE_CALLTYPE *GetControllerStateWithPose)(ETrackingUniverseOrigin eOrigin, TrackedDeviceIndex_t unControllerDeviceIndex, VRControllerState_t * pControllerState, uint32_t unControllerStateSize, struct TrackedDevicePose_t * pTrackedDevicePose); + void (OPENVR_FNTABLE_CALLTYPE *TriggerHapticPulse)(TrackedDeviceIndex_t unControllerDeviceIndex, uint32_t unAxisId, unsigned short usDurationMicroSec); + char * (OPENVR_FNTABLE_CALLTYPE *GetButtonIdNameFromEnum)(EVRButtonId eButtonId); + char * (OPENVR_FNTABLE_CALLTYPE *GetControllerAxisTypeNameFromEnum)(EVRControllerAxisType eAxisType); + bool (OPENVR_FNTABLE_CALLTYPE *CaptureInputFocus)(); + void (OPENVR_FNTABLE_CALLTYPE *ReleaseInputFocus)(); + bool (OPENVR_FNTABLE_CALLTYPE *IsInputFocusCapturedByAnotherProcess)(); + uint32_t (OPENVR_FNTABLE_CALLTYPE *DriverDebugRequest)(TrackedDeviceIndex_t unDeviceIndex, char * pchRequest, char * pchResponseBuffer, uint32_t unResponseBufferSize); + EVRFirmwareError (OPENVR_FNTABLE_CALLTYPE *PerformFirmwareUpdate)(TrackedDeviceIndex_t unDeviceIndex); + void (OPENVR_FNTABLE_CALLTYPE *AcknowledgeQuit_Exiting)(); + void (OPENVR_FNTABLE_CALLTYPE *AcknowledgeQuit_UserPrompt)(); +}; + +struct VR_IVRExtendedDisplay_FnTable +{ + void (OPENVR_FNTABLE_CALLTYPE *GetWindowBounds)(int32_t * pnX, int32_t * pnY, uint32_t * pnWidth, uint32_t * pnHeight); + void (OPENVR_FNTABLE_CALLTYPE *GetEyeOutputViewport)(EVREye eEye, uint32_t * pnX, uint32_t * pnY, uint32_t * pnWidth, uint32_t * pnHeight); + void (OPENVR_FNTABLE_CALLTYPE *GetDXGIOutputInfo)(int32_t * pnAdapterIndex, int32_t * pnAdapterOutputIndex); +}; + +struct VR_IVRTrackedCamera_FnTable +{ + char * (OPENVR_FNTABLE_CALLTYPE *GetCameraErrorNameFromEnum)(EVRTrackedCameraError eCameraError); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *HasCamera)(TrackedDeviceIndex_t nDeviceIndex, bool * pHasCamera); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *GetCameraFrameSize)(TrackedDeviceIndex_t nDeviceIndex, EVRTrackedCameraFrameType eFrameType, uint32_t * pnWidth, uint32_t * pnHeight, uint32_t * pnFrameBufferSize); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *GetCameraIntrinsics)(TrackedDeviceIndex_t nDeviceIndex, EVRTrackedCameraFrameType eFrameType, HmdVector2_t * pFocalLength, HmdVector2_t * pCenter); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *GetCameraProjection)(TrackedDeviceIndex_t nDeviceIndex, EVRTrackedCameraFrameType eFrameType, float flZNear, float flZFar, HmdMatrix44_t * pProjection); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *AcquireVideoStreamingService)(TrackedDeviceIndex_t nDeviceIndex, TrackedCameraHandle_t * pHandle); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *ReleaseVideoStreamingService)(TrackedCameraHandle_t hTrackedCamera); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *GetVideoStreamFrameBuffer)(TrackedCameraHandle_t hTrackedCamera, EVRTrackedCameraFrameType eFrameType, void * pFrameBuffer, uint32_t nFrameBufferSize, CameraVideoStreamFrameHeader_t * pFrameHeader, uint32_t nFrameHeaderSize); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *GetVideoStreamTextureSize)(TrackedDeviceIndex_t nDeviceIndex, EVRTrackedCameraFrameType eFrameType, VRTextureBounds_t * pTextureBounds, uint32_t * pnWidth, uint32_t * pnHeight); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *GetVideoStreamTextureD3D11)(TrackedCameraHandle_t hTrackedCamera, EVRTrackedCameraFrameType eFrameType, void * pD3D11DeviceOrResource, void ** ppD3D11ShaderResourceView, CameraVideoStreamFrameHeader_t * pFrameHeader, uint32_t nFrameHeaderSize); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *GetVideoStreamTextureGL)(TrackedCameraHandle_t hTrackedCamera, EVRTrackedCameraFrameType eFrameType, glUInt_t * pglTextureId, CameraVideoStreamFrameHeader_t * pFrameHeader, uint32_t nFrameHeaderSize); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *ReleaseVideoStreamTextureGL)(TrackedCameraHandle_t hTrackedCamera, glUInt_t glTextureId); +}; + +struct VR_IVRApplications_FnTable +{ + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *AddApplicationManifest)(char * pchApplicationManifestFullPath, bool bTemporary); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *RemoveApplicationManifest)(char * pchApplicationManifestFullPath); + bool (OPENVR_FNTABLE_CALLTYPE *IsApplicationInstalled)(char * pchAppKey); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetApplicationCount)(); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *GetApplicationKeyByIndex)(uint32_t unApplicationIndex, char * pchAppKeyBuffer, uint32_t unAppKeyBufferLen); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *GetApplicationKeyByProcessId)(uint32_t unProcessId, char * pchAppKeyBuffer, uint32_t unAppKeyBufferLen); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *LaunchApplication)(char * pchAppKey); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *LaunchTemplateApplication)(char * pchTemplateAppKey, char * pchNewAppKey, struct AppOverrideKeys_t * pKeys, uint32_t unKeys); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *LaunchApplicationFromMimeType)(char * pchMimeType, char * pchArgs); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *LaunchDashboardOverlay)(char * pchAppKey); + bool (OPENVR_FNTABLE_CALLTYPE *CancelApplicationLaunch)(char * pchAppKey); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *IdentifyApplication)(uint32_t unProcessId, char * pchAppKey); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetApplicationProcessId)(char * pchAppKey); + char * (OPENVR_FNTABLE_CALLTYPE *GetApplicationsErrorNameFromEnum)(EVRApplicationError error); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetApplicationPropertyString)(char * pchAppKey, EVRApplicationProperty eProperty, char * pchPropertyValueBuffer, uint32_t unPropertyValueBufferLen, EVRApplicationError * peError); + bool (OPENVR_FNTABLE_CALLTYPE *GetApplicationPropertyBool)(char * pchAppKey, EVRApplicationProperty eProperty, EVRApplicationError * peError); + uint64_t (OPENVR_FNTABLE_CALLTYPE *GetApplicationPropertyUint64)(char * pchAppKey, EVRApplicationProperty eProperty, EVRApplicationError * peError); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *SetApplicationAutoLaunch)(char * pchAppKey, bool bAutoLaunch); + bool (OPENVR_FNTABLE_CALLTYPE *GetApplicationAutoLaunch)(char * pchAppKey); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *SetDefaultApplicationForMimeType)(char * pchAppKey, char * pchMimeType); + bool (OPENVR_FNTABLE_CALLTYPE *GetDefaultApplicationForMimeType)(char * pchMimeType, char * pchAppKeyBuffer, uint32_t unAppKeyBufferLen); + bool (OPENVR_FNTABLE_CALLTYPE *GetApplicationSupportedMimeTypes)(char * pchAppKey, char * pchMimeTypesBuffer, uint32_t unMimeTypesBuffer); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetApplicationsThatSupportMimeType)(char * pchMimeType, char * pchAppKeysThatSupportBuffer, uint32_t unAppKeysThatSupportBuffer); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetApplicationLaunchArguments)(uint32_t unHandle, char * pchArgs, uint32_t unArgs); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *GetStartingApplication)(char * pchAppKeyBuffer, uint32_t unAppKeyBufferLen); + EVRApplicationTransitionState (OPENVR_FNTABLE_CALLTYPE *GetTransitionState)(); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *PerformApplicationPrelaunchCheck)(char * pchAppKey); + char * (OPENVR_FNTABLE_CALLTYPE *GetApplicationsTransitionStateNameFromEnum)(EVRApplicationTransitionState state); + bool (OPENVR_FNTABLE_CALLTYPE *IsQuitUserPromptRequested)(); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *LaunchInternalProcess)(char * pchBinaryPath, char * pchArguments, char * pchWorkingDirectory); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetCurrentSceneProcessId)(); +}; + +struct VR_IVRChaperone_FnTable +{ + ChaperoneCalibrationState (OPENVR_FNTABLE_CALLTYPE *GetCalibrationState)(); + bool (OPENVR_FNTABLE_CALLTYPE *GetPlayAreaSize)(float * pSizeX, float * pSizeZ); + bool (OPENVR_FNTABLE_CALLTYPE *GetPlayAreaRect)(struct HmdQuad_t * rect); + void (OPENVR_FNTABLE_CALLTYPE *ReloadInfo)(); + void (OPENVR_FNTABLE_CALLTYPE *SetSceneColor)(struct HmdColor_t color); + void (OPENVR_FNTABLE_CALLTYPE *GetBoundsColor)(struct HmdColor_t * pOutputColorArray, int nNumOutputColors, float flCollisionBoundsFadeDistance, struct HmdColor_t * pOutputCameraColor); + bool (OPENVR_FNTABLE_CALLTYPE *AreBoundsVisible)(); + void (OPENVR_FNTABLE_CALLTYPE *ForceBoundsVisible)(bool bForce); +}; + +struct VR_IVRChaperoneSetup_FnTable +{ + bool (OPENVR_FNTABLE_CALLTYPE *CommitWorkingCopy)(EChaperoneConfigFile configFile); + void (OPENVR_FNTABLE_CALLTYPE *RevertWorkingCopy)(); + bool (OPENVR_FNTABLE_CALLTYPE *GetWorkingPlayAreaSize)(float * pSizeX, float * pSizeZ); + bool (OPENVR_FNTABLE_CALLTYPE *GetWorkingPlayAreaRect)(struct HmdQuad_t * rect); + bool (OPENVR_FNTABLE_CALLTYPE *GetWorkingCollisionBoundsInfo)(struct HmdQuad_t * pQuadsBuffer, uint32_t * punQuadsCount); + bool (OPENVR_FNTABLE_CALLTYPE *GetLiveCollisionBoundsInfo)(struct HmdQuad_t * pQuadsBuffer, uint32_t * punQuadsCount); + bool (OPENVR_FNTABLE_CALLTYPE *GetWorkingSeatedZeroPoseToRawTrackingPose)(struct HmdMatrix34_t * pmatSeatedZeroPoseToRawTrackingPose); + bool (OPENVR_FNTABLE_CALLTYPE *GetWorkingStandingZeroPoseToRawTrackingPose)(struct HmdMatrix34_t * pmatStandingZeroPoseToRawTrackingPose); + void (OPENVR_FNTABLE_CALLTYPE *SetWorkingPlayAreaSize)(float sizeX, float sizeZ); + void (OPENVR_FNTABLE_CALLTYPE *SetWorkingCollisionBoundsInfo)(struct HmdQuad_t * pQuadsBuffer, uint32_t unQuadsCount); + void (OPENVR_FNTABLE_CALLTYPE *SetWorkingSeatedZeroPoseToRawTrackingPose)(struct HmdMatrix34_t * pMatSeatedZeroPoseToRawTrackingPose); + void (OPENVR_FNTABLE_CALLTYPE *SetWorkingStandingZeroPoseToRawTrackingPose)(struct HmdMatrix34_t * pMatStandingZeroPoseToRawTrackingPose); + void (OPENVR_FNTABLE_CALLTYPE *ReloadFromDisk)(EChaperoneConfigFile configFile); + bool (OPENVR_FNTABLE_CALLTYPE *GetLiveSeatedZeroPoseToRawTrackingPose)(struct HmdMatrix34_t * pmatSeatedZeroPoseToRawTrackingPose); + void (OPENVR_FNTABLE_CALLTYPE *SetWorkingCollisionBoundsTagsInfo)(uint8_t * pTagsBuffer, uint32_t unTagCount); + bool (OPENVR_FNTABLE_CALLTYPE *GetLiveCollisionBoundsTagsInfo)(uint8_t * pTagsBuffer, uint32_t * punTagCount); + bool (OPENVR_FNTABLE_CALLTYPE *SetWorkingPhysicalBoundsInfo)(struct HmdQuad_t * pQuadsBuffer, uint32_t unQuadsCount); + bool (OPENVR_FNTABLE_CALLTYPE *GetLivePhysicalBoundsInfo)(struct HmdQuad_t * pQuadsBuffer, uint32_t * punQuadsCount); + bool (OPENVR_FNTABLE_CALLTYPE *ExportLiveToBuffer)(char * pBuffer, uint32_t * pnBufferLength); + bool (OPENVR_FNTABLE_CALLTYPE *ImportFromBufferToWorking)(char * pBuffer, uint32_t nImportFlags); +}; + +struct VR_IVRCompositor_FnTable +{ + void (OPENVR_FNTABLE_CALLTYPE *SetTrackingSpace)(ETrackingUniverseOrigin eOrigin); + ETrackingUniverseOrigin (OPENVR_FNTABLE_CALLTYPE *GetTrackingSpace)(); + EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *WaitGetPoses)(struct TrackedDevicePose_t * pRenderPoseArray, uint32_t unRenderPoseArrayCount, struct TrackedDevicePose_t * pGamePoseArray, uint32_t unGamePoseArrayCount); + EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *GetLastPoses)(struct TrackedDevicePose_t * pRenderPoseArray, uint32_t unRenderPoseArrayCount, struct TrackedDevicePose_t * pGamePoseArray, uint32_t unGamePoseArrayCount); + EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *GetLastPoseForTrackedDeviceIndex)(TrackedDeviceIndex_t unDeviceIndex, struct TrackedDevicePose_t * pOutputPose, struct TrackedDevicePose_t * pOutputGamePose); + EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *Submit)(EVREye eEye, struct Texture_t * pTexture, struct VRTextureBounds_t * pBounds, EVRSubmitFlags nSubmitFlags); + void (OPENVR_FNTABLE_CALLTYPE *ClearLastSubmittedFrame)(); + void (OPENVR_FNTABLE_CALLTYPE *PostPresentHandoff)(); + bool (OPENVR_FNTABLE_CALLTYPE *GetFrameTiming)(struct Compositor_FrameTiming * pTiming, uint32_t unFramesAgo); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetFrameTimings)(struct Compositor_FrameTiming * pTiming, uint32_t nFrames); + float (OPENVR_FNTABLE_CALLTYPE *GetFrameTimeRemaining)(); + void (OPENVR_FNTABLE_CALLTYPE *GetCumulativeStats)(struct Compositor_CumulativeStats * pStats, uint32_t nStatsSizeInBytes); + void (OPENVR_FNTABLE_CALLTYPE *FadeToColor)(float fSeconds, float fRed, float fGreen, float fBlue, float fAlpha, bool bBackground); + struct HmdColor_t (OPENVR_FNTABLE_CALLTYPE *GetCurrentFadeColor)(bool bBackground); + void (OPENVR_FNTABLE_CALLTYPE *FadeGrid)(float fSeconds, bool bFadeIn); + float (OPENVR_FNTABLE_CALLTYPE *GetCurrentGridAlpha)(); + EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *SetSkyboxOverride)(struct Texture_t * pTextures, uint32_t unTextureCount); + void (OPENVR_FNTABLE_CALLTYPE *ClearSkyboxOverride)(); + void (OPENVR_FNTABLE_CALLTYPE *CompositorBringToFront)(); + void (OPENVR_FNTABLE_CALLTYPE *CompositorGoToBack)(); + void (OPENVR_FNTABLE_CALLTYPE *CompositorQuit)(); + bool (OPENVR_FNTABLE_CALLTYPE *IsFullscreen)(); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetCurrentSceneFocusProcess)(); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetLastFrameRenderer)(); + bool (OPENVR_FNTABLE_CALLTYPE *CanRenderScene)(); + void (OPENVR_FNTABLE_CALLTYPE *ShowMirrorWindow)(); + void (OPENVR_FNTABLE_CALLTYPE *HideMirrorWindow)(); + bool (OPENVR_FNTABLE_CALLTYPE *IsMirrorWindowVisible)(); + void (OPENVR_FNTABLE_CALLTYPE *CompositorDumpImages)(); + bool (OPENVR_FNTABLE_CALLTYPE *ShouldAppRenderWithLowResources)(); + void (OPENVR_FNTABLE_CALLTYPE *ForceInterleavedReprojectionOn)(bool bOverride); + void (OPENVR_FNTABLE_CALLTYPE *ForceReconnectProcess)(); + void (OPENVR_FNTABLE_CALLTYPE *SuspendRendering)(bool bSuspend); + EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *GetMirrorTextureD3D11)(EVREye eEye, void * pD3D11DeviceOrResource, void ** ppD3D11ShaderResourceView); + void (OPENVR_FNTABLE_CALLTYPE *ReleaseMirrorTextureD3D11)(void * pD3D11ShaderResourceView); + EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *GetMirrorTextureGL)(EVREye eEye, glUInt_t * pglTextureId, glSharedTextureHandle_t * pglSharedTextureHandle); + bool (OPENVR_FNTABLE_CALLTYPE *ReleaseSharedGLTexture)(glUInt_t glTextureId, glSharedTextureHandle_t glSharedTextureHandle); + void (OPENVR_FNTABLE_CALLTYPE *LockGLSharedTextureForAccess)(glSharedTextureHandle_t glSharedTextureHandle); + void (OPENVR_FNTABLE_CALLTYPE *UnlockGLSharedTextureForAccess)(glSharedTextureHandle_t glSharedTextureHandle); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetVulkanInstanceExtensionsRequired)(char * pchValue, uint32_t unBufferSize); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetVulkanDeviceExtensionsRequired)(struct VkPhysicalDevice_T * pPhysicalDevice, char * pchValue, uint32_t unBufferSize); +}; + +struct VR_IVROverlay_FnTable +{ + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *FindOverlay)(char * pchOverlayKey, VROverlayHandle_t * pOverlayHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *CreateOverlay)(char * pchOverlayKey, char * pchOverlayName, VROverlayHandle_t * pOverlayHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *DestroyOverlay)(VROverlayHandle_t ulOverlayHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetHighQualityOverlay)(VROverlayHandle_t ulOverlayHandle); + VROverlayHandle_t (OPENVR_FNTABLE_CALLTYPE *GetHighQualityOverlay)(); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetOverlayKey)(VROverlayHandle_t ulOverlayHandle, char * pchValue, uint32_t unBufferSize, EVROverlayError * pError); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetOverlayName)(VROverlayHandle_t ulOverlayHandle, char * pchValue, uint32_t unBufferSize, EVROverlayError * pError); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayName)(VROverlayHandle_t ulOverlayHandle, char * pchName); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayImageData)(VROverlayHandle_t ulOverlayHandle, void * pvBuffer, uint32_t unBufferSize, uint32_t * punWidth, uint32_t * punHeight); + char * (OPENVR_FNTABLE_CALLTYPE *GetOverlayErrorNameFromEnum)(EVROverlayError error); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayRenderingPid)(VROverlayHandle_t ulOverlayHandle, uint32_t unPID); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetOverlayRenderingPid)(VROverlayHandle_t ulOverlayHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayFlag)(VROverlayHandle_t ulOverlayHandle, VROverlayFlags eOverlayFlag, bool bEnabled); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayFlag)(VROverlayHandle_t ulOverlayHandle, VROverlayFlags eOverlayFlag, bool * pbEnabled); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayColor)(VROverlayHandle_t ulOverlayHandle, float fRed, float fGreen, float fBlue); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayColor)(VROverlayHandle_t ulOverlayHandle, float * pfRed, float * pfGreen, float * pfBlue); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayAlpha)(VROverlayHandle_t ulOverlayHandle, float fAlpha); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayAlpha)(VROverlayHandle_t ulOverlayHandle, float * pfAlpha); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayTexelAspect)(VROverlayHandle_t ulOverlayHandle, float fTexelAspect); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTexelAspect)(VROverlayHandle_t ulOverlayHandle, float * pfTexelAspect); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlaySortOrder)(VROverlayHandle_t ulOverlayHandle, uint32_t unSortOrder); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlaySortOrder)(VROverlayHandle_t ulOverlayHandle, uint32_t * punSortOrder); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayWidthInMeters)(VROverlayHandle_t ulOverlayHandle, float fWidthInMeters); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayWidthInMeters)(VROverlayHandle_t ulOverlayHandle, float * pfWidthInMeters); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayAutoCurveDistanceRangeInMeters)(VROverlayHandle_t ulOverlayHandle, float fMinDistanceInMeters, float fMaxDistanceInMeters); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayAutoCurveDistanceRangeInMeters)(VROverlayHandle_t ulOverlayHandle, float * pfMinDistanceInMeters, float * pfMaxDistanceInMeters); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayTextureColorSpace)(VROverlayHandle_t ulOverlayHandle, EColorSpace eTextureColorSpace); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTextureColorSpace)(VROverlayHandle_t ulOverlayHandle, EColorSpace * peTextureColorSpace); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayTextureBounds)(VROverlayHandle_t ulOverlayHandle, struct VRTextureBounds_t * pOverlayTextureBounds); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTextureBounds)(VROverlayHandle_t ulOverlayHandle, struct VRTextureBounds_t * pOverlayTextureBounds); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetOverlayRenderModel)(VROverlayHandle_t ulOverlayHandle, char * pchValue, uint32_t unBufferSize, struct HmdColor_t * pColor, EVROverlayError * pError); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayRenderModel)(VROverlayHandle_t ulOverlayHandle, char * pchRenderModel, struct HmdColor_t * pColor); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTransformType)(VROverlayHandle_t ulOverlayHandle, VROverlayTransformType * peTransformType); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayTransformAbsolute)(VROverlayHandle_t ulOverlayHandle, ETrackingUniverseOrigin eTrackingOrigin, struct HmdMatrix34_t * pmatTrackingOriginToOverlayTransform); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTransformAbsolute)(VROverlayHandle_t ulOverlayHandle, ETrackingUniverseOrigin * peTrackingOrigin, struct HmdMatrix34_t * pmatTrackingOriginToOverlayTransform); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayTransformTrackedDeviceRelative)(VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t unTrackedDevice, struct HmdMatrix34_t * pmatTrackedDeviceToOverlayTransform); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTransformTrackedDeviceRelative)(VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t * punTrackedDevice, struct HmdMatrix34_t * pmatTrackedDeviceToOverlayTransform); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayTransformTrackedDeviceComponent)(VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t unDeviceIndex, char * pchComponentName); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTransformTrackedDeviceComponent)(VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t * punDeviceIndex, char * pchComponentName, uint32_t unComponentNameSize); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTransformOverlayRelative)(VROverlayHandle_t ulOverlayHandle, VROverlayHandle_t * ulOverlayHandleParent, struct HmdMatrix34_t * pmatParentOverlayToOverlayTransform); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayTransformOverlayRelative)(VROverlayHandle_t ulOverlayHandle, VROverlayHandle_t ulOverlayHandleParent, struct HmdMatrix34_t * pmatParentOverlayToOverlayTransform); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *ShowOverlay)(VROverlayHandle_t ulOverlayHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *HideOverlay)(VROverlayHandle_t ulOverlayHandle); + bool (OPENVR_FNTABLE_CALLTYPE *IsOverlayVisible)(VROverlayHandle_t ulOverlayHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetTransformForOverlayCoordinates)(VROverlayHandle_t ulOverlayHandle, ETrackingUniverseOrigin eTrackingOrigin, struct HmdVector2_t coordinatesInOverlay, struct HmdMatrix34_t * pmatTransform); + bool (OPENVR_FNTABLE_CALLTYPE *PollNextOverlayEvent)(VROverlayHandle_t ulOverlayHandle, struct VREvent_t * pEvent, uint32_t uncbVREvent); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayInputMethod)(VROverlayHandle_t ulOverlayHandle, VROverlayInputMethod * peInputMethod); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayInputMethod)(VROverlayHandle_t ulOverlayHandle, VROverlayInputMethod eInputMethod); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayMouseScale)(VROverlayHandle_t ulOverlayHandle, struct HmdVector2_t * pvecMouseScale); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayMouseScale)(VROverlayHandle_t ulOverlayHandle, struct HmdVector2_t * pvecMouseScale); + bool (OPENVR_FNTABLE_CALLTYPE *ComputeOverlayIntersection)(VROverlayHandle_t ulOverlayHandle, struct VROverlayIntersectionParams_t * pParams, struct VROverlayIntersectionResults_t * pResults); + bool (OPENVR_FNTABLE_CALLTYPE *HandleControllerOverlayInteractionAsMouse)(VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t unControllerDeviceIndex); + bool (OPENVR_FNTABLE_CALLTYPE *IsHoverTargetOverlay)(VROverlayHandle_t ulOverlayHandle); + VROverlayHandle_t (OPENVR_FNTABLE_CALLTYPE *GetGamepadFocusOverlay)(); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetGamepadFocusOverlay)(VROverlayHandle_t ulNewFocusOverlay); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayNeighbor)(EOverlayDirection eDirection, VROverlayHandle_t ulFrom, VROverlayHandle_t ulTo); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *MoveGamepadFocusToNeighbor)(EOverlayDirection eDirection, VROverlayHandle_t ulFrom); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayTexture)(VROverlayHandle_t ulOverlayHandle, struct Texture_t * pTexture); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *ClearOverlayTexture)(VROverlayHandle_t ulOverlayHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayRaw)(VROverlayHandle_t ulOverlayHandle, void * pvBuffer, uint32_t unWidth, uint32_t unHeight, uint32_t unDepth); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayFromFile)(VROverlayHandle_t ulOverlayHandle, char * pchFilePath); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTexture)(VROverlayHandle_t ulOverlayHandle, void ** pNativeTextureHandle, void * pNativeTextureRef, uint32_t * pWidth, uint32_t * pHeight, uint32_t * pNativeFormat, ETextureType * pAPIType, EColorSpace * pColorSpace, struct VRTextureBounds_t * pTextureBounds); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *ReleaseNativeOverlayHandle)(VROverlayHandle_t ulOverlayHandle, void * pNativeTextureHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTextureSize)(VROverlayHandle_t ulOverlayHandle, uint32_t * pWidth, uint32_t * pHeight); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *CreateDashboardOverlay)(char * pchOverlayKey, char * pchOverlayFriendlyName, VROverlayHandle_t * pMainHandle, VROverlayHandle_t * pThumbnailHandle); + bool (OPENVR_FNTABLE_CALLTYPE *IsDashboardVisible)(); + bool (OPENVR_FNTABLE_CALLTYPE *IsActiveDashboardOverlay)(VROverlayHandle_t ulOverlayHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetDashboardOverlaySceneProcess)(VROverlayHandle_t ulOverlayHandle, uint32_t unProcessId); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetDashboardOverlaySceneProcess)(VROverlayHandle_t ulOverlayHandle, uint32_t * punProcessId); + void (OPENVR_FNTABLE_CALLTYPE *ShowDashboard)(char * pchOverlayToShow); + TrackedDeviceIndex_t (OPENVR_FNTABLE_CALLTYPE *GetPrimaryDashboardDevice)(); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *ShowKeyboard)(EGamepadTextInputMode eInputMode, EGamepadTextInputLineMode eLineInputMode, char * pchDescription, uint32_t unCharMax, char * pchExistingText, bool bUseMinimalMode, uint64_t uUserValue); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *ShowKeyboardForOverlay)(VROverlayHandle_t ulOverlayHandle, EGamepadTextInputMode eInputMode, EGamepadTextInputLineMode eLineInputMode, char * pchDescription, uint32_t unCharMax, char * pchExistingText, bool bUseMinimalMode, uint64_t uUserValue); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetKeyboardText)(char * pchText, uint32_t cchText); + void (OPENVR_FNTABLE_CALLTYPE *HideKeyboard)(); + void (OPENVR_FNTABLE_CALLTYPE *SetKeyboardTransformAbsolute)(ETrackingUniverseOrigin eTrackingOrigin, struct HmdMatrix34_t * pmatTrackingOriginToKeyboardTransform); + void (OPENVR_FNTABLE_CALLTYPE *SetKeyboardPositionForOverlay)(VROverlayHandle_t ulOverlayHandle, struct HmdRect2_t avoidRect); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayIntersectionMask)(VROverlayHandle_t ulOverlayHandle, struct VROverlayIntersectionMaskPrimitive_t * pMaskPrimitives, uint32_t unNumMaskPrimitives, uint32_t unPrimitiveSize); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayFlags)(VROverlayHandle_t ulOverlayHandle, uint32_t * pFlags); + VRMessageOverlayResponse (OPENVR_FNTABLE_CALLTYPE *ShowMessageOverlay)(char * pchText, char * pchCaption, char * pchButton0Text, char * pchButton1Text, char * pchButton2Text, char * pchButton3Text); +}; + +struct VR_IVRRenderModels_FnTable +{ + EVRRenderModelError (OPENVR_FNTABLE_CALLTYPE *LoadRenderModel_Async)(char * pchRenderModelName, struct RenderModel_t ** ppRenderModel); + void (OPENVR_FNTABLE_CALLTYPE *FreeRenderModel)(struct RenderModel_t * pRenderModel); + EVRRenderModelError (OPENVR_FNTABLE_CALLTYPE *LoadTexture_Async)(TextureID_t textureId, struct RenderModel_TextureMap_t ** ppTexture); + void (OPENVR_FNTABLE_CALLTYPE *FreeTexture)(struct RenderModel_TextureMap_t * pTexture); + EVRRenderModelError (OPENVR_FNTABLE_CALLTYPE *LoadTextureD3D11_Async)(TextureID_t textureId, void * pD3D11Device, void ** ppD3D11Texture2D); + EVRRenderModelError (OPENVR_FNTABLE_CALLTYPE *LoadIntoTextureD3D11_Async)(TextureID_t textureId, void * pDstTexture); + void (OPENVR_FNTABLE_CALLTYPE *FreeTextureD3D11)(void * pD3D11Texture2D); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetRenderModelName)(uint32_t unRenderModelIndex, char * pchRenderModelName, uint32_t unRenderModelNameLen); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetRenderModelCount)(); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetComponentCount)(char * pchRenderModelName); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetComponentName)(char * pchRenderModelName, uint32_t unComponentIndex, char * pchComponentName, uint32_t unComponentNameLen); + uint64_t (OPENVR_FNTABLE_CALLTYPE *GetComponentButtonMask)(char * pchRenderModelName, char * pchComponentName); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetComponentRenderModelName)(char * pchRenderModelName, char * pchComponentName, char * pchComponentRenderModelName, uint32_t unComponentRenderModelNameLen); + bool (OPENVR_FNTABLE_CALLTYPE *GetComponentState)(char * pchRenderModelName, char * pchComponentName, VRControllerState_t * pControllerState, struct RenderModel_ControllerMode_State_t * pState, struct RenderModel_ComponentState_t * pComponentState); + bool (OPENVR_FNTABLE_CALLTYPE *RenderModelHasComponent)(char * pchRenderModelName, char * pchComponentName); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetRenderModelThumbnailURL)(char * pchRenderModelName, char * pchThumbnailURL, uint32_t unThumbnailURLLen, EVRRenderModelError * peError); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetRenderModelOriginalPath)(char * pchRenderModelName, char * pchOriginalPath, uint32_t unOriginalPathLen, EVRRenderModelError * peError); + char * (OPENVR_FNTABLE_CALLTYPE *GetRenderModelErrorNameFromEnum)(EVRRenderModelError error); +}; + +struct VR_IVRNotifications_FnTable +{ + EVRNotificationError (OPENVR_FNTABLE_CALLTYPE *CreateNotification)(VROverlayHandle_t ulOverlayHandle, uint64_t ulUserValue, EVRNotificationType type, char * pchText, EVRNotificationStyle style, struct NotificationBitmap_t * pImage, VRNotificationId * pNotificationId); + EVRNotificationError (OPENVR_FNTABLE_CALLTYPE *RemoveNotification)(VRNotificationId notificationId); +}; + +struct VR_IVRSettings_FnTable +{ + char * (OPENVR_FNTABLE_CALLTYPE *GetSettingsErrorNameFromEnum)(EVRSettingsError eError); + bool (OPENVR_FNTABLE_CALLTYPE *Sync)(bool bForce, EVRSettingsError * peError); + void (OPENVR_FNTABLE_CALLTYPE *SetBool)(char * pchSection, char * pchSettingsKey, bool bValue, EVRSettingsError * peError); + void (OPENVR_FNTABLE_CALLTYPE *SetInt32)(char * pchSection, char * pchSettingsKey, int32_t nValue, EVRSettingsError * peError); + void (OPENVR_FNTABLE_CALLTYPE *SetFloat)(char * pchSection, char * pchSettingsKey, float flValue, EVRSettingsError * peError); + void (OPENVR_FNTABLE_CALLTYPE *SetString)(char * pchSection, char * pchSettingsKey, char * pchValue, EVRSettingsError * peError); + bool (OPENVR_FNTABLE_CALLTYPE *GetBool)(char * pchSection, char * pchSettingsKey, EVRSettingsError * peError); + int32_t (OPENVR_FNTABLE_CALLTYPE *GetInt32)(char * pchSection, char * pchSettingsKey, EVRSettingsError * peError); + float (OPENVR_FNTABLE_CALLTYPE *GetFloat)(char * pchSection, char * pchSettingsKey, EVRSettingsError * peError); + void (OPENVR_FNTABLE_CALLTYPE *GetString)(char * pchSection, char * pchSettingsKey, char * pchValue, uint32_t unValueLen, EVRSettingsError * peError); + void (OPENVR_FNTABLE_CALLTYPE *RemoveSection)(char * pchSection, EVRSettingsError * peError); + void (OPENVR_FNTABLE_CALLTYPE *RemoveKeyInSection)(char * pchSection, char * pchSettingsKey, EVRSettingsError * peError); +}; + +struct VR_IVRScreenshots_FnTable +{ + EVRScreenshotError (OPENVR_FNTABLE_CALLTYPE *RequestScreenshot)(ScreenshotHandle_t * pOutScreenshotHandle, EVRScreenshotType type, char * pchPreviewFilename, char * pchVRFilename); + EVRScreenshotError (OPENVR_FNTABLE_CALLTYPE *HookScreenshot)(EVRScreenshotType * pSupportedTypes, int numTypes); + EVRScreenshotType (OPENVR_FNTABLE_CALLTYPE *GetScreenshotPropertyType)(ScreenshotHandle_t screenshotHandle, EVRScreenshotError * pError); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetScreenshotPropertyFilename)(ScreenshotHandle_t screenshotHandle, EVRScreenshotPropertyFilenames filenameType, char * pchFilename, uint32_t cchFilename, EVRScreenshotError * pError); + EVRScreenshotError (OPENVR_FNTABLE_CALLTYPE *UpdateScreenshotProgress)(ScreenshotHandle_t screenshotHandle, float flProgress); + EVRScreenshotError (OPENVR_FNTABLE_CALLTYPE *TakeStereoScreenshot)(ScreenshotHandle_t * pOutScreenshotHandle, char * pchPreviewFilename, char * pchVRFilename); + EVRScreenshotError (OPENVR_FNTABLE_CALLTYPE *SubmitScreenshot)(ScreenshotHandle_t screenshotHandle, EVRScreenshotType type, char * pchSourcePreviewFilename, char * pchSourceVRFilename); +}; + +struct VR_IVRResources_FnTable +{ + uint32_t (OPENVR_FNTABLE_CALLTYPE *LoadSharedResource)(char * pchResourceName, char * pchBuffer, uint32_t unBufferLen); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetResourceFullPath)(char * pchResourceName, char * pchResourceTypeDirectory, char * pchPathBuffer, uint32_t unBufferLen); +}; + +struct VR_IVRDriverManager_FnTable +{ + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetDriverCount)(); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetDriverName)(DriverId_t nDriver, char * pchValue, uint32_t unBufferSize); +}; + + +#if 0 +// Global entry points +S_API intptr_t VR_InitInternal( EVRInitError *peError, EVRApplicationType eType ); +S_API void VR_ShutdownInternal(); +S_API bool VR_IsHmdPresent(); +S_API intptr_t VR_GetGenericInterface( const char *pchInterfaceVersion, EVRInitError *peError ); +S_API bool VR_IsRuntimeInstalled(); +S_API const char * VR_GetVRInitErrorAsSymbol( EVRInitError error ); +S_API const char * VR_GetVRInitErrorAsEnglishDescription( EVRInitError error ); +#endif + +#endif // __OPENVR_API_FLAT_H__ + + diff --git a/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Headers/openvr_driver.h b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Headers/openvr_driver.h new file mode 100644 index 000000000..bfe24c003 --- /dev/null +++ b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Headers/openvr_driver.h @@ -0,0 +1,2677 @@ +#pragma once + +// openvr_driver.h +//========= Copyright Valve Corporation ============// +// Dynamically generated file. Do not modify this file directly. + +#ifndef _OPENVR_DRIVER_API +#define _OPENVR_DRIVER_API + +#include + + + +// vrtypes.h +#ifndef _INCLUDE_VRTYPES_H +#define _INCLUDE_VRTYPES_H + +// Forward declarations to avoid requiring vulkan.h +struct VkDevice_T; +struct VkPhysicalDevice_T; +struct VkInstance_T; +struct VkQueue_T; + +// Forward declarations to avoid requiring d3d12.h +struct ID3D12Resource; +struct ID3D12CommandQueue; + +namespace vr +{ +#pragma pack( push, 8 ) + +typedef void* glSharedTextureHandle_t; +typedef int32_t glInt_t; +typedef uint32_t glUInt_t; + +// right-handed system +// +y is up +// +x is to the right +// -z is going away from you +// Distance unit is meters +struct HmdMatrix34_t +{ + float m[3][4]; +}; + +struct HmdMatrix44_t +{ + float m[4][4]; +}; + +struct HmdVector3_t +{ + float v[3]; +}; + +struct HmdVector4_t +{ + float v[4]; +}; + +struct HmdVector3d_t +{ + double v[3]; +}; + +struct HmdVector2_t +{ + float v[2]; +}; + +struct HmdQuaternion_t +{ + double w, x, y, z; +}; + +struct HmdColor_t +{ + float r, g, b, a; +}; + +struct HmdQuad_t +{ + HmdVector3_t vCorners[ 4 ]; +}; + +struct HmdRect2_t +{ + HmdVector2_t vTopLeft; + HmdVector2_t vBottomRight; +}; + +/** Used to return the post-distortion UVs for each color channel. +* UVs range from 0 to 1 with 0,0 in the upper left corner of the +* source render target. The 0,0 to 1,1 range covers a single eye. */ +struct DistortionCoordinates_t +{ + float rfRed[2]; + float rfGreen[2]; + float rfBlue[2]; +}; + +enum EVREye +{ + Eye_Left = 0, + Eye_Right = 1 +}; + +enum ETextureType +{ + TextureType_DirectX = 0, // Handle is an ID3D11Texture + TextureType_OpenGL = 1, // Handle is an OpenGL texture name or an OpenGL render buffer name, depending on submit flags + TextureType_Vulkan = 2, // Handle is a pointer to a VRVulkanTextureData_t structure + TextureType_IOSurface = 3, // Handle is a macOS cross-process-sharable IOSurfaceRef + TextureType_DirectX12 = 4, // Handle is a pointer to a D3D12TextureData_t structure +}; + +enum EColorSpace +{ + ColorSpace_Auto = 0, // Assumes 'gamma' for 8-bit per component formats, otherwise 'linear'. This mirrors the DXGI formats which have _SRGB variants. + ColorSpace_Gamma = 1, // Texture data can be displayed directly on the display without any conversion (a.k.a. display native format). + ColorSpace_Linear = 2, // Same as gamma but has been converted to a linear representation using DXGI's sRGB conversion algorithm. +}; + +struct Texture_t +{ + void* handle; // See ETextureType definition above + ETextureType eType; + EColorSpace eColorSpace; +}; + +// Handle to a shared texture (HANDLE on Windows obtained using OpenSharedResource). +typedef uint64_t SharedTextureHandle_t; +#define INVALID_SHARED_TEXTURE_HANDLE ((vr::SharedTextureHandle_t)0) + +enum ETrackingResult +{ + TrackingResult_Uninitialized = 1, + + TrackingResult_Calibrating_InProgress = 100, + TrackingResult_Calibrating_OutOfRange = 101, + + TrackingResult_Running_OK = 200, + TrackingResult_Running_OutOfRange = 201, +}; + +typedef uint32_t DriverId_t; +static const uint32_t k_nDriverNone = 0xFFFFFFFF; + +static const uint32_t k_unMaxDriverDebugResponseSize = 32768; + +/** Used to pass device IDs to API calls */ +typedef uint32_t TrackedDeviceIndex_t; +static const uint32_t k_unTrackedDeviceIndex_Hmd = 0; +static const uint32_t k_unMaxTrackedDeviceCount = 16; +static const uint32_t k_unTrackedDeviceIndexOther = 0xFFFFFFFE; +static const uint32_t k_unTrackedDeviceIndexInvalid = 0xFFFFFFFF; + +/** Describes what kind of object is being tracked at a given ID */ +enum ETrackedDeviceClass +{ + TrackedDeviceClass_Invalid = 0, // the ID was not valid. + TrackedDeviceClass_HMD = 1, // Head-Mounted Displays + TrackedDeviceClass_Controller = 2, // Tracked controllers + TrackedDeviceClass_GenericTracker = 3, // Generic trackers, similar to controllers + TrackedDeviceClass_TrackingReference = 4, // Camera and base stations that serve as tracking reference points + TrackedDeviceClass_DisplayRedirect = 5, // Accessories that aren't necessarily tracked themselves, but may redirect video output from other tracked devices +}; + + +/** Describes what specific role associated with a tracked device */ +enum ETrackedControllerRole +{ + TrackedControllerRole_Invalid = 0, // Invalid value for controller type + TrackedControllerRole_LeftHand = 1, // Tracked device associated with the left hand + TrackedControllerRole_RightHand = 2, // Tracked device associated with the right hand +}; + + +/** describes a single pose for a tracked object */ +struct TrackedDevicePose_t +{ + HmdMatrix34_t mDeviceToAbsoluteTracking; + HmdVector3_t vVelocity; // velocity in tracker space in m/s + HmdVector3_t vAngularVelocity; // angular velocity in radians/s (?) + ETrackingResult eTrackingResult; + bool bPoseIsValid; + + // This indicates that there is a device connected for this spot in the pose array. + // It could go from true to false if the user unplugs the device. + bool bDeviceIsConnected; +}; + +/** Identifies which style of tracking origin the application wants to use +* for the poses it is requesting */ +enum ETrackingUniverseOrigin +{ + TrackingUniverseSeated = 0, // Poses are provided relative to the seated zero pose + TrackingUniverseStanding = 1, // Poses are provided relative to the safe bounds configured by the user + 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. +}; + +// Refers to a single container of properties +typedef uint64_t PropertyContainerHandle_t; +typedef uint32_t PropertyTypeTag_t; + +static const PropertyContainerHandle_t k_ulInvalidPropertyContainer = 0; +static const PropertyTypeTag_t k_unInvalidPropertyTag = 0; + +// Use these tags to set/get common types as struct properties +static const PropertyTypeTag_t k_unFloatPropertyTag = 1; +static const PropertyTypeTag_t k_unInt32PropertyTag = 2; +static const PropertyTypeTag_t k_unUint64PropertyTag = 3; +static const PropertyTypeTag_t k_unBoolPropertyTag = 4; +static const PropertyTypeTag_t k_unStringPropertyTag = 5; + +static const PropertyTypeTag_t k_unHmdMatrix34PropertyTag = 20; +static const PropertyTypeTag_t k_unHmdMatrix44PropertyTag = 21; +static const PropertyTypeTag_t k_unHmdVector3PropertyTag = 22; +static const PropertyTypeTag_t k_unHmdVector4PropertyTag = 23; + +static const PropertyTypeTag_t k_unHiddenAreaPropertyTag = 30; + +static const PropertyTypeTag_t k_unOpenVRInternalReserved_Start = 1000; +static const PropertyTypeTag_t k_unOpenVRInternalReserved_End = 10000; + + +/** Each entry in this enum represents a property that can be retrieved about a +* tracked device. Many fields are only valid for one ETrackedDeviceClass. */ +enum ETrackedDeviceProperty +{ + Prop_Invalid = 0, + + // general properties that apply to all device classes + Prop_TrackingSystemName_String = 1000, + Prop_ModelNumber_String = 1001, + Prop_SerialNumber_String = 1002, + Prop_RenderModelName_String = 1003, + Prop_WillDriftInYaw_Bool = 1004, + Prop_ManufacturerName_String = 1005, + Prop_TrackingFirmwareVersion_String = 1006, + Prop_HardwareRevision_String = 1007, + Prop_AllWirelessDongleDescriptions_String = 1008, + Prop_ConnectedWirelessDongle_String = 1009, + Prop_DeviceIsWireless_Bool = 1010, + Prop_DeviceIsCharging_Bool = 1011, + Prop_DeviceBatteryPercentage_Float = 1012, // 0 is empty, 1 is full + Prop_StatusDisplayTransform_Matrix34 = 1013, + Prop_Firmware_UpdateAvailable_Bool = 1014, + Prop_Firmware_ManualUpdate_Bool = 1015, + Prop_Firmware_ManualUpdateURL_String = 1016, + Prop_HardwareRevision_Uint64 = 1017, + Prop_FirmwareVersion_Uint64 = 1018, + Prop_FPGAVersion_Uint64 = 1019, + Prop_VRCVersion_Uint64 = 1020, + Prop_RadioVersion_Uint64 = 1021, + Prop_DongleVersion_Uint64 = 1022, + Prop_BlockServerShutdown_Bool = 1023, + Prop_CanUnifyCoordinateSystemWithHmd_Bool = 1024, + Prop_ContainsProximitySensor_Bool = 1025, + Prop_DeviceProvidesBatteryStatus_Bool = 1026, + Prop_DeviceCanPowerOff_Bool = 1027, + Prop_Firmware_ProgrammingTarget_String = 1028, + Prop_DeviceClass_Int32 = 1029, + Prop_HasCamera_Bool = 1030, + Prop_DriverVersion_String = 1031, + Prop_Firmware_ForceUpdateRequired_Bool = 1032, + Prop_ViveSystemButtonFixRequired_Bool = 1033, + Prop_ParentDriver_Uint64 = 1034, + Prop_ResourceRoot_String = 1035, + + // Properties that are unique to TrackedDeviceClass_HMD + Prop_ReportsTimeSinceVSync_Bool = 2000, + Prop_SecondsFromVsyncToPhotons_Float = 2001, + Prop_DisplayFrequency_Float = 2002, + Prop_UserIpdMeters_Float = 2003, + Prop_CurrentUniverseId_Uint64 = 2004, + Prop_PreviousUniverseId_Uint64 = 2005, + Prop_DisplayFirmwareVersion_Uint64 = 2006, + Prop_IsOnDesktop_Bool = 2007, + Prop_DisplayMCType_Int32 = 2008, + Prop_DisplayMCOffset_Float = 2009, + Prop_DisplayMCScale_Float = 2010, + Prop_EdidVendorID_Int32 = 2011, + Prop_DisplayMCImageLeft_String = 2012, + Prop_DisplayMCImageRight_String = 2013, + Prop_DisplayGCBlackClamp_Float = 2014, + Prop_EdidProductID_Int32 = 2015, + Prop_CameraToHeadTransform_Matrix34 = 2016, + Prop_DisplayGCType_Int32 = 2017, + Prop_DisplayGCOffset_Float = 2018, + Prop_DisplayGCScale_Float = 2019, + Prop_DisplayGCPrescale_Float = 2020, + Prop_DisplayGCImage_String = 2021, + Prop_LensCenterLeftU_Float = 2022, + Prop_LensCenterLeftV_Float = 2023, + Prop_LensCenterRightU_Float = 2024, + Prop_LensCenterRightV_Float = 2025, + Prop_UserHeadToEyeDepthMeters_Float = 2026, + Prop_CameraFirmwareVersion_Uint64 = 2027, + Prop_CameraFirmwareDescription_String = 2028, + Prop_DisplayFPGAVersion_Uint64 = 2029, + Prop_DisplayBootloaderVersion_Uint64 = 2030, + Prop_DisplayHardwareVersion_Uint64 = 2031, + Prop_AudioFirmwareVersion_Uint64 = 2032, + Prop_CameraCompatibilityMode_Int32 = 2033, + Prop_ScreenshotHorizontalFieldOfViewDegrees_Float = 2034, + Prop_ScreenshotVerticalFieldOfViewDegrees_Float = 2035, + Prop_DisplaySuppressed_Bool = 2036, + Prop_DisplayAllowNightMode_Bool = 2037, + Prop_DisplayMCImageWidth_Int32 = 2038, + Prop_DisplayMCImageHeight_Int32 = 2039, + Prop_DisplayMCImageNumChannels_Int32 = 2040, + Prop_DisplayMCImageData_Binary = 2041, + Prop_SecondsFromPhotonsToVblank_Float = 2042, + Prop_DriverDirectModeSendsVsyncEvents_Bool = 2043, + Prop_DisplayDebugMode_Bool = 2044, + Prop_GraphicsAdapterLuid_Uint64 = 2045, + + // Properties that are unique to TrackedDeviceClass_Controller + Prop_AttachedDeviceId_String = 3000, + Prop_SupportedButtons_Uint64 = 3001, + Prop_Axis0Type_Int32 = 3002, // Return value is of type EVRControllerAxisType + Prop_Axis1Type_Int32 = 3003, // Return value is of type EVRControllerAxisType + Prop_Axis2Type_Int32 = 3004, // Return value is of type EVRControllerAxisType + Prop_Axis3Type_Int32 = 3005, // Return value is of type EVRControllerAxisType + Prop_Axis4Type_Int32 = 3006, // Return value is of type EVRControllerAxisType + Prop_ControllerRoleHint_Int32 = 3007, // Return value is of type ETrackedControllerRole + + // Properties that are unique to TrackedDeviceClass_TrackingReference + Prop_FieldOfViewLeftDegrees_Float = 4000, + Prop_FieldOfViewRightDegrees_Float = 4001, + Prop_FieldOfViewTopDegrees_Float = 4002, + Prop_FieldOfViewBottomDegrees_Float = 4003, + Prop_TrackingRangeMinimumMeters_Float = 4004, + Prop_TrackingRangeMaximumMeters_Float = 4005, + Prop_ModeLabel_String = 4006, + + // Properties that are used for user interface like icons names + Prop_IconPathName_String = 5000, // DEPRECATED. Value not referenced. Now expected to be part of icon path properties. + Prop_NamedIconPathDeviceOff_String = 5001, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceSearching_String = 5002, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceSearchingAlert_String = 5003, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceReady_String = 5004, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceReadyAlert_String = 5005, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceNotReady_String = 5006, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceStandby_String = 5007, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceAlertLow_String = 5008, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + + // Properties that are used by helpers, but are opaque to applications + Prop_DisplayHiddenArea_Binary_Start = 5100, + Prop_DisplayHiddenArea_Binary_End = 5150, + + // Properties that are unique to drivers + Prop_UserConfigPath_String = 6000, + Prop_InstallPath_String = 6001, + Prop_HasDisplayComponent_Bool = 6002, + Prop_HasControllerComponent_Bool = 6003, + Prop_HasCameraComponent_Bool = 6004, + Prop_HasDriverDirectModeComponent_Bool = 6005, + Prop_HasVirtualDisplayComponent_Bool = 6006, + + // Vendors are free to expose private debug data in this reserved region + Prop_VendorSpecific_Reserved_Start = 10000, + Prop_VendorSpecific_Reserved_End = 10999, +}; + +/** No string property will ever be longer than this length */ +static const uint32_t k_unMaxPropertyStringSize = 32 * 1024; + +/** Used to return errors that occur when reading properties. */ +enum ETrackedPropertyError +{ + TrackedProp_Success = 0, + TrackedProp_WrongDataType = 1, + TrackedProp_WrongDeviceClass = 2, + TrackedProp_BufferTooSmall = 3, + TrackedProp_UnknownProperty = 4, // Driver has not set the property (and may not ever). + TrackedProp_InvalidDevice = 5, + TrackedProp_CouldNotContactServer = 6, + TrackedProp_ValueNotProvidedByDevice = 7, + TrackedProp_StringExceedsMaximumLength = 8, + TrackedProp_NotYetAvailable = 9, // The property value isn't known yet, but is expected soon. Call again later. + TrackedProp_PermissionDenied = 10, + TrackedProp_InvalidOperation = 11, +}; + +/** Allows the application to control what part of the provided texture will be used in the +* frame buffer. */ +struct VRTextureBounds_t +{ + float uMin, vMin; + float uMax, vMax; +}; + + +/** Allows the application to control how scene textures are used by the compositor when calling Submit. */ +enum EVRSubmitFlags +{ + // Simple render path. App submits rendered left and right eye images with no lens distortion correction applied. + Submit_Default = 0x00, + + // App submits final left and right eye images with lens distortion already applied (lens distortion makes the images appear + // barrel distorted with chromatic aberration correction applied). The app would have used the data returned by + // vr::IVRSystem::ComputeDistortion() to apply the correct distortion to the rendered images before calling Submit(). + Submit_LensDistortionAlreadyApplied = 0x01, + + // If the texture pointer passed in is actually a renderbuffer (e.g. for MSAA in OpenGL) then set this flag. + Submit_GlRenderBuffer = 0x02, + + // Do not use + Submit_Reserved = 0x04, +}; + +/** Data required for passing Vulkan textures to IVRCompositor::Submit. +* Be sure to call OpenVR_Shutdown before destroying these resources. */ +struct VRVulkanTextureData_t +{ + uint64_t m_nImage; // VkImage + VkDevice_T *m_pDevice; + VkPhysicalDevice_T *m_pPhysicalDevice; + VkInstance_T *m_pInstance; + VkQueue_T *m_pQueue; + uint32_t m_nQueueFamilyIndex; + uint32_t m_nWidth, m_nHeight, m_nFormat, m_nSampleCount; +}; + +/** Data required for passing D3D12 textures to IVRCompositor::Submit. +* Be sure to call OpenVR_Shutdown before destroying these resources. */ +struct D3D12TextureData_t +{ + ID3D12Resource *m_pResource; + ID3D12CommandQueue *m_pCommandQueue; + uint32_t m_nNodeMask; +}; + +/** Status of the overall system or tracked objects */ +enum EVRState +{ + VRState_Undefined = -1, + VRState_Off = 0, + VRState_Searching = 1, + VRState_Searching_Alert = 2, + VRState_Ready = 3, + VRState_Ready_Alert = 4, + VRState_NotReady = 5, + VRState_Standby = 6, + VRState_Ready_Alert_Low = 7, +}; + +/** The types of events that could be posted (and what the parameters mean for each event type) */ +enum EVREventType +{ + VREvent_None = 0, + + VREvent_TrackedDeviceActivated = 100, + VREvent_TrackedDeviceDeactivated = 101, + VREvent_TrackedDeviceUpdated = 102, + VREvent_TrackedDeviceUserInteractionStarted = 103, + VREvent_TrackedDeviceUserInteractionEnded = 104, + VREvent_IpdChanged = 105, + VREvent_EnterStandbyMode = 106, + VREvent_LeaveStandbyMode = 107, + VREvent_TrackedDeviceRoleChanged = 108, + VREvent_WatchdogWakeUpRequested = 109, + VREvent_LensDistortionChanged = 110, + VREvent_PropertyChanged = 111, + + VREvent_ButtonPress = 200, // data is controller + VREvent_ButtonUnpress = 201, // data is controller + VREvent_ButtonTouch = 202, // data is controller + VREvent_ButtonUntouch = 203, // data is controller + + VREvent_MouseMove = 300, // data is mouse + VREvent_MouseButtonDown = 301, // data is mouse + VREvent_MouseButtonUp = 302, // data is mouse + VREvent_FocusEnter = 303, // data is overlay + VREvent_FocusLeave = 304, // data is overlay + VREvent_Scroll = 305, // data is mouse + VREvent_TouchPadMove = 306, // data is mouse + VREvent_OverlayFocusChanged = 307, // data is overlay, global event + + VREvent_InputFocusCaptured = 400, // data is process DEPRECATED + VREvent_InputFocusReleased = 401, // data is process DEPRECATED + VREvent_SceneFocusLost = 402, // data is process + VREvent_SceneFocusGained = 403, // data is process + VREvent_SceneApplicationChanged = 404, // data is process - The App actually drawing the scene changed (usually to or from the compositor) + VREvent_SceneFocusChanged = 405, // data is process - New app got access to draw the scene + VREvent_InputFocusChanged = 406, // data is process + VREvent_SceneApplicationSecondaryRenderingStarted = 407, // data is process + + VREvent_HideRenderModels = 410, // Sent to the scene application to request hiding render models temporarily + VREvent_ShowRenderModels = 411, // Sent to the scene application to request restoring render model visibility + + VREvent_OverlayShown = 500, + VREvent_OverlayHidden = 501, + VREvent_DashboardActivated = 502, + VREvent_DashboardDeactivated = 503, + VREvent_DashboardThumbSelected = 504, // Sent to the overlay manager - data is overlay + VREvent_DashboardRequested = 505, // Sent to the overlay manager - data is overlay + VREvent_ResetDashboard = 506, // Send to the overlay manager + VREvent_RenderToast = 507, // Send to the dashboard to render a toast - data is the notification ID + VREvent_ImageLoaded = 508, // Sent to overlays when a SetOverlayRaw or SetOverlayFromFile call finishes loading + VREvent_ShowKeyboard = 509, // Sent to keyboard renderer in the dashboard to invoke it + VREvent_HideKeyboard = 510, // Sent to keyboard renderer in the dashboard to hide it + VREvent_OverlayGamepadFocusGained = 511, // Sent to an overlay when IVROverlay::SetFocusOverlay is called on it + VREvent_OverlayGamepadFocusLost = 512, // Send to an overlay when it previously had focus and IVROverlay::SetFocusOverlay is called on something else + VREvent_OverlaySharedTextureChanged = 513, + VREvent_DashboardGuideButtonDown = 514, + VREvent_DashboardGuideButtonUp = 515, + VREvent_ScreenshotTriggered = 516, // Screenshot button combo was pressed, Dashboard should request a screenshot + VREvent_ImageFailed = 517, // Sent to overlays when a SetOverlayRaw or SetOverlayfromFail fails to load + VREvent_DashboardOverlayCreated = 518, + + // Screenshot API + VREvent_RequestScreenshot = 520, // Sent by vrclient application to compositor to take a screenshot + VREvent_ScreenshotTaken = 521, // Sent by compositor to the application that the screenshot has been taken + VREvent_ScreenshotFailed = 522, // Sent by compositor to the application that the screenshot failed to be taken + VREvent_SubmitScreenshotToDashboard = 523, // Sent by compositor to the dashboard that a completed screenshot was submitted + VREvent_ScreenshotProgressToDashboard = 524, // Sent by compositor to the dashboard that a completed screenshot was submitted + + VREvent_PrimaryDashboardDeviceChanged = 525, + + VREvent_Notification_Shown = 600, + VREvent_Notification_Hidden = 601, + VREvent_Notification_BeginInteraction = 602, + VREvent_Notification_Destroyed = 603, + + VREvent_Quit = 700, // data is process + VREvent_ProcessQuit = 701, // data is process + VREvent_QuitAborted_UserPrompt = 702, // data is process + VREvent_QuitAcknowledged = 703, // data is process + VREvent_DriverRequestedQuit = 704, // The driver has requested that SteamVR shut down + + VREvent_ChaperoneDataHasChanged = 800, + VREvent_ChaperoneUniverseHasChanged = 801, + VREvent_ChaperoneTempDataHasChanged = 802, + VREvent_ChaperoneSettingsHaveChanged = 803, + VREvent_SeatedZeroPoseReset = 804, + + VREvent_AudioSettingsHaveChanged = 820, + + VREvent_BackgroundSettingHasChanged = 850, + VREvent_CameraSettingsHaveChanged = 851, + VREvent_ReprojectionSettingHasChanged = 852, + VREvent_ModelSkinSettingsHaveChanged = 853, + VREvent_EnvironmentSettingsHaveChanged = 854, + VREvent_PowerSettingsHaveChanged = 855, + VREvent_EnableHomeAppSettingsHaveChanged = 856, + + VREvent_StatusUpdate = 900, + + VREvent_MCImageUpdated = 1000, + + VREvent_FirmwareUpdateStarted = 1100, + VREvent_FirmwareUpdateFinished = 1101, + + VREvent_KeyboardClosed = 1200, + VREvent_KeyboardCharInput = 1201, + VREvent_KeyboardDone = 1202, // Sent when DONE button clicked on keyboard + + VREvent_ApplicationTransitionStarted = 1300, + VREvent_ApplicationTransitionAborted = 1301, + VREvent_ApplicationTransitionNewAppStarted = 1302, + VREvent_ApplicationListUpdated = 1303, + VREvent_ApplicationMimeTypeLoad = 1304, + VREvent_ApplicationTransitionNewAppLaunchComplete = 1305, + VREvent_ProcessConnected = 1306, + VREvent_ProcessDisconnected = 1307, + + VREvent_Compositor_MirrorWindowShown = 1400, + VREvent_Compositor_MirrorWindowHidden = 1401, + VREvent_Compositor_ChaperoneBoundsShown = 1410, + VREvent_Compositor_ChaperoneBoundsHidden = 1411, + + VREvent_TrackedCamera_StartVideoStream = 1500, + VREvent_TrackedCamera_StopVideoStream = 1501, + VREvent_TrackedCamera_PauseVideoStream = 1502, + VREvent_TrackedCamera_ResumeVideoStream = 1503, + VREvent_TrackedCamera_EditingSurface = 1550, + + VREvent_PerformanceTest_EnableCapture = 1600, + VREvent_PerformanceTest_DisableCapture = 1601, + VREvent_PerformanceTest_FidelityLevel = 1602, + + VREvent_MessageOverlay_Closed = 1650, + + // Vendors are free to expose private events in this reserved region + VREvent_VendorSpecific_Reserved_Start = 10000, + VREvent_VendorSpecific_Reserved_End = 19999, +}; + + +/** Level of Hmd activity */ +// UserInteraction_Timeout means the device is in the process of timing out. +// InUse = ( k_EDeviceActivityLevel_UserInteraction || k_EDeviceActivityLevel_UserInteraction_Timeout ) +// VREvent_TrackedDeviceUserInteractionStarted fires when the devices transitions from Standby -> UserInteraction or Idle -> UserInteraction. +// VREvent_TrackedDeviceUserInteractionEnded fires when the devices transitions from UserInteraction_Timeout -> Idle +enum EDeviceActivityLevel +{ + k_EDeviceActivityLevel_Unknown = -1, + k_EDeviceActivityLevel_Idle = 0, // No activity for the last 10 seconds + k_EDeviceActivityLevel_UserInteraction = 1, // Activity (movement or prox sensor) is happening now + k_EDeviceActivityLevel_UserInteraction_Timeout = 2, // No activity for the last 0.5 seconds + k_EDeviceActivityLevel_Standby = 3, // Idle for at least 5 seconds (configurable in Settings -> Power Management) +}; + + +/** VR controller button and axis IDs */ +enum EVRButtonId +{ + k_EButton_System = 0, + k_EButton_ApplicationMenu = 1, + k_EButton_Grip = 2, + k_EButton_DPad_Left = 3, + k_EButton_DPad_Up = 4, + k_EButton_DPad_Right = 5, + k_EButton_DPad_Down = 6, + k_EButton_A = 7, + + k_EButton_ProximitySensor = 31, + + k_EButton_Axis0 = 32, + k_EButton_Axis1 = 33, + k_EButton_Axis2 = 34, + k_EButton_Axis3 = 35, + k_EButton_Axis4 = 36, + + // aliases for well known controllers + k_EButton_SteamVR_Touchpad = k_EButton_Axis0, + k_EButton_SteamVR_Trigger = k_EButton_Axis1, + + k_EButton_Dashboard_Back = k_EButton_Grip, + + k_EButton_Max = 64 +}; + +inline uint64_t ButtonMaskFromId( EVRButtonId id ) { return 1ull << id; } + +/** used for controller button events */ +struct VREvent_Controller_t +{ + uint32_t button; // EVRButtonId enum +}; + + +/** used for simulated mouse events in overlay space */ +enum EVRMouseButton +{ + VRMouseButton_Left = 0x0001, + VRMouseButton_Right = 0x0002, + VRMouseButton_Middle = 0x0004, +}; + + +/** used for simulated mouse events in overlay space */ +struct VREvent_Mouse_t +{ + float x, y; // co-ords are in GL space, bottom left of the texture is 0,0 + uint32_t button; // EVRMouseButton enum +}; + +/** used for simulated mouse wheel scroll in overlay space */ +struct VREvent_Scroll_t +{ + float xdelta, ydelta; // movement in fraction of the pad traversed since last delta, 1.0 for a full swipe + uint32_t repeatCount; +}; + +/** when in mouse input mode you can receive data from the touchpad, these events are only sent if the users finger + is on the touchpad (or just released from it) +**/ +struct VREvent_TouchPadMove_t +{ + // true if the users finger is detected on the touch pad + bool bFingerDown; + + // How long the finger has been down in seconds + float flSecondsFingerDown; + + // These values indicate the starting finger position (so you can do some basic swipe stuff) + float fValueXFirst; + float fValueYFirst; + + // This is the raw sampled coordinate without deadzoning + float fValueXRaw; + float fValueYRaw; +}; + +/** notification related events. Details will still change at this point */ +struct VREvent_Notification_t +{ + uint64_t ulUserValue; + uint32_t notificationId; +}; + +/** Used for events about processes */ +struct VREvent_Process_t +{ + uint32_t pid; + uint32_t oldPid; + bool bForced; +}; + + +/** Used for a few events about overlays */ +struct VREvent_Overlay_t +{ + uint64_t overlayHandle; +}; + + +/** Used for a few events about overlays */ +struct VREvent_Status_t +{ + uint32_t statusState; // EVRState enum +}; + +/** Used for keyboard events **/ +struct VREvent_Keyboard_t +{ + char cNewInput[8]; // Up to 11 bytes of new input + uint64_t uUserValue; // Possible flags about the new input +}; + +struct VREvent_Ipd_t +{ + float ipdMeters; +}; + +struct VREvent_Chaperone_t +{ + uint64_t m_nPreviousUniverse; + uint64_t m_nCurrentUniverse; +}; + +/** Not actually used for any events */ +struct VREvent_Reserved_t +{ + uint64_t reserved0; + uint64_t reserved1; +}; + +struct VREvent_PerformanceTest_t +{ + uint32_t m_nFidelityLevel; +}; + +struct VREvent_SeatedZeroPoseReset_t +{ + bool bResetBySystemMenu; +}; + +struct VREvent_Screenshot_t +{ + uint32_t handle; + uint32_t type; +}; + +struct VREvent_ScreenshotProgress_t +{ + float progress; +}; + +struct VREvent_ApplicationLaunch_t +{ + uint32_t pid; + uint32_t unArgsHandle; +}; + +struct VREvent_EditingCameraSurface_t +{ + uint64_t overlayHandle; + uint32_t nVisualMode; +}; + +struct VREvent_MessageOverlay_t +{ + uint32_t unVRMessageOverlayResponse; // vr::VRMessageOverlayResponse enum +}; + +struct VREvent_Property_t +{ + PropertyContainerHandle_t container; + ETrackedDeviceProperty prop; +}; + +/** NOTE!!! If you change this you MUST manually update openvr_interop.cs.py */ +typedef union +{ + VREvent_Reserved_t reserved; + VREvent_Controller_t controller; + VREvent_Mouse_t mouse; + VREvent_Scroll_t scroll; + VREvent_Process_t process; + VREvent_Notification_t notification; + VREvent_Overlay_t overlay; + VREvent_Status_t status; + VREvent_Keyboard_t keyboard; + VREvent_Ipd_t ipd; + VREvent_Chaperone_t chaperone; + VREvent_PerformanceTest_t performanceTest; + VREvent_TouchPadMove_t touchPadMove; + VREvent_SeatedZeroPoseReset_t seatedZeroPoseReset; + VREvent_Screenshot_t screenshot; + VREvent_ScreenshotProgress_t screenshotProgress; + VREvent_ApplicationLaunch_t applicationLaunch; + VREvent_EditingCameraSurface_t cameraSurface; + VREvent_MessageOverlay_t messageOverlay; + VREvent_Property_t property; +} VREvent_Data_t; + + +#if defined(__linux__) || defined(__APPLE__) +// This structure was originally defined mis-packed on Linux, preserved for +// compatibility. +#pragma pack( push, 4 ) +#endif + +/** An event posted by the server to all running applications */ +struct VREvent_t +{ + uint32_t eventType; // EVREventType enum + TrackedDeviceIndex_t trackedDeviceIndex; + float eventAgeSeconds; + // event data must be the end of the struct as its size is variable + VREvent_Data_t data; +}; + +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( pop ) +#endif + +/** The mesh to draw into the stencil (or depth) buffer to perform +* early stencil (or depth) kills of pixels that will never appear on the HMD. +* This mesh draws on all the pixels that will be hidden after distortion. +* +* If the HMD does not provide a visible area mesh pVertexData will be +* NULL and unTriangleCount will be 0. */ +struct HiddenAreaMesh_t +{ + const HmdVector2_t *pVertexData; + uint32_t unTriangleCount; +}; + + +enum EHiddenAreaMeshType +{ + k_eHiddenAreaMesh_Standard = 0, + k_eHiddenAreaMesh_Inverse = 1, + k_eHiddenAreaMesh_LineLoop = 2, + + k_eHiddenAreaMesh_Max = 3, +}; + + +/** Identifies what kind of axis is on the controller at index n. Read this type +* with pVRSystem->Get( nControllerDeviceIndex, Prop_Axis0Type_Int32 + n ); +*/ +enum EVRControllerAxisType +{ + k_eControllerAxis_None = 0, + k_eControllerAxis_TrackPad = 1, + k_eControllerAxis_Joystick = 2, + k_eControllerAxis_Trigger = 3, // Analog trigger data is in the X axis +}; + + +/** contains information about one axis on the controller */ +struct VRControllerAxis_t +{ + 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. + float y; // Ranges from -1.0 to 1.0 for joysticks and track pads. Is always 0.0 for triggers. +}; + + +/** the number of axes in the controller state */ +static const uint32_t k_unControllerStateAxisCount = 5; + + +#if defined(__linux__) || defined(__APPLE__) +// This structure was originally defined mis-packed on Linux, preserved for +// compatibility. +#pragma pack( push, 4 ) +#endif + +/** Holds all the state of a controller at one moment in time. */ +struct VRControllerState001_t +{ + // If packet num matches that on your prior call, then the controller state hasn't been changed since + // your last call and there is no need to process it + uint32_t unPacketNum; + + // bit flags for each of the buttons. Use ButtonMaskFromId to turn an ID into a mask + uint64_t ulButtonPressed; + uint64_t ulButtonTouched; + + // Axis data for the controller's analog inputs + VRControllerAxis_t rAxis[ k_unControllerStateAxisCount ]; +}; +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( pop ) +#endif + + +typedef VRControllerState001_t VRControllerState_t; + + +/** determines how to provide output to the application of various event processing functions. */ +enum EVRControllerEventOutputType +{ + ControllerEventOutput_OSEvents = 0, + ControllerEventOutput_VREvents = 1, +}; + + + +/** Collision Bounds Style */ +enum ECollisionBoundsStyle +{ + COLLISION_BOUNDS_STYLE_BEGINNER = 0, + COLLISION_BOUNDS_STYLE_INTERMEDIATE, + COLLISION_BOUNDS_STYLE_SQUARES, + COLLISION_BOUNDS_STYLE_ADVANCED, + COLLISION_BOUNDS_STYLE_NONE, + + COLLISION_BOUNDS_STYLE_COUNT +}; + +/** Allows the application to customize how the overlay appears in the compositor */ +struct Compositor_OverlaySettings +{ + uint32_t size; // sizeof(Compositor_OverlaySettings) + bool curved, antialias; + float scale, distance, alpha; + float uOffset, vOffset, uScale, vScale; + float gridDivs, gridWidth, gridScale; + HmdMatrix44_t transform; +}; + +/** used to refer to a single VR overlay */ +typedef uint64_t VROverlayHandle_t; + +static const VROverlayHandle_t k_ulOverlayHandleInvalid = 0; + +/** Errors that can occur around VR overlays */ +enum EVROverlayError +{ + VROverlayError_None = 0, + + VROverlayError_UnknownOverlay = 10, + VROverlayError_InvalidHandle = 11, + VROverlayError_PermissionDenied = 12, + VROverlayError_OverlayLimitExceeded = 13, // No more overlays could be created because the maximum number already exist + VROverlayError_WrongVisibilityType = 14, + VROverlayError_KeyTooLong = 15, + VROverlayError_NameTooLong = 16, + VROverlayError_KeyInUse = 17, + VROverlayError_WrongTransformType = 18, + VROverlayError_InvalidTrackedDevice = 19, + VROverlayError_InvalidParameter = 20, + VROverlayError_ThumbnailCantBeDestroyed = 21, + VROverlayError_ArrayTooSmall = 22, + VROverlayError_RequestFailed = 23, + VROverlayError_InvalidTexture = 24, + VROverlayError_UnableToLoadFile = 25, + VROverlayError_KeyboardAlreadyInUse = 26, + VROverlayError_NoNeighbor = 27, + VROverlayError_TooManyMaskPrimitives = 29, + VROverlayError_BadMaskPrimitive = 30, +}; + +/** enum values to pass in to VR_Init to identify whether the application will +* draw a 3D scene. */ +enum EVRApplicationType +{ + VRApplication_Other = 0, // Some other kind of application that isn't covered by the other entries + VRApplication_Scene = 1, // Application will submit 3D frames + VRApplication_Overlay = 2, // Application only interacts with overlays + VRApplication_Background = 3, // Application should not start SteamVR if it's not already running, and should not + // keep it running if everything else quits. + VRApplication_Utility = 4, // Init should not try to load any drivers. The application needs access to utility + // interfaces (like IVRSettings and IVRApplications) but not hardware. + VRApplication_VRMonitor = 5, // Reserved for vrmonitor + VRApplication_SteamWatchdog = 6,// Reserved for Steam + VRApplication_Bootstrapper = 7, // Start up SteamVR + + VRApplication_Max +}; + + +/** error codes for firmware */ +enum EVRFirmwareError +{ + VRFirmwareError_None = 0, + VRFirmwareError_Success = 1, + VRFirmwareError_Fail = 2, +}; + + +/** error codes for notifications */ +enum EVRNotificationError +{ + VRNotificationError_OK = 0, + VRNotificationError_InvalidNotificationId = 100, + VRNotificationError_NotificationQueueFull = 101, + VRNotificationError_InvalidOverlayHandle = 102, + VRNotificationError_SystemWithUserValueAlreadyExists = 103, +}; + + +/** error codes returned by Vr_Init */ + +// Please add adequate error description to https://developer.valvesoftware.com/w/index.php?title=Category:SteamVRHelp +enum EVRInitError +{ + VRInitError_None = 0, + VRInitError_Unknown = 1, + + VRInitError_Init_InstallationNotFound = 100, + VRInitError_Init_InstallationCorrupt = 101, + VRInitError_Init_VRClientDLLNotFound = 102, + VRInitError_Init_FileNotFound = 103, + VRInitError_Init_FactoryNotFound = 104, + VRInitError_Init_InterfaceNotFound = 105, + VRInitError_Init_InvalidInterface = 106, + VRInitError_Init_UserConfigDirectoryInvalid = 107, + VRInitError_Init_HmdNotFound = 108, + VRInitError_Init_NotInitialized = 109, + VRInitError_Init_PathRegistryNotFound = 110, + VRInitError_Init_NoConfigPath = 111, + VRInitError_Init_NoLogPath = 112, + VRInitError_Init_PathRegistryNotWritable = 113, + VRInitError_Init_AppInfoInitFailed = 114, + VRInitError_Init_Retry = 115, // Used internally to cause retries to vrserver + VRInitError_Init_InitCanceledByUser = 116, // The calling application should silently exit. The user canceled app startup + VRInitError_Init_AnotherAppLaunching = 117, + VRInitError_Init_SettingsInitFailed = 118, + VRInitError_Init_ShuttingDown = 119, + VRInitError_Init_TooManyObjects = 120, + VRInitError_Init_NoServerForBackgroundApp = 121, + VRInitError_Init_NotSupportedWithCompositor = 122, + VRInitError_Init_NotAvailableToUtilityApps = 123, + VRInitError_Init_Internal = 124, + VRInitError_Init_HmdDriverIdIsNone = 125, + VRInitError_Init_HmdNotFoundPresenceFailed = 126, + VRInitError_Init_VRMonitorNotFound = 127, + VRInitError_Init_VRMonitorStartupFailed = 128, + VRInitError_Init_LowPowerWatchdogNotSupported = 129, + VRInitError_Init_InvalidApplicationType = 130, + VRInitError_Init_NotAvailableToWatchdogApps = 131, + VRInitError_Init_WatchdogDisabledInSettings = 132, + VRInitError_Init_VRDashboardNotFound = 133, + VRInitError_Init_VRDashboardStartupFailed = 134, + VRInitError_Init_VRHomeNotFound = 135, + VRInitError_Init_VRHomeStartupFailed = 136, + + VRInitError_Driver_Failed = 200, + VRInitError_Driver_Unknown = 201, + VRInitError_Driver_HmdUnknown = 202, + VRInitError_Driver_NotLoaded = 203, + VRInitError_Driver_RuntimeOutOfDate = 204, + VRInitError_Driver_HmdInUse = 205, + VRInitError_Driver_NotCalibrated = 206, + VRInitError_Driver_CalibrationInvalid = 207, + VRInitError_Driver_HmdDisplayNotFound = 208, + VRInitError_Driver_TrackedDeviceInterfaceUnknown = 209, + // VRInitError_Driver_HmdDisplayNotFoundAfterFix = 210, // not needed: here for historic reasons + VRInitError_Driver_HmdDriverIdOutOfBounds = 211, + VRInitError_Driver_HmdDisplayMirrored = 212, + + VRInitError_IPC_ServerInitFailed = 300, + VRInitError_IPC_ConnectFailed = 301, + VRInitError_IPC_SharedStateInitFailed = 302, + VRInitError_IPC_CompositorInitFailed = 303, + VRInitError_IPC_MutexInitFailed = 304, + VRInitError_IPC_Failed = 305, + VRInitError_IPC_CompositorConnectFailed = 306, + VRInitError_IPC_CompositorInvalidConnectResponse = 307, + VRInitError_IPC_ConnectFailedAfterMultipleAttempts = 308, + + VRInitError_Compositor_Failed = 400, + VRInitError_Compositor_D3D11HardwareRequired = 401, + VRInitError_Compositor_FirmwareRequiresUpdate = 402, + VRInitError_Compositor_OverlayInitFailed = 403, + VRInitError_Compositor_ScreenshotsInitFailed = 404, + VRInitError_Compositor_UnableToCreateDevice = 405, + + VRInitError_VendorSpecific_UnableToConnectToOculusRuntime = 1000, + + VRInitError_VendorSpecific_HmdFound_CantOpenDevice = 1101, + VRInitError_VendorSpecific_HmdFound_UnableToRequestConfigStart = 1102, + VRInitError_VendorSpecific_HmdFound_NoStoredConfig = 1103, + VRInitError_VendorSpecific_HmdFound_ConfigTooBig = 1104, + VRInitError_VendorSpecific_HmdFound_ConfigTooSmall = 1105, + VRInitError_VendorSpecific_HmdFound_UnableToInitZLib = 1106, + VRInitError_VendorSpecific_HmdFound_CantReadFirmwareVersion = 1107, + VRInitError_VendorSpecific_HmdFound_UnableToSendUserDataStart = 1108, + VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataStart = 1109, + VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataNext = 1110, + VRInitError_VendorSpecific_HmdFound_UserDataAddressRange = 1111, + VRInitError_VendorSpecific_HmdFound_UserDataError = 1112, + VRInitError_VendorSpecific_HmdFound_ConfigFailedSanityCheck = 1113, + + VRInitError_Steam_SteamInstallationNotFound = 2000, +}; + +enum EVRScreenshotType +{ + VRScreenshotType_None = 0, + VRScreenshotType_Mono = 1, // left eye only + VRScreenshotType_Stereo = 2, + VRScreenshotType_Cubemap = 3, + VRScreenshotType_MonoPanorama = 4, + VRScreenshotType_StereoPanorama = 5 +}; + +enum EVRScreenshotPropertyFilenames +{ + VRScreenshotPropertyFilenames_Preview = 0, + VRScreenshotPropertyFilenames_VR = 1, +}; + +enum EVRTrackedCameraError +{ + VRTrackedCameraError_None = 0, + VRTrackedCameraError_OperationFailed = 100, + VRTrackedCameraError_InvalidHandle = 101, + VRTrackedCameraError_InvalidFrameHeaderVersion = 102, + VRTrackedCameraError_OutOfHandles = 103, + VRTrackedCameraError_IPCFailure = 104, + VRTrackedCameraError_NotSupportedForThisDevice = 105, + VRTrackedCameraError_SharedMemoryFailure = 106, + VRTrackedCameraError_FrameBufferingFailure = 107, + VRTrackedCameraError_StreamSetupFailure = 108, + VRTrackedCameraError_InvalidGLTextureId = 109, + VRTrackedCameraError_InvalidSharedTextureHandle = 110, + VRTrackedCameraError_FailedToGetGLTextureId = 111, + VRTrackedCameraError_SharedTextureFailure = 112, + VRTrackedCameraError_NoFrameAvailable = 113, + VRTrackedCameraError_InvalidArgument = 114, + VRTrackedCameraError_InvalidFrameBufferSize = 115, +}; + +enum EVRTrackedCameraFrameType +{ + VRTrackedCameraFrameType_Distorted = 0, // This is the camera video frame size in pixels, still distorted. + VRTrackedCameraFrameType_Undistorted, // In pixels, an undistorted inscribed rectangle region without invalid regions. This size is subject to changes shortly. + VRTrackedCameraFrameType_MaximumUndistorted, // In pixels, maximum undistorted with invalid regions. Non zero alpha component identifies valid regions. + MAX_CAMERA_FRAME_TYPES +}; + +typedef uint64_t TrackedCameraHandle_t; +#define INVALID_TRACKED_CAMERA_HANDLE ((vr::TrackedCameraHandle_t)0) + +struct CameraVideoStreamFrameHeader_t +{ + EVRTrackedCameraFrameType eFrameType; + + uint32_t nWidth; + uint32_t nHeight; + uint32_t nBytesPerPixel; + + uint32_t nFrameSequence; + + TrackedDevicePose_t standingTrackedDevicePose; +}; + +// Screenshot types +typedef uint32_t ScreenshotHandle_t; + +static const uint32_t k_unScreenshotHandleInvalid = 0; + +#pragma pack( pop ) + +// figure out how to import from the VR API dll +#if defined(_WIN32) + +#ifdef VR_API_EXPORT +#define VR_INTERFACE extern "C" __declspec( dllexport ) +#else +#define VR_INTERFACE extern "C" __declspec( dllimport ) +#endif + +#elif defined(__GNUC__) || defined(COMPILER_GCC) || defined(__APPLE__) + +#ifdef VR_API_EXPORT +#define VR_INTERFACE extern "C" __attribute__((visibility("default"))) +#else +#define VR_INTERFACE extern "C" +#endif + +#else +#error "Unsupported Platform." +#endif + + +#if defined( _WIN32 ) +#define VR_CALLTYPE __cdecl +#else +#define VR_CALLTYPE +#endif + +} // namespace vr + +#endif // _INCLUDE_VRTYPES_H + + +// vrannotation.h +#ifdef API_GEN +# define VR_CLANG_ATTR(ATTR) __attribute__((annotate( ATTR ))) +#else +# define VR_CLANG_ATTR(ATTR) +#endif + +#define VR_METHOD_DESC(DESC) VR_CLANG_ATTR( "desc:" #DESC ";" ) +#define VR_IGNOREATTR() VR_CLANG_ATTR( "ignore" ) +#define VR_OUT_STRUCT() VR_CLANG_ATTR( "out_struct: ;" ) +#define VR_OUT_STRING() VR_CLANG_ATTR( "out_string: ;" ) +#define VR_OUT_ARRAY_CALL(COUNTER,FUNCTION,PARAMS) VR_CLANG_ATTR( "out_array_call:" #COUNTER "," #FUNCTION "," #PARAMS ";" ) +#define VR_OUT_ARRAY_COUNT(COUNTER) VR_CLANG_ATTR( "out_array_count:" #COUNTER ";" ) +#define VR_ARRAY_COUNT(COUNTER) VR_CLANG_ATTR( "array_count:" #COUNTER ";" ) +#define VR_ARRAY_COUNT_D(COUNTER, DESC) VR_CLANG_ATTR( "array_count:" #COUNTER ";desc:" #DESC ) +#define VR_BUFFER_COUNT(COUNTER) VR_CLANG_ATTR( "buffer_count:" #COUNTER ";" ) +#define VR_OUT_BUFFER_COUNT(COUNTER) VR_CLANG_ATTR( "out_buffer_count:" #COUNTER ";" ) +#define VR_OUT_STRING_COUNT(COUNTER) VR_CLANG_ATTR( "out_string_count:" #COUNTER ";" ) + +// vrtrackedcameratypes.h +#ifndef _VRTRACKEDCAMERATYPES_H +#define _VRTRACKEDCAMERATYPES_H + +namespace vr +{ + +#pragma pack( push, 8 ) + +enum ECameraVideoStreamFormat +{ + CVS_FORMAT_UNKNOWN = 0, + CVS_FORMAT_RAW10 = 1, // 10 bits per pixel + CVS_FORMAT_NV12 = 2, // 12 bits per pixel + CVS_FORMAT_RGB24 = 3, // 24 bits per pixel + CVS_MAX_FORMATS +}; + +enum ECameraCompatibilityMode +{ + CAMERA_COMPAT_MODE_BULK_DEFAULT = 0, + CAMERA_COMPAT_MODE_BULK_64K_DMA, + CAMERA_COMPAT_MODE_BULK_16K_DMA, + CAMERA_COMPAT_MODE_BULK_8K_DMA, + CAMERA_COMPAT_MODE_ISO_52FPS, + CAMERA_COMPAT_MODE_ISO_50FPS, + CAMERA_COMPAT_MODE_ISO_48FPS, + CAMERA_COMPAT_MODE_ISO_46FPS, + CAMERA_COMPAT_MODE_ISO_44FPS, + CAMERA_COMPAT_MODE_ISO_42FPS, + CAMERA_COMPAT_MODE_ISO_40FPS, + CAMERA_COMPAT_MODE_ISO_35FPS, + CAMERA_COMPAT_MODE_ISO_30FPS, + MAX_CAMERA_COMPAT_MODES +}; + +#ifdef _MSC_VER +#define VR_CAMERA_DECL_ALIGN( x ) __declspec( align( x ) ) +#else +#define VR_CAMERA_DECL_ALIGN( x ) // +#endif + +#define MAX_CAMERA_FRAME_SHARED_HANDLES 4 + +VR_CAMERA_DECL_ALIGN( 8 ) struct CameraVideoStreamFrame_t +{ + ECameraVideoStreamFormat m_nStreamFormat; + + uint32_t m_nWidth; + uint32_t m_nHeight; + + uint32_t m_nImageDataSize; // Based on stream format, width, height + + uint32_t m_nFrameSequence; // Starts from 0 when stream starts. + + uint32_t m_nBufferIndex; // Identifies which buffer the image data is hosted + uint32_t m_nBufferCount; // Total number of configured buffers + + uint32_t m_nExposureTime; + + uint32_t m_nISPFrameTimeStamp; // Driver provided time stamp per driver centric time base + uint32_t m_nISPReferenceTimeStamp; + uint32_t m_nSyncCounter; + + uint32_t m_nCamSyncEvents; + uint32_t m_nISPSyncEvents; + + double m_flReferenceCamSyncTime; + + double m_flFrameElapsedTime; // Starts from 0 when stream starts. In seconds. + double m_flFrameDeliveryRate; + + double m_flFrameCaptureTime_DriverAbsolute; // In USB time, via AuxEvent + double m_flFrameCaptureTime_ServerRelative; // In System time within the server + uint64_t m_nFrameCaptureTicks_ServerAbsolute; // In system ticks within the server + double m_flFrameCaptureTime_ClientRelative; // At the client, relative to when the frame was exposed/captured. + + double m_flSyncMarkerError; + + TrackedDevicePose_t m_StandingTrackedDevicePose; // Supplied by HMD layer when used as a tracked camera + + uint64_t m_pImageData; +}; + +#pragma pack( pop ) + +} + +#endif // _VRTRACKEDCAMERATYPES_H +// ivrsettings.h +namespace vr +{ + enum EVRSettingsError + { + VRSettingsError_None = 0, + VRSettingsError_IPCFailed = 1, + VRSettingsError_WriteFailed = 2, + VRSettingsError_ReadFailed = 3, + VRSettingsError_JsonParseFailed = 4, + VRSettingsError_UnsetSettingHasNoDefault = 5, // This will be returned if the setting does not appear in the appropriate default file and has not been set + }; + + // The maximum length of a settings key + static const uint32_t k_unMaxSettingsKeyLength = 128; + + class IVRSettings + { + public: + virtual const char *GetSettingsErrorNameFromEnum( EVRSettingsError eError ) = 0; + + // Returns true if file sync occurred (force or settings dirty) + virtual bool Sync( bool bForce = false, EVRSettingsError *peError = nullptr ) = 0; + + virtual void SetBool( const char *pchSection, const char *pchSettingsKey, bool bValue, EVRSettingsError *peError = nullptr ) = 0; + virtual void SetInt32( const char *pchSection, const char *pchSettingsKey, int32_t nValue, EVRSettingsError *peError = nullptr ) = 0; + virtual void SetFloat( const char *pchSection, const char *pchSettingsKey, float flValue, EVRSettingsError *peError = nullptr ) = 0; + virtual void SetString( const char *pchSection, const char *pchSettingsKey, const char *pchValue, EVRSettingsError *peError = nullptr ) = 0; + + // Users of the system need to provide a proper default in default.vrsettings in the resources/settings/ directory + // of either the runtime or the driver_xxx directory. Otherwise the default will be false, 0, 0.0 or "" + virtual bool GetBool( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0; + virtual int32_t GetInt32( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0; + virtual float GetFloat( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0; + virtual void GetString( const char *pchSection, const char *pchSettingsKey, VR_OUT_STRING() char *pchValue, uint32_t unValueLen, EVRSettingsError *peError = nullptr ) = 0; + + virtual void RemoveSection( const char *pchSection, EVRSettingsError *peError = nullptr ) = 0; + virtual void RemoveKeyInSection( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0; + }; + + //----------------------------------------------------------------------------- + static const char * const IVRSettings_Version = "IVRSettings_002"; + + //----------------------------------------------------------------------------- + // steamvr keys + static const char * const k_pch_SteamVR_Section = "steamvr"; + static const char * const k_pch_SteamVR_RequireHmd_String = "requireHmd"; + static const char * const k_pch_SteamVR_ForcedDriverKey_String = "forcedDriver"; + static const char * const k_pch_SteamVR_ForcedHmdKey_String = "forcedHmd"; + static const char * const k_pch_SteamVR_DisplayDebug_Bool = "displayDebug"; + static const char * const k_pch_SteamVR_DebugProcessPipe_String = "debugProcessPipe"; + static const char * const k_pch_SteamVR_DisplayDebugX_Int32 = "displayDebugX"; + static const char * const k_pch_SteamVR_DisplayDebugY_Int32 = "displayDebugY"; + static const char * const k_pch_SteamVR_SendSystemButtonToAllApps_Bool= "sendSystemButtonToAllApps"; + static const char * const k_pch_SteamVR_LogLevel_Int32 = "loglevel"; + static const char * const k_pch_SteamVR_IPD_Float = "ipd"; + static const char * const k_pch_SteamVR_Background_String = "background"; + static const char * const k_pch_SteamVR_BackgroundUseDomeProjection_Bool = "backgroundUseDomeProjection"; + static const char * const k_pch_SteamVR_BackgroundCameraHeight_Float = "backgroundCameraHeight"; + static const char * const k_pch_SteamVR_BackgroundDomeRadius_Float = "backgroundDomeRadius"; + static const char * const k_pch_SteamVR_GridColor_String = "gridColor"; + static const char * const k_pch_SteamVR_PlayAreaColor_String = "playAreaColor"; + static const char * const k_pch_SteamVR_ShowStage_Bool = "showStage"; + static const char * const k_pch_SteamVR_ActivateMultipleDrivers_Bool = "activateMultipleDrivers"; + static const char * const k_pch_SteamVR_DirectMode_Bool = "directMode"; + static const char * const k_pch_SteamVR_DirectModeEdidVid_Int32 = "directModeEdidVid"; + static const char * const k_pch_SteamVR_DirectModeEdidPid_Int32 = "directModeEdidPid"; + static const char * const k_pch_SteamVR_UsingSpeakers_Bool = "usingSpeakers"; + static const char * const k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float = "speakersForwardYawOffsetDegrees"; + static const char * const k_pch_SteamVR_BaseStationPowerManagement_Bool = "basestationPowerManagement"; + static const char * const k_pch_SteamVR_NeverKillProcesses_Bool = "neverKillProcesses"; + static const char * const k_pch_SteamVR_SupersampleScale_Float = "supersampleScale"; + static const char * const k_pch_SteamVR_AllowAsyncReprojection_Bool = "allowAsyncReprojection"; + static const char * const k_pch_SteamVR_AllowReprojection_Bool = "allowInterleavedReprojection"; + static const char * const k_pch_SteamVR_ForceReprojection_Bool = "forceReprojection"; + static const char * const k_pch_SteamVR_ForceFadeOnBadTracking_Bool = "forceFadeOnBadTracking"; + static const char * const k_pch_SteamVR_DefaultMirrorView_Int32 = "defaultMirrorView"; + static const char * const k_pch_SteamVR_ShowMirrorView_Bool = "showMirrorView"; + static const char * const k_pch_SteamVR_MirrorViewGeometry_String = "mirrorViewGeometry"; + static const char * const k_pch_SteamVR_StartMonitorFromAppLaunch = "startMonitorFromAppLaunch"; + static const char * const k_pch_SteamVR_StartCompositorFromAppLaunch_Bool = "startCompositorFromAppLaunch"; + static const char * const k_pch_SteamVR_StartDashboardFromAppLaunch_Bool = "startDashboardFromAppLaunch"; + static const char * const k_pch_SteamVR_StartOverlayAppsFromDashboard_Bool = "startOverlayAppsFromDashboard"; + static const char * const k_pch_SteamVR_EnableHomeApp = "enableHomeApp"; + static const char * const k_pch_SteamVR_CycleBackgroundImageTimeSec_Int32 = "CycleBackgroundImageTimeSec"; + static const char * const k_pch_SteamVR_RetailDemo_Bool = "retailDemo"; + static const char * const k_pch_SteamVR_IpdOffset_Float = "ipdOffset"; + static const char * const k_pch_SteamVR_AllowSupersampleFiltering_Bool = "allowSupersampleFiltering"; + + //----------------------------------------------------------------------------- + // lighthouse keys + static const char * const k_pch_Lighthouse_Section = "driver_lighthouse"; + static const char * const k_pch_Lighthouse_DisableIMU_Bool = "disableimu"; + static const char * const k_pch_Lighthouse_UseDisambiguation_String = "usedisambiguation"; + static const char * const k_pch_Lighthouse_DisambiguationDebug_Int32 = "disambiguationdebug"; + static const char * const k_pch_Lighthouse_PrimaryBasestation_Int32 = "primarybasestation"; + static const char * const k_pch_Lighthouse_DBHistory_Bool = "dbhistory"; + + //----------------------------------------------------------------------------- + // null keys + static const char * const k_pch_Null_Section = "driver_null"; + static const char * const k_pch_Null_SerialNumber_String = "serialNumber"; + static const char * const k_pch_Null_ModelNumber_String = "modelNumber"; + static const char * const k_pch_Null_WindowX_Int32 = "windowX"; + static const char * const k_pch_Null_WindowY_Int32 = "windowY"; + static const char * const k_pch_Null_WindowWidth_Int32 = "windowWidth"; + static const char * const k_pch_Null_WindowHeight_Int32 = "windowHeight"; + static const char * const k_pch_Null_RenderWidth_Int32 = "renderWidth"; + static const char * const k_pch_Null_RenderHeight_Int32 = "renderHeight"; + static const char * const k_pch_Null_SecondsFromVsyncToPhotons_Float = "secondsFromVsyncToPhotons"; + static const char * const k_pch_Null_DisplayFrequency_Float = "displayFrequency"; + + //----------------------------------------------------------------------------- + // user interface keys + static const char * const k_pch_UserInterface_Section = "userinterface"; + static const char * const k_pch_UserInterface_StatusAlwaysOnTop_Bool = "StatusAlwaysOnTop"; + static const char * const k_pch_UserInterface_MinimizeToTray_Bool = "MinimizeToTray"; + static const char * const k_pch_UserInterface_Screenshots_Bool = "screenshots"; + static const char * const k_pch_UserInterface_ScreenshotType_Int = "screenshotType"; + + //----------------------------------------------------------------------------- + // notification keys + static const char * const k_pch_Notifications_Section = "notifications"; + static const char * const k_pch_Notifications_DoNotDisturb_Bool = "DoNotDisturb"; + + //----------------------------------------------------------------------------- + // keyboard keys + static const char * const k_pch_Keyboard_Section = "keyboard"; + static const char * const k_pch_Keyboard_TutorialCompletions = "TutorialCompletions"; + static const char * const k_pch_Keyboard_ScaleX = "ScaleX"; + static const char * const k_pch_Keyboard_ScaleY = "ScaleY"; + static const char * const k_pch_Keyboard_OffsetLeftX = "OffsetLeftX"; + static const char * const k_pch_Keyboard_OffsetRightX = "OffsetRightX"; + static const char * const k_pch_Keyboard_OffsetY = "OffsetY"; + static const char * const k_pch_Keyboard_Smoothing = "Smoothing"; + + //----------------------------------------------------------------------------- + // perf keys + static const char * const k_pch_Perf_Section = "perfcheck"; + static const char * const k_pch_Perf_HeuristicActive_Bool = "heuristicActive"; + static const char * const k_pch_Perf_NotifyInHMD_Bool = "warnInHMD"; + static const char * const k_pch_Perf_NotifyOnlyOnce_Bool = "warnOnlyOnce"; + static const char * const k_pch_Perf_AllowTimingStore_Bool = "allowTimingStore"; + static const char * const k_pch_Perf_SaveTimingsOnExit_Bool = "saveTimingsOnExit"; + static const char * const k_pch_Perf_TestData_Float = "perfTestData"; + static const char * const k_pch_Perf_LinuxGPUProfiling_Bool = "linuxGPUProfiling"; + + //----------------------------------------------------------------------------- + // collision bounds keys + static const char * const k_pch_CollisionBounds_Section = "collisionBounds"; + static const char * const k_pch_CollisionBounds_Style_Int32 = "CollisionBoundsStyle"; + static const char * const k_pch_CollisionBounds_GroundPerimeterOn_Bool = "CollisionBoundsGroundPerimeterOn"; + static const char * const k_pch_CollisionBounds_CenterMarkerOn_Bool = "CollisionBoundsCenterMarkerOn"; + static const char * const k_pch_CollisionBounds_PlaySpaceOn_Bool = "CollisionBoundsPlaySpaceOn"; + static const char * const k_pch_CollisionBounds_FadeDistance_Float = "CollisionBoundsFadeDistance"; + static const char * const k_pch_CollisionBounds_ColorGammaR_Int32 = "CollisionBoundsColorGammaR"; + static const char * const k_pch_CollisionBounds_ColorGammaG_Int32 = "CollisionBoundsColorGammaG"; + static const char * const k_pch_CollisionBounds_ColorGammaB_Int32 = "CollisionBoundsColorGammaB"; + static const char * const k_pch_CollisionBounds_ColorGammaA_Int32 = "CollisionBoundsColorGammaA"; + + //----------------------------------------------------------------------------- + // camera keys + static const char * const k_pch_Camera_Section = "camera"; + static const char * const k_pch_Camera_EnableCamera_Bool = "enableCamera"; + static const char * const k_pch_Camera_EnableCameraInDashboard_Bool = "enableCameraInDashboard"; + static const char * const k_pch_Camera_EnableCameraForCollisionBounds_Bool = "enableCameraForCollisionBounds"; + static const char * const k_pch_Camera_EnableCameraForRoomView_Bool = "enableCameraForRoomView"; + static const char * const k_pch_Camera_BoundsColorGammaR_Int32 = "cameraBoundsColorGammaR"; + static const char * const k_pch_Camera_BoundsColorGammaG_Int32 = "cameraBoundsColorGammaG"; + static const char * const k_pch_Camera_BoundsColorGammaB_Int32 = "cameraBoundsColorGammaB"; + static const char * const k_pch_Camera_BoundsColorGammaA_Int32 = "cameraBoundsColorGammaA"; + static const char * const k_pch_Camera_BoundsStrength_Int32 = "cameraBoundsStrength"; + + //----------------------------------------------------------------------------- + // audio keys + static const char * const k_pch_audio_Section = "audio"; + static const char * const k_pch_audio_OnPlaybackDevice_String = "onPlaybackDevice"; + static const char * const k_pch_audio_OnRecordDevice_String = "onRecordDevice"; + static const char * const k_pch_audio_OnPlaybackMirrorDevice_String = "onPlaybackMirrorDevice"; + static const char * const k_pch_audio_OffPlaybackDevice_String = "offPlaybackDevice"; + static const char * const k_pch_audio_OffRecordDevice_String = "offRecordDevice"; + static const char * const k_pch_audio_VIVEHDMIGain = "viveHDMIGain"; + + //----------------------------------------------------------------------------- + // power management keys + static const char * const k_pch_Power_Section = "power"; + static const char * const k_pch_Power_PowerOffOnExit_Bool = "powerOffOnExit"; + static const char * const k_pch_Power_TurnOffScreensTimeout_Float = "turnOffScreensTimeout"; + static const char * const k_pch_Power_TurnOffControllersTimeout_Float = "turnOffControllersTimeout"; + static const char * const k_pch_Power_ReturnToWatchdogTimeout_Float = "returnToWatchdogTimeout"; + static const char * const k_pch_Power_AutoLaunchSteamVROnButtonPress = "autoLaunchSteamVROnButtonPress"; + + //----------------------------------------------------------------------------- + // dashboard keys + static const char * const k_pch_Dashboard_Section = "dashboard"; + static const char * const k_pch_Dashboard_EnableDashboard_Bool = "enableDashboard"; + static const char * const k_pch_Dashboard_ArcadeMode_Bool = "arcadeMode"; + + //----------------------------------------------------------------------------- + // model skin keys + static const char * const k_pch_modelskin_Section = "modelskins"; + + //----------------------------------------------------------------------------- + // driver keys - These could be checked in any driver_ section + static const char * const k_pch_Driver_Enable_Bool = "enable"; + +} // namespace vr + +// iservertrackeddevicedriver.h +namespace vr +{ + + +struct DriverPoseQuaternion_t +{ + double w, x, y, z; +}; + +struct DriverPose_t +{ + /* Time offset of this pose, in seconds from the actual time of the pose, + * relative to the time of the PoseUpdated() call made by the driver. + */ + double poseTimeOffset; + + /* Generally, the pose maintained by a driver + * is in an inertial coordinate system different + * from the world system of x+ right, y+ up, z+ back. + * Also, the driver is not usually tracking the "head" position, + * but instead an internal IMU or another reference point in the HMD. + * The following two transforms transform positions and orientations + * to app world space from driver world space, + * and to HMD head space from driver local body space. + * + * We maintain the driver pose state in its internal coordinate system, + * so we can do the pose prediction math without having to + * use angular acceleration. A driver's angular acceleration is generally not measured, + * and is instead calculated from successive samples of angular velocity. + * This leads to a noisy angular acceleration values, which are also + * lagged due to the filtering required to reduce noise to an acceptable level. + */ + vr::HmdQuaternion_t qWorldFromDriverRotation; + double vecWorldFromDriverTranslation[ 3 ]; + + vr::HmdQuaternion_t qDriverFromHeadRotation; + double vecDriverFromHeadTranslation[ 3 ]; + + /* State of driver pose, in meters and radians. */ + /* Position of the driver tracking reference in driver world space + * +[0] (x) is right + * +[1] (y) is up + * -[2] (z) is forward + */ + double vecPosition[ 3 ]; + + /* Velocity of the pose in meters/second */ + double vecVelocity[ 3 ]; + + /* Acceleration of the pose in meters/second */ + double vecAcceleration[ 3 ]; + + /* Orientation of the tracker, represented as a quaternion */ + vr::HmdQuaternion_t qRotation; + + /* Angular velocity of the pose in axis-angle + * representation. The direction is the angle of + * rotation and the magnitude is the angle around + * that axis in radians/second. */ + double vecAngularVelocity[ 3 ]; + + /* Angular acceleration of the pose in axis-angle + * representation. The direction is the angle of + * rotation and the magnitude is the angle around + * that axis in radians/second^2. */ + double vecAngularAcceleration[ 3 ]; + + ETrackingResult result; + + bool poseIsValid; + bool willDriftInYaw; + bool shouldApplyHeadModel; + bool deviceIsConnected; +}; + + +// ---------------------------------------------------------------------------------------------- +// Purpose: Represents a single tracked device in a driver +// ---------------------------------------------------------------------------------------------- +class ITrackedDeviceServerDriver +{ +public: + + // ------------------------------------ + // Management Methods + // ------------------------------------ + /** This is called before an HMD is returned to the application. It will always be + * called before any display or tracking methods. Memory and processor use by the + * ITrackedDeviceServerDriver object should be kept to a minimum until it is activated. + * The pose listener is guaranteed to be valid until Deactivate is called, but + * should not be used after that point. */ + virtual EVRInitError Activate( uint32_t unObjectId ) = 0; + + /** This is called when The VR system is switching from this Hmd being the active display + * to another Hmd being the active display. The driver should clean whatever memory + * and thread use it can when it is deactivated */ + virtual void Deactivate() = 0; + + /** Handles a request from the system to put this device into standby mode. What that means is defined per-device. */ + virtual void EnterStandby() = 0; + + /** Requests a component interface of the driver for device-specific functionality. The driver should return NULL + * if the requested interface or version is not supported. */ + virtual void *GetComponent( const char *pchComponentNameAndVersion ) = 0; + + /** A VR Client has made this debug request of the driver. The set of valid requests is entirely + * up to the driver and the client to figure out, as is the format of the response. Responses that + * exceed the length of the supplied buffer should be truncated and null terminated */ + virtual void DebugRequest( const char *pchRequest, char *pchResponseBuffer, uint32_t unResponseBufferSize ) = 0; + + // ------------------------------------ + // Tracking Methods + // ------------------------------------ + virtual DriverPose_t GetPose() = 0; +}; + + + +static const char *ITrackedDeviceServerDriver_Version = "ITrackedDeviceServerDriver_005"; + +} +// ivrdisplaycomponent.h +namespace vr +{ + + + // ---------------------------------------------------------------------------------------------- + // Purpose: The display component on a single tracked device + // ---------------------------------------------------------------------------------------------- + class IVRDisplayComponent + { + public: + + // ------------------------------------ + // Display Methods + // ------------------------------------ + + /** Size and position that the window needs to be on the VR display. */ + virtual void GetWindowBounds( int32_t *pnX, int32_t *pnY, uint32_t *pnWidth, uint32_t *pnHeight ) = 0; + + /** Returns true if the display is extending the desktop. */ + virtual bool IsDisplayOnDesktop( ) = 0; + + /** Returns true if the display is real and not a fictional display. */ + virtual bool IsDisplayRealDisplay( ) = 0; + + /** Suggested size for the intermediate render target that the distortion pulls from. */ + virtual void GetRecommendedRenderTargetSize( uint32_t *pnWidth, uint32_t *pnHeight ) = 0; + + /** Gets the viewport in the frame buffer to draw the output of the distortion into */ + virtual void GetEyeOutputViewport( EVREye eEye, uint32_t *pnX, uint32_t *pnY, uint32_t *pnWidth, uint32_t *pnHeight ) = 0; + + /** The components necessary to build your own projection matrix in case your + * application is doing something fancy like infinite Z */ + virtual void GetProjectionRaw( EVREye eEye, float *pfLeft, float *pfRight, float *pfTop, float *pfBottom ) = 0; + + /** Returns the result of the distortion function for the specified eye and input UVs. UVs go from 0,0 in + * the upper left of that eye's viewport and 1,1 in the lower right of that eye's viewport. */ + virtual DistortionCoordinates_t ComputeDistortion( EVREye eEye, float fU, float fV ) = 0; + + }; + + static const char *IVRDisplayComponent_Version = "IVRDisplayComponent_002"; + +} + +// ivrdriverdirectmodecomponent.h +namespace vr +{ + + + // ---------------------------------------------------------------------------------------------- + // Purpose: This component is used for drivers that implement direct mode entirely on their own + // without allowing the VR Compositor to own the window/device. Chances are you don't + // need to implement this component in your driver. + // ---------------------------------------------------------------------------------------------- + class IVRDriverDirectModeComponent + { + public: + + // ----------------------------------- + // Direct mode methods + // ----------------------------------- + + /** Specific to Oculus compositor support, textures supplied must be created using this method. */ + virtual void CreateSwapTextureSet( uint32_t unPid, uint32_t unFormat, uint32_t unWidth, uint32_t unHeight, vr::SharedTextureHandle_t( *pSharedTextureHandles )[ 3 ] ) {} + + /** Used to textures created using CreateSwapTextureSet. Only one of the set's handles needs to be used to destroy the entire set. */ + virtual void DestroySwapTextureSet( vr::SharedTextureHandle_t sharedTextureHandle ) {} + + /** Used to purge all texture sets for a given process. */ + virtual void DestroyAllSwapTextureSets( uint32_t unPid ) {} + + /** After Present returns, calls this to get the next index to use for rendering. */ + virtual void GetNextSwapTextureSetIndex( vr::SharedTextureHandle_t sharedTextureHandles[ 2 ], uint32_t( *pIndices )[ 2 ] ) {} + + /** Call once per layer to draw for this frame. One shared texture handle per eye. Textures must be created + * using CreateSwapTextureSet and should be alternated per frame. Call Present once all layers have been submitted. */ + virtual void SubmitLayer( vr::SharedTextureHandle_t sharedTextureHandles[ 2 ], const vr::VRTextureBounds_t( &bounds )[ 2 ], const vr::HmdMatrix34_t *pPose ) {} + + /** Submits queued layers for display. */ + virtual void Present( vr::SharedTextureHandle_t syncTexture ) {} + + }; + + static const char *IVRDriverDirectModeComponent_Version = "IVRDriverDirectModeComponent_002"; + +} + +// ivrcontrollercomponent.h +namespace vr +{ + + + // ---------------------------------------------------------------------------------------------- + // Purpose: Controller access on a single tracked device. + // ---------------------------------------------------------------------------------------------- + class IVRControllerComponent + { + public: + + // ------------------------------------ + // Controller Methods + // ------------------------------------ + + /** Gets the current state of a controller. */ + virtual VRControllerState_t GetControllerState( ) = 0; + + /** Returns a uint64 property. If the property is not available this function will return 0. */ + virtual bool TriggerHapticPulse( uint32_t unAxisId, uint16_t usPulseDurationMicroseconds ) = 0; + + }; + + + + static const char *IVRControllerComponent_Version = "IVRControllerComponent_001"; + +} +// ivrcameracomponent.h +namespace vr +{ + //----------------------------------------------------------------------------- + //----------------------------------------------------------------------------- + class ICameraVideoSinkCallback + { + public: + virtual void OnCameraVideoSinkCallback() = 0; + }; + + // ---------------------------------------------------------------------------------------------- + // Purpose: The camera on a single tracked device + // ---------------------------------------------------------------------------------------------- + class IVRCameraComponent + { + public: + // ------------------------------------ + // Camera Methods + // ------------------------------------ + virtual bool GetCameraFrameDimensions( vr::ECameraVideoStreamFormat nVideoStreamFormat, uint32_t *pWidth, uint32_t *pHeight ) = 0; + virtual bool GetCameraFrameBufferingRequirements( int *pDefaultFrameQueueSize, uint32_t *pFrameBufferDataSize ) = 0; + virtual bool SetCameraFrameBuffering( int nFrameBufferCount, void **ppFrameBuffers, uint32_t nFrameBufferDataSize ) = 0; + virtual bool SetCameraVideoStreamFormat( vr::ECameraVideoStreamFormat nVideoStreamFormat ) = 0; + virtual vr::ECameraVideoStreamFormat GetCameraVideoStreamFormat() = 0; + virtual bool StartVideoStream() = 0; + virtual void StopVideoStream() = 0; + virtual bool IsVideoStreamActive( bool *pbPaused, float *pflElapsedTime ) = 0; + virtual const vr::CameraVideoStreamFrame_t *GetVideoStreamFrame() = 0; + virtual void ReleaseVideoStreamFrame( const vr::CameraVideoStreamFrame_t *pFrameImage ) = 0; + virtual bool SetAutoExposure( bool bEnable ) = 0; + virtual bool PauseVideoStream() = 0; + virtual bool ResumeVideoStream() = 0; + virtual bool GetCameraDistortion( float flInputU, float flInputV, float *pflOutputU, float *pflOutputV ) = 0; + virtual bool GetCameraProjection( vr::EVRTrackedCameraFrameType eFrameType, float flZNear, float flZFar, vr::HmdMatrix44_t *pProjection ) = 0; + virtual bool SetFrameRate( int nISPFrameRate, int nSensorFrameRate ) = 0; + virtual bool SetCameraVideoSinkCallback( vr::ICameraVideoSinkCallback *pCameraVideoSinkCallback ) = 0; + virtual bool GetCameraCompatibilityMode( vr::ECameraCompatibilityMode *pCameraCompatibilityMode ) = 0; + virtual bool SetCameraCompatibilityMode( vr::ECameraCompatibilityMode nCameraCompatibilityMode ) = 0; + virtual bool GetCameraFrameBounds( vr::EVRTrackedCameraFrameType eFrameType, uint32_t *pLeft, uint32_t *pTop, uint32_t *pWidth, uint32_t *pHeight ) = 0; + virtual bool GetCameraIntrinsics( vr::EVRTrackedCameraFrameType eFrameType, HmdVector2_t *pFocalLength, HmdVector2_t *pCenter ) = 0; + }; + + static const char *IVRCameraComponent_Version = "IVRCameraComponent_002"; +} +// itrackeddevicedriverprovider.h +namespace vr +{ + +class ITrackedDeviceServerDriver; +struct TrackedDeviceDriverInfo_t; +struct DriverPose_t; +typedef PropertyContainerHandle_t DriverHandle_t; + +/** This interface is provided by vrserver to allow the driver to notify +* the system when something changes about a device. These changes must +* not change the serial number or class of the device because those values +* are permanently associated with the device's index. */ +class IVRDriverContext +{ +public: + /** Returns the requested interface. If the interface was not available it will return NULL and fill + * out the error. */ + virtual void *GetGenericInterface( const char *pchInterfaceVersion, EVRInitError *peError = nullptr ) = 0; + + /** Returns the property container handle for this driver */ + virtual DriverHandle_t GetDriverHandle() = 0; +}; + + +/** This interface must be implemented in each driver. It will be loaded in vrserver.exe */ +class IServerTrackedDeviceProvider +{ +public: + /** initializes the driver. This will be called before any other methods are called. + * If Init returns anything other than VRInitError_None the driver DLL will be unloaded. + * + * pDriverHost will never be NULL, and will always be a pointer to a IServerDriverHost interface + * + * pchUserDriverConfigDir - The absolute path of the directory where the driver should store user + * config files. + * pchDriverInstallDir - The absolute path of the root directory for the driver. + */ + virtual EVRInitError Init( IVRDriverContext *pDriverContext ) = 0; + + /** cleans up the driver right before it is unloaded */ + virtual void Cleanup() = 0; + + /** Returns the version of the ITrackedDeviceServerDriver interface used by this driver */ + virtual const char * const *GetInterfaceVersions() = 0; + + /** Allows the driver do to some work in the main loop of the server. */ + virtual void RunFrame() = 0; + + + // ------------ Power State Functions ----------------------- // + + /** Returns true if the driver wants to block Standby mode. */ + virtual bool ShouldBlockStandbyMode() = 0; + + /** Called when the system is entering Standby mode. The driver should switch itself into whatever sort of low-power + * state it has. */ + virtual void EnterStandby() = 0; + + /** Called when the system is leaving Standby mode. The driver should switch itself back to + full operation. */ + virtual void LeaveStandby() = 0; + +}; + + +static const char *IServerTrackedDeviceProvider_Version = "IServerTrackedDeviceProvider_004"; + + + + +/** This interface must be implemented in each driver. It will be loaded in vrclient.dll */ +class IVRWatchdogProvider +{ +public: + /** initializes the driver in watchdog mode. */ + virtual EVRInitError Init( IVRDriverContext *pDriverContext ) = 0; + + /** cleans up the driver right before it is unloaded */ + virtual void Cleanup() = 0; +}; + +static const char *IVRWatchdogProvider_Version = "IVRWatchdogProvider_001"; + +} +// ivrproperties.h +#include + +namespace vr +{ + + enum EPropertyWriteType + { + PropertyWrite_Set = 0, + PropertyWrite_Erase = 1, + PropertyWrite_SetError = 2 + }; + + struct PropertyWrite_t + { + ETrackedDeviceProperty prop; + EPropertyWriteType writeType; + ETrackedPropertyError eSetError; + void *pvBuffer; + uint32_t unBufferSize; + PropertyTypeTag_t unTag; + ETrackedPropertyError eError; + }; + + struct PropertyRead_t + { + ETrackedDeviceProperty prop; + void *pvBuffer; + uint32_t unBufferSize; + PropertyTypeTag_t unTag; + uint32_t unRequiredBufferSize; + ETrackedPropertyError eError; + }; + + +class IVRProperties +{ +public: + + /** Reads a set of properties atomically. See the PropertyReadBatch_t struct for more information. */ + virtual ETrackedPropertyError ReadPropertyBatch( PropertyContainerHandle_t ulContainerHandle, PropertyRead_t *pBatch, uint32_t unBatchEntryCount ) = 0; + + /** Writes a set of properties atomically. See the PropertyWriteBatch_t struct for more information. */ + virtual ETrackedPropertyError WritePropertyBatch( PropertyContainerHandle_t ulContainerHandle, PropertyWrite_t *pBatch, uint32_t unBatchEntryCount ) = 0; + + /** returns a string that corresponds with the specified property error. The string will be the name + * of the error enum value for all valid error codes */ + virtual const char *GetPropErrorNameFromEnum( ETrackedPropertyError error ) = 0; + + /** Returns a container handle given a tracked device index */ + virtual PropertyContainerHandle_t TrackedDeviceToPropertyContainer( TrackedDeviceIndex_t nDevice ) = 0; + +}; + +static const char * const IVRProperties_Version = "IVRProperties_001"; + +class CVRPropertyHelpers +{ +public: + CVRPropertyHelpers( IVRProperties * pProperties ) : m_pProperties( pProperties ) {} + + /** Returns a scaler property. If the device index is not valid or the property value type does not match, + * this function will return false. */ + bool GetBoolProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ); + float GetFloatProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ); + int32_t GetInt32Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ); + uint64_t GetUint64Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ); + + /** Returns a single typed property. If the device index is not valid or the property is not a string type this function will + * return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing + * null. Strings will always fit in buffers of k_unMaxPropertyStringSize characters. */ + uint32_t GetProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, VR_OUT_STRING() void *pvBuffer, uint32_t unBufferSize, PropertyTypeTag_t *punTag, ETrackedPropertyError *pError = 0L ); + + + /** Returns a string property. If the device index is not valid or the property is not a string type this function will + * return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing + * null. Strings will always fit in buffers of k_unMaxPropertyStringSize characters. */ + uint32_t GetStringProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize, ETrackedPropertyError *pError = 0L ); + + /** Returns a string property as a std::string. If the device index is not valid or the property is not a string type this function will + * return an empty string. */ + std::string GetStringProperty( vr::PropertyContainerHandle_t ulContainer, vr::ETrackedDeviceProperty prop, vr::ETrackedPropertyError *peError = nullptr ); + + /** Sets a scaler property. The new value will be returned on any subsequent call to get this property in any process. */ + ETrackedPropertyError SetBoolProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, bool bNewValue ); + ETrackedPropertyError SetFloatProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, float fNewValue ); + ETrackedPropertyError SetInt32Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, int32_t nNewValue ); + ETrackedPropertyError SetUint64Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, uint64_t ulNewValue ); + + /** Sets a string property. The new value will be returned on any subsequent call to get this property in any process. */ + ETrackedPropertyError SetStringProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, const char *pchNewValue ); + + /** Sets a single typed property. The new value will be returned on any subsequent call to get this property in any process. */ + ETrackedPropertyError SetProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, void *pvNewValue, uint32_t unNewValueSize, PropertyTypeTag_t unTag ); + + /** Sets the error return value for a property. This value will be returned on all subsequent requests to get the property */ + ETrackedPropertyError SetPropertyError( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError eError ); + + /** Clears any value or error set for the property. */ + ETrackedPropertyError EraseProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop ); + + /* Turns a device index into a property container handle. */ + PropertyContainerHandle_t TrackedDeviceToPropertyContainer( TrackedDeviceIndex_t nDevice ) { return m_pProperties->TrackedDeviceToPropertyContainer( nDevice ); } + +private: + template + T GetPropertyHelper( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError, T bDefault, PropertyTypeTag_t unTypeTag ); + + IVRProperties *m_pProperties; +}; + + +inline uint32_t CVRPropertyHelpers::GetProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, VR_OUT_STRING() void *pvBuffer, uint32_t unBufferSize, PropertyTypeTag_t *punTag, ETrackedPropertyError *pError ) +{ + PropertyRead_t batch; + batch.prop = prop; + batch.pvBuffer = pvBuffer; + batch.unBufferSize = unBufferSize; + + m_pProperties->ReadPropertyBatch( ulContainerHandle, &batch, 1 ); + + if ( pError ) + { + *pError = batch.eError; + } + + if ( punTag ) + { + *punTag = batch.unTag; + } + + return batch.unRequiredBufferSize; +} + + +/** Sets a single typed property. The new value will be returned on any subsequent call to get this property in any process. */ +inline ETrackedPropertyError CVRPropertyHelpers::SetProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, void *pvNewValue, uint32_t unNewValueSize, PropertyTypeTag_t unTag ) +{ + PropertyWrite_t batch; + batch.writeType = PropertyWrite_Set; + batch.prop = prop; + batch.pvBuffer = pvNewValue; + batch.unBufferSize = unNewValueSize; + batch.unTag = unTag; + + m_pProperties->WritePropertyBatch( ulContainerHandle, &batch, 1 ); + + return batch.eError; +} + + +/** Returns a string property. If the device index is not valid or the property is not a string type this function will +* return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing +* null. Strings will always fit in buffers of k_unMaxPropertyStringSize characters. */ +inline uint32_t CVRPropertyHelpers::GetStringProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize, ETrackedPropertyError *pError ) +{ + PropertyTypeTag_t unTag; + ETrackedPropertyError error; + uint32_t unRequiredSize = GetProperty( ulContainerHandle, prop, pchValue, unBufferSize, &unTag, &error ); + if ( unTag != k_unStringPropertyTag && error == TrackedProp_Success ) + { + error = TrackedProp_WrongDataType; + } + + if ( pError ) + { + *pError = error; + } + + if ( error != TrackedProp_Success ) + { + if ( pchValue && unBufferSize ) + { + *pchValue = '\0'; + } + } + + return unRequiredSize; +} + + +/** Returns a string property as a std::string. If the device index is not valid or the property is not a string type this function will +* return an empty string. */ +inline std::string CVRPropertyHelpers::GetStringProperty( vr::PropertyContainerHandle_t ulContainer, vr::ETrackedDeviceProperty prop, vr::ETrackedPropertyError *peError ) +{ + char buf[1024]; + vr::ETrackedPropertyError err; + uint32_t unRequiredBufferLen = GetStringProperty( ulContainer, prop, buf, sizeof(buf), &err ); + + std::string sResult; + + if ( err == TrackedProp_Success ) + { + sResult = buf; + } + else if ( err == TrackedProp_BufferTooSmall ) + { + char *pchBuffer = new char[unRequiredBufferLen]; + unRequiredBufferLen = GetStringProperty( ulContainer, prop, pchBuffer, unRequiredBufferLen, &err ); + sResult = pchBuffer; + delete[] pchBuffer; + } + + if ( peError ) + { + *peError = err; + } + + return sResult; +} + + +/** Sets a string property. The new value will be returned on any subsequent call to get this property in any process. */ +inline ETrackedPropertyError CVRPropertyHelpers::SetStringProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, const char *pchNewValue ) +{ + if ( !pchNewValue ) + return TrackedProp_InvalidOperation; + + // this is strlen without the dependency on string.h + const char *pchCurr = pchNewValue; + while ( *pchCurr ) + { + pchCurr++; + } + + return SetProperty( ulContainerHandle, prop, (void *)pchNewValue, (uint32_t)(pchCurr - pchNewValue) + 1, k_unStringPropertyTag ); +} + + +template +inline T CVRPropertyHelpers::GetPropertyHelper( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError, T bDefault, PropertyTypeTag_t unTypeTag ) +{ + T bValue; + ETrackedPropertyError eError; + PropertyTypeTag_t unReadTag; + GetProperty( ulContainerHandle, prop, &bValue, sizeof( bValue ), &unReadTag, &eError ); + if ( unReadTag != unTypeTag && eError == TrackedProp_Success ) + { + eError = TrackedProp_WrongDataType; + }; + + if ( pError ) + *pError = eError; + if ( eError != TrackedProp_Success ) + { + return bDefault; + } + else + { + return bValue; + } +} + + +inline bool CVRPropertyHelpers::GetBoolProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) +{ + return GetPropertyHelper( ulContainerHandle, prop, pError, false, k_unBoolPropertyTag ); +} + + +inline float CVRPropertyHelpers::GetFloatProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) +{ + return GetPropertyHelper( ulContainerHandle, prop, pError, 0.f, k_unFloatPropertyTag ); +} + +inline int32_t CVRPropertyHelpers::GetInt32Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) +{ + return GetPropertyHelper( ulContainerHandle, prop, pError, 0, k_unInt32PropertyTag ); +} + +inline uint64_t CVRPropertyHelpers::GetUint64Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) +{ + return GetPropertyHelper( ulContainerHandle, prop, pError, 0, k_unUint64PropertyTag ); +} + +inline ETrackedPropertyError CVRPropertyHelpers::SetBoolProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, bool bNewValue ) +{ + return SetProperty( ulContainerHandle, prop, &bNewValue, sizeof( bNewValue ), k_unBoolPropertyTag ); +} + +inline ETrackedPropertyError CVRPropertyHelpers::SetFloatProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, float fNewValue ) +{ + return SetProperty( ulContainerHandle, prop, &fNewValue, sizeof( fNewValue ), k_unFloatPropertyTag ); +} + +inline ETrackedPropertyError CVRPropertyHelpers::SetInt32Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, int32_t nNewValue ) +{ + return SetProperty( ulContainerHandle, prop, &nNewValue, sizeof( nNewValue ), k_unInt32PropertyTag ); +} + +inline ETrackedPropertyError CVRPropertyHelpers::SetUint64Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, uint64_t ulNewValue ) +{ + return SetProperty( ulContainerHandle, prop, &ulNewValue, sizeof( ulNewValue ), k_unUint64PropertyTag ); +} + +/** Sets the error return value for a property. This value will be returned on all subsequent requests to get the property */ +inline ETrackedPropertyError CVRPropertyHelpers::SetPropertyError( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError eError ) +{ + PropertyWrite_t batch; + batch.writeType = PropertyWrite_SetError; + batch.prop = prop; + batch.eSetError = eError; + + m_pProperties->WritePropertyBatch( ulContainerHandle, &batch, 1 ); + + return batch.eError; +} + +/** Clears any value or error set for the property. */ +inline ETrackedPropertyError CVRPropertyHelpers::EraseProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop ) +{ + PropertyWrite_t batch; + batch.writeType = PropertyWrite_Erase; + batch.prop = prop; + + m_pProperties->WritePropertyBatch( ulContainerHandle, &batch, 1 ); + + return batch.eError; + +} + +} + + +// ivrdriverlog.h +namespace vr +{ + +class IVRDriverLog +{ +public: + /** Writes a log message to the log file prefixed with the driver name */ + virtual void Log( const char *pchLogMessage ) = 0; +}; + + +static const char *IVRDriverLog_Version = "IVRDriverLog_001"; + +} +// ivrserverdriverhost.h +namespace vr +{ + +class ITrackedDeviceServerDriver; +struct TrackedDeviceDriverInfo_t; +struct DriverPose_t; + +/** This interface is provided by vrserver to allow the driver to notify +* the system when something changes about a device. These changes must +* not change the serial number or class of the device because those values +* are permanently associated with the device's index. */ +class IVRServerDriverHost +{ +public: + /** Notifies the server that a tracked device has been added. If this function returns true + * the server will call Activate on the device. If it returns false some kind of error + * has occurred and the device will not be activated. */ + virtual bool TrackedDeviceAdded( const char *pchDeviceSerialNumber, ETrackedDeviceClass eDeviceClass, ITrackedDeviceServerDriver *pDriver ) = 0; + + /** Notifies the server that a tracked device's pose has been updated */ + virtual void TrackedDevicePoseUpdated( uint32_t unWhichDevice, const DriverPose_t & newPose, uint32_t unPoseStructSize ) = 0; + + /** Notifies the server that vsync has occurred on the the display attached to the device. This is + * only permitted on devices of the HMD class. */ + virtual void VsyncEvent( double vsyncTimeOffsetSeconds ) = 0; + + /** notifies the server that the button was pressed */ + virtual void TrackedDeviceButtonPressed( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0; + + /** notifies the server that the button was unpressed */ + virtual void TrackedDeviceButtonUnpressed( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0; + + /** notifies the server that the button was pressed */ + virtual void TrackedDeviceButtonTouched( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0; + + /** notifies the server that the button was unpressed */ + virtual void TrackedDeviceButtonUntouched( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0; + + /** notifies the server than a controller axis changed */ + virtual void TrackedDeviceAxisUpdated( uint32_t unWhichDevice, uint32_t unWhichAxis, const VRControllerAxis_t & axisState ) = 0; + + /** Notifies the server that the proximity sensor on the specified device */ + virtual void ProximitySensorState( uint32_t unWhichDevice, bool bProximitySensorTriggered ) = 0; + + /** Sends a vendor specific event (VREvent_VendorSpecific_Reserved_Start..VREvent_VendorSpecific_Reserved_End */ + virtual void VendorSpecificEvent( uint32_t unWhichDevice, vr::EVREventType eventType, const VREvent_Data_t & eventData, double eventTimeOffset ) = 0; + + /** Returns true if SteamVR is exiting */ + virtual bool IsExiting() = 0; + + /** Returns true and fills the event with the next event on the queue if there is one. If there are no events + * this method returns false. uncbVREvent should be the size in bytes of the VREvent_t struct */ + virtual bool PollNextEvent( VREvent_t *pEvent, uint32_t uncbVREvent ) = 0; + + /** Provides access to device poses for drivers. Poses are in their "raw" tracking space which is uniquely + * defined by each driver providing poses for its devices. It is up to clients of this function to correlate + * poses across different drivers. Poses are indexed by their device id, and their associated driver and + * other properties can be looked up via IVRProperties. */ + virtual void GetRawTrackedDevicePoses( float fPredictedSecondsFromNow, TrackedDevicePose_t *pTrackedDevicePoseArray, uint32_t unTrackedDevicePoseArrayCount ) = 0; + + /** Notifies the server that a tracked device's display component transforms have been updated. */ + virtual void TrackedDeviceDisplayTransformUpdated( uint32_t unWhichDevice, HmdMatrix34_t eyeToHeadLeft, HmdMatrix34_t eyeToHeadRight ) = 0; +}; + +static const char *IVRServerDriverHost_Version = "IVRServerDriverHost_004"; + +} + +// ivrhiddenarea.h +namespace vr +{ + +class CVRHiddenAreaHelpers +{ +public: + CVRHiddenAreaHelpers( IVRProperties *pProperties ) : m_pProperties( pProperties ) {} + + /** Stores a hidden area mesh in a property */ + ETrackedPropertyError SetHiddenArea( EVREye eEye, EHiddenAreaMeshType type, HmdVector2_t *pVerts, uint32_t unVertCount ); + + /** retrieves a hidden area mesh from a property. Returns the vert count read out of the property. */ + uint32_t GetHiddenArea( EVREye eEye, EHiddenAreaMeshType type, HmdVector2_t *pVerts, uint32_t unVertCount, ETrackedPropertyError *peError ); + +private: + ETrackedDeviceProperty GetPropertyEnum( EVREye eEye, EHiddenAreaMeshType type ) + { + return (ETrackedDeviceProperty)(Prop_DisplayHiddenArea_Binary_Start + ((int)type * 2) + (int)eEye); + } + + IVRProperties *m_pProperties; +}; + + +inline ETrackedPropertyError CVRHiddenAreaHelpers::SetHiddenArea( EVREye eEye, EHiddenAreaMeshType type, HmdVector2_t *pVerts, uint32_t unVertCount ) +{ + ETrackedDeviceProperty prop = GetPropertyEnum( eEye, type ); + CVRPropertyHelpers propHelpers( m_pProperties ); + return propHelpers.SetProperty( propHelpers.TrackedDeviceToPropertyContainer( k_unTrackedDeviceIndex_Hmd ), prop, pVerts, sizeof( HmdVector2_t ) * unVertCount, k_unHiddenAreaPropertyTag ); +} + + +inline uint32_t CVRHiddenAreaHelpers::GetHiddenArea( EVREye eEye, EHiddenAreaMeshType type, HmdVector2_t *pVerts, uint32_t unVertCount, ETrackedPropertyError *peError ) +{ + ETrackedDeviceProperty prop = GetPropertyEnum( eEye, type ); + CVRPropertyHelpers propHelpers( m_pProperties ); + ETrackedPropertyError propError; + PropertyTypeTag_t unTag; + uint32_t unBytesNeeded = propHelpers.GetProperty( propHelpers.TrackedDeviceToPropertyContainer( k_unTrackedDeviceIndex_Hmd ), prop, pVerts, sizeof( HmdVector2_t )*unVertCount, &unTag, &propError ); + if ( propError == TrackedProp_Success && unTag != k_unHiddenAreaPropertyTag ) + { + propError = TrackedProp_WrongDataType; + unBytesNeeded = 0; + } + + if ( peError ) + { + *peError = propError; + } + + return unBytesNeeded / sizeof( HmdVector2_t ); +} + +} +// ivrwatchdoghost.h +namespace vr +{ + +/** This interface is provided by vrclient to allow the driver to make everything wake up */ +class IVRWatchdogHost +{ +public: + /** Client drivers in watchdog mode should call this when they have received a signal from hardware that should + * cause SteamVR to start */ + virtual void WatchdogWakeUp() = 0; +}; + +static const char *IVRWatchdogHost_Version = "IVRWatchdogHost_001"; + +}; + + + +// ivrvirtualdisplay.h +namespace vr +{ + // ---------------------------------------------------------------------------------------------- + // Purpose: This component is used for drivers that implement a virtual display (e.g. wireless). + // ---------------------------------------------------------------------------------------------- + class IVRVirtualDisplay + { + public: + + /** Submits final backbuffer for display. */ + virtual void Present( vr::SharedTextureHandle_t backbufferTextureHandle ) = 0; + + /** Block until the last presented buffer start scanning out. */ + virtual void WaitForPresent() = 0; + + /** Provides timing data for synchronizing with display. */ + virtual bool GetTimeSinceLastVsync( float *pfSecondsSinceLastVsync, uint64_t *pulFrameCounter ) = 0; + }; + + static const char *IVRVirtualDisplay_Version = "IVRVirtualDisplay_001"; + + /** Returns the current IVRVirtualDisplay pointer or NULL the interface could not be found. */ + VR_INTERFACE vr::IVRVirtualDisplay *VR_CALLTYPE VRVirtualDisplay(); +} + + +// ivrresources.h +namespace vr +{ + +class IVRResources +{ +public: + + // ------------------------------------ + // Shared Resource Methods + // ------------------------------------ + + /** Loads the specified resource into the provided buffer if large enough. + * Returns the size in bytes of the buffer required to hold the specified resource. */ + virtual uint32_t LoadSharedResource( const char *pchResourceName, char *pchBuffer, uint32_t unBufferLen ) = 0; + + /** Provides the full path to the specified resource. Resource names can include named directories for + * drivers and other things, and this resolves all of those and returns the actual physical path. + * pchResourceTypeDirectory is the subdirectory of resources to look in. */ + virtual uint32_t GetResourceFullPath( const char *pchResourceName, const char *pchResourceTypeDirectory, char *pchPathBuffer, uint32_t unBufferLen ) = 0; +}; + +static const char * const IVRResources_Version = "IVRResources_001"; + + +} +// ivrdrivermanager.h +namespace vr +{ + +class IVRDriverManager +{ +public: + virtual uint32_t GetDriverCount() const = 0; + + /** Returns the length of the number of bytes necessary to hold this string including the trailing null. */ + virtual uint32_t GetDriverName( vr::DriverId_t nDriver, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize ) = 0; +}; + +static const char * const IVRDriverManager_Version = "IVRDriverManager_001"; + +} // namespace vr + + + + + +namespace vr +{ + static const char * const k_InterfaceVersions[] = + { + IVRSettings_Version, + ITrackedDeviceServerDriver_Version, + IVRDisplayComponent_Version, + IVRDriverDirectModeComponent_Version, + IVRControllerComponent_Version, + IVRCameraComponent_Version, + IServerTrackedDeviceProvider_Version, + IVRWatchdogProvider_Version, + IVRVirtualDisplay_Version, + IVRDriverManager_Version, + IVRResources_Version, + nullptr + }; + + inline IVRDriverContext *&VRDriverContext() + { + static IVRDriverContext *pHost; + return pHost; + } + + class COpenVRDriverContext + { + public: + COpenVRDriverContext() : m_propertyHelpers(nullptr), m_hiddenAreaHelpers(nullptr) { Clear(); } + void Clear(); + + EVRInitError InitServer(); + EVRInitError InitWatchdog(); + + IVRSettings *VRSettings() + { + if ( m_pVRSettings == nullptr ) + { + EVRInitError eError; + m_pVRSettings = (IVRSettings *)VRDriverContext()->GetGenericInterface( IVRSettings_Version, &eError ); + } + return m_pVRSettings; + } + + IVRProperties *VRPropertiesRaw() + { + if ( m_pVRProperties == nullptr ) + { + EVRInitError eError; + m_pVRProperties = (IVRProperties *)VRDriverContext()->GetGenericInterface( IVRProperties_Version, &eError ); + m_propertyHelpers = CVRPropertyHelpers( m_pVRProperties ); + m_hiddenAreaHelpers = CVRHiddenAreaHelpers( m_pVRProperties ); + } + return m_pVRProperties; + } + + CVRPropertyHelpers *VRProperties() + { + VRPropertiesRaw(); + return &m_propertyHelpers; + } + + CVRHiddenAreaHelpers *VRHiddenArea() + { + VRPropertiesRaw(); + return &m_hiddenAreaHelpers; + } + + IVRServerDriverHost *VRServerDriverHost() + { + if ( m_pVRServerDriverHost == nullptr ) + { + EVRInitError eError; + m_pVRServerDriverHost = (IVRServerDriverHost *)VRDriverContext()->GetGenericInterface( IVRServerDriverHost_Version, &eError ); + } + return m_pVRServerDriverHost; + } + + IVRWatchdogHost *VRWatchdogHost() + { + if ( m_pVRWatchdogHost == nullptr ) + { + EVRInitError eError; + m_pVRWatchdogHost = (IVRWatchdogHost *)VRDriverContext()->GetGenericInterface( IVRWatchdogHost_Version, &eError ); + } + return m_pVRWatchdogHost; + } + + IVRDriverLog *VRDriverLog() + { + if ( m_pVRDriverLog == nullptr ) + { + EVRInitError eError; + m_pVRDriverLog = (IVRDriverLog *)VRDriverContext()->GetGenericInterface( IVRDriverLog_Version, &eError ); + } + return m_pVRDriverLog; + } + + DriverHandle_t VR_CALLTYPE VRDriverHandle() + { + return VRDriverContext()->GetDriverHandle(); + } + + IVRDriverManager *VRDriverManager() + { + if ( !m_pVRDriverManager ) + { + EVRInitError eError; + m_pVRDriverManager = (IVRDriverManager *)VRDriverContext()->GetGenericInterface( IVRDriverManager_Version, &eError ); + } + return m_pVRDriverManager; + } + + IVRResources *VRResources() + { + if ( !m_pVRResources ) + { + EVRInitError eError; + m_pVRResources = (IVRResources *)VRDriverContext()->GetGenericInterface( IVRResources_Version, &eError ); + } + return m_pVRResources; + } + + private: + CVRPropertyHelpers m_propertyHelpers; + CVRHiddenAreaHelpers m_hiddenAreaHelpers; + + IVRSettings *m_pVRSettings; + IVRProperties *m_pVRProperties; + IVRServerDriverHost *m_pVRServerDriverHost; + IVRWatchdogHost *m_pVRWatchdogHost; + IVRDriverLog *m_pVRDriverLog; + IVRDriverManager *m_pVRDriverManager; + IVRResources *m_pVRResources; + }; + + inline COpenVRDriverContext &OpenVRInternal_ModuleServerDriverContext() + { + static void *ctx[sizeof( COpenVRDriverContext ) / sizeof( void * )]; + return *(COpenVRDriverContext *)ctx; // bypass zero-init constructor + } + + inline IVRSettings *VR_CALLTYPE VRSettings() { return OpenVRInternal_ModuleServerDriverContext().VRSettings(); } + inline IVRProperties *VR_CALLTYPE VRPropertiesRaw() { return OpenVRInternal_ModuleServerDriverContext().VRPropertiesRaw(); } + inline CVRPropertyHelpers *VR_CALLTYPE VRProperties() { return OpenVRInternal_ModuleServerDriverContext().VRProperties(); } + inline CVRHiddenAreaHelpers *VR_CALLTYPE VRHiddenArea() { return OpenVRInternal_ModuleServerDriverContext().VRHiddenArea(); } + inline IVRDriverLog *VR_CALLTYPE VRDriverLog() { return OpenVRInternal_ModuleServerDriverContext().VRDriverLog(); } + inline IVRServerDriverHost *VR_CALLTYPE VRServerDriverHost() { return OpenVRInternal_ModuleServerDriverContext().VRServerDriverHost(); } + inline IVRWatchdogHost *VR_CALLTYPE VRWatchdogHost() { return OpenVRInternal_ModuleServerDriverContext().VRWatchdogHost(); } + inline DriverHandle_t VR_CALLTYPE VRDriverHandle() { return OpenVRInternal_ModuleServerDriverContext().VRDriverHandle(); } + inline IVRDriverManager *VR_CALLTYPE VRDriverManager() { return OpenVRInternal_ModuleServerDriverContext().VRDriverManager(); } + inline IVRResources *VR_CALLTYPE VRResources() { return OpenVRInternal_ModuleServerDriverContext().VRResources(); } + + inline void COpenVRDriverContext::Clear() + { + m_pVRSettings = nullptr; + m_pVRProperties = nullptr; + m_pVRServerDriverHost = nullptr; + m_pVRDriverLog = nullptr; + m_pVRWatchdogHost = nullptr; + m_pVRDriverManager = nullptr; + m_pVRResources = nullptr; + } + + inline EVRInitError COpenVRDriverContext::InitServer() + { + Clear(); + if ( !VRServerDriverHost() + || !VRSettings() + || !VRProperties() + || !VRDriverLog() + || !VRDriverManager() + || !VRResources() ) + return VRInitError_Init_InterfaceNotFound; + return VRInitError_None; + } + + inline EVRInitError COpenVRDriverContext::InitWatchdog() + { + Clear(); + if ( !VRWatchdogHost() + || !VRSettings() + || !VRDriverLog() ) + return VRInitError_Init_InterfaceNotFound; + return VRInitError_None; + } + + inline EVRInitError InitServerDriverContext( IVRDriverContext *pContext ) + { + VRDriverContext() = pContext; + return OpenVRInternal_ModuleServerDriverContext().InitServer(); + } + + inline EVRInitError InitWatchdogDriverContext( IVRDriverContext *pContext ) + { + VRDriverContext() = pContext; + return OpenVRInternal_ModuleServerDriverContext().InitWatchdog(); + } + + inline void CleanupDriverContext() + { + VRDriverContext() = nullptr; + OpenVRInternal_ModuleServerDriverContext().Clear(); + } + + #define VR_INIT_SERVER_DRIVER_CONTEXT( pContext ) \ + { \ + vr::EVRInitError eError = vr::InitServerDriverContext( pContext ); \ + if( eError != vr::VRInitError_None ) \ + return eError; \ + } + + #define VR_CLEANUP_SERVER_DRIVER_CONTEXT() \ + vr::CleanupDriverContext(); + + #define VR_INIT_WATCHDOG_DRIVER_CONTEXT( pContext ) \ + { \ + vr::EVRInitError eError = vr::InitWatchdogDriverContext( pContext ); \ + if( eError != vr::VRInitError_None ) \ + return eError; \ + } + + #define VR_CLEANUP_WATCHDOG_DRIVER_CONTEXT() \ + vr::CleanupDriverContext(); +} +// End + +#endif // _OPENVR_DRIVER_API + + diff --git a/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/OpenVR b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/OpenVR new file mode 100755 index 0000000000000000000000000000000000000000..1609501c77fcd0497c6c8d0c2c56a1db2a4b547d GIT binary patch literal 1318196 zcmeFa4Vax(bvAqk#&CjzXM(8)r4lu25DG!521qr*96BnaK^aJEVuC<~8X-bP;%7!D zo_WgIv-8wYb2PR|N!#>o+Qu4f2Bw<9Ntn)wG{uOirkcJC5aBsBN`#aINy&TP_u9{y zXMTcM-|xHL_q&oSv(A3@@7inst-bczYd`S(H}1>ja;M<$H2j^K%Qfe66aQog?xu#+ zZ{pTm?(~meOh5dc{CAQ9Cn<1}0w*bOk^(0waFPNiDR7bkCn<1}0w*bOk^(0w@P8Qv z9{j~mpAQ@V+yvl$CjMsSbGfK%8-{9Df_rNc?Tgb*7(-7Tx}-kALLWrHgJ~-u@AIj?QCf^J%$1 z0dD*yp6S2*ODqr81$iLxqML49y6nc=^gXg3EC24a+@(N(zZ8Jf|AjpGy=c)#ufKlL zjVrFdaoO@k%dh*$XgqqqdRlJj++2>oBl4(c#yqaSefe!S-}2GmH#(1LhfmA3zbTjF zZ}wj{Kjd-iEw>L7b#xvZU!Bi=3DO(>qDtfbTePVCmOE~~<%UH!-?HRZ#2B5&%yaU& zp_k=y{LPk~&1})48*f^)Z6B7GKrre}TmZ_%Qq*S%04^N@BsaN}<_ z58_f%4$Nb8Ta2tn^IP({^N|OCPecRcu_W6mM$=-}Tk|3Xf3tW56!f!b(GAxvzi!xP zbRP4NmTke`6ZeUa+kzW+3fUoGx4`*(UtFh z-+PO5-<{66^N?~LLh(EFo(7Ez#!dg70moeYO~D`iCkQs=X5Y5#y5%=r`2J-#-g3@%7Wm`8JpB1L3GTD-yH>vAgOz`m&pkCx z(5vCca@O5i-udD7i*Nke_n*7>6AvFyn~L~noSw_!@6Cv#?~n)k&0_p9Epg4gqJnO7 ze#3yj*Nr+S(j0`!Dl3Hw|?XguD@VTidioAM#Lb!4}LtK8$eCY z4c}XD%jdSjee&N)3Y?_CNeY~#z)1?6q`*lEoTR`>3Y?_CNeY~#z)1?6q`*lEoTR`> z3Y?_CNeY~#z)1?6q`*lE{Qs2#ZSKbj>o(ta?s|DXxA6WY`gcL$oGw)v;n$Q7P785b zn|xc|wHm9jw6aI9xQbn%oVz>z=tm;zPuUvxTa~zcmH()J*u5s;K6^@P6qK` zspBwG(Cv!{ed}S@P%R#1K#gZ`%7uyiB!8xFKZMNO@@b97A3AYaH~x3ZnvSvzlZh(z za1}qH_)RFjw4=e5>2R$_eeq~%VA_Yrqt6Ggy=K+HV>n$)n0o$2-~I*&qRdo6z+&%1!8=a~tyfoi(jGcN)&HK*71w^32>tiThsz)OI82qW*tWbt`*>%T%VR5W31Vxd~lmI^8{luIGHY30=<&xe477 z*LN|0FCM45^O$*jrHW_)On&%>tSFr>n$0|7LKn}Ko6yBAaud3E7GO1+3CN0+`sk`x zlz~2`SG}VAP(|q&S)U%#m5%M>)?+Ty z#Ax4eg-EvNA zC`aFd*E50*g@{Mj)#wnsZjoy%Ts+3ForBX}7xm)PRki`v-c1i+VPz)Gr3uLXQidQp zvZr%1a(oR_)625GL9TkXyU^9+XbrP1?(^#DaryS|o`zw#*SGHTZF^nokZarT0b39F zwgav$@okA~JLuaEy0$~r%WbUaSiO2VXPKOD+wUHCuW<3j%(gNEFqs2dxJTTaypQ

vHyJ@`%}18k7T>#zvUx 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 literal 0 HcmV?d00001 diff --git a/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Resources/Info.plist b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Resources/Info.plist new file mode 100644 index 000000000..50ff90a2c --- /dev/null +++ b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Resources/Info.plist @@ -0,0 +1,18 @@ + + + + + CFBundleIdentifier + com.valvesoftware.OpenVR.framework + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + OpenVR + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1.0 + + diff --git a/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr.h b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr.h new file mode 100644 index 000000000..79abf062a --- /dev/null +++ b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr.h @@ -0,0 +1,3721 @@ +#pragma once + +// openvr.h +//========= Copyright Valve Corporation ============// +// Dynamically generated file. Do not modify this file directly. + +#ifndef _OPENVR_API +#define _OPENVR_API + +#include + + + +// vrtypes.h +#ifndef _INCLUDE_VRTYPES_H +#define _INCLUDE_VRTYPES_H + +// Forward declarations to avoid requiring vulkan.h +struct VkDevice_T; +struct VkPhysicalDevice_T; +struct VkInstance_T; +struct VkQueue_T; + +// Forward declarations to avoid requiring d3d12.h +struct ID3D12Resource; +struct ID3D12CommandQueue; + +namespace vr +{ +#pragma pack( push, 8 ) + +typedef void* glSharedTextureHandle_t; +typedef int32_t glInt_t; +typedef uint32_t glUInt_t; + +// right-handed system +// +y is up +// +x is to the right +// -z is going away from you +// Distance unit is meters +struct HmdMatrix34_t +{ + float m[3][4]; +}; + +struct HmdMatrix44_t +{ + float m[4][4]; +}; + +struct HmdVector3_t +{ + float v[3]; +}; + +struct HmdVector4_t +{ + float v[4]; +}; + +struct HmdVector3d_t +{ + double v[3]; +}; + +struct HmdVector2_t +{ + float v[2]; +}; + +struct HmdQuaternion_t +{ + double w, x, y, z; +}; + +struct HmdColor_t +{ + float r, g, b, a; +}; + +struct HmdQuad_t +{ + HmdVector3_t vCorners[ 4 ]; +}; + +struct HmdRect2_t +{ + HmdVector2_t vTopLeft; + HmdVector2_t vBottomRight; +}; + +/** Used to return the post-distortion UVs for each color channel. +* UVs range from 0 to 1 with 0,0 in the upper left corner of the +* source render target. The 0,0 to 1,1 range covers a single eye. */ +struct DistortionCoordinates_t +{ + float rfRed[2]; + float rfGreen[2]; + float rfBlue[2]; +}; + +enum EVREye +{ + Eye_Left = 0, + Eye_Right = 1 +}; + +enum ETextureType +{ + TextureType_DirectX = 0, // Handle is an ID3D11Texture + TextureType_OpenGL = 1, // Handle is an OpenGL texture name or an OpenGL render buffer name, depending on submit flags + TextureType_Vulkan = 2, // Handle is a pointer to a VRVulkanTextureData_t structure + TextureType_IOSurface = 3, // Handle is a macOS cross-process-sharable IOSurfaceRef + TextureType_DirectX12 = 4, // Handle is a pointer to a D3D12TextureData_t structure +}; + +enum EColorSpace +{ + ColorSpace_Auto = 0, // Assumes 'gamma' for 8-bit per component formats, otherwise 'linear'. This mirrors the DXGI formats which have _SRGB variants. + ColorSpace_Gamma = 1, // Texture data can be displayed directly on the display without any conversion (a.k.a. display native format). + ColorSpace_Linear = 2, // Same as gamma but has been converted to a linear representation using DXGI's sRGB conversion algorithm. +}; + +struct Texture_t +{ + void* handle; // See ETextureType definition above + ETextureType eType; + EColorSpace eColorSpace; +}; + +// Handle to a shared texture (HANDLE on Windows obtained using OpenSharedResource). +typedef uint64_t SharedTextureHandle_t; +#define INVALID_SHARED_TEXTURE_HANDLE ((vr::SharedTextureHandle_t)0) + +enum ETrackingResult +{ + TrackingResult_Uninitialized = 1, + + TrackingResult_Calibrating_InProgress = 100, + TrackingResult_Calibrating_OutOfRange = 101, + + TrackingResult_Running_OK = 200, + TrackingResult_Running_OutOfRange = 201, +}; + +typedef uint32_t DriverId_t; +static const uint32_t k_nDriverNone = 0xFFFFFFFF; + +static const uint32_t k_unMaxDriverDebugResponseSize = 32768; + +/** Used to pass device IDs to API calls */ +typedef uint32_t TrackedDeviceIndex_t; +static const uint32_t k_unTrackedDeviceIndex_Hmd = 0; +static const uint32_t k_unMaxTrackedDeviceCount = 16; +static const uint32_t k_unTrackedDeviceIndexOther = 0xFFFFFFFE; +static const uint32_t k_unTrackedDeviceIndexInvalid = 0xFFFFFFFF; + +/** Describes what kind of object is being tracked at a given ID */ +enum ETrackedDeviceClass +{ + TrackedDeviceClass_Invalid = 0, // the ID was not valid. + TrackedDeviceClass_HMD = 1, // Head-Mounted Displays + TrackedDeviceClass_Controller = 2, // Tracked controllers + TrackedDeviceClass_GenericTracker = 3, // Generic trackers, similar to controllers + TrackedDeviceClass_TrackingReference = 4, // Camera and base stations that serve as tracking reference points + TrackedDeviceClass_DisplayRedirect = 5, // Accessories that aren't necessarily tracked themselves, but may redirect video output from other tracked devices +}; + + +/** Describes what specific role associated with a tracked device */ +enum ETrackedControllerRole +{ + TrackedControllerRole_Invalid = 0, // Invalid value for controller type + TrackedControllerRole_LeftHand = 1, // Tracked device associated with the left hand + TrackedControllerRole_RightHand = 2, // Tracked device associated with the right hand +}; + + +/** describes a single pose for a tracked object */ +struct TrackedDevicePose_t +{ + HmdMatrix34_t mDeviceToAbsoluteTracking; + HmdVector3_t vVelocity; // velocity in tracker space in m/s + HmdVector3_t vAngularVelocity; // angular velocity in radians/s (?) + ETrackingResult eTrackingResult; + bool bPoseIsValid; + + // This indicates that there is a device connected for this spot in the pose array. + // It could go from true to false if the user unplugs the device. + bool bDeviceIsConnected; +}; + +/** Identifies which style of tracking origin the application wants to use +* for the poses it is requesting */ +enum ETrackingUniverseOrigin +{ + TrackingUniverseSeated = 0, // Poses are provided relative to the seated zero pose + TrackingUniverseStanding = 1, // Poses are provided relative to the safe bounds configured by the user + 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. +}; + +// Refers to a single container of properties +typedef uint64_t PropertyContainerHandle_t; +typedef uint32_t PropertyTypeTag_t; + +static const PropertyContainerHandle_t k_ulInvalidPropertyContainer = 0; +static const PropertyTypeTag_t k_unInvalidPropertyTag = 0; + +// Use these tags to set/get common types as struct properties +static const PropertyTypeTag_t k_unFloatPropertyTag = 1; +static const PropertyTypeTag_t k_unInt32PropertyTag = 2; +static const PropertyTypeTag_t k_unUint64PropertyTag = 3; +static const PropertyTypeTag_t k_unBoolPropertyTag = 4; +static const PropertyTypeTag_t k_unStringPropertyTag = 5; + +static const PropertyTypeTag_t k_unHmdMatrix34PropertyTag = 20; +static const PropertyTypeTag_t k_unHmdMatrix44PropertyTag = 21; +static const PropertyTypeTag_t k_unHmdVector3PropertyTag = 22; +static const PropertyTypeTag_t k_unHmdVector4PropertyTag = 23; + +static const PropertyTypeTag_t k_unHiddenAreaPropertyTag = 30; + +static const PropertyTypeTag_t k_unOpenVRInternalReserved_Start = 1000; +static const PropertyTypeTag_t k_unOpenVRInternalReserved_End = 10000; + + +/** Each entry in this enum represents a property that can be retrieved about a +* tracked device. Many fields are only valid for one ETrackedDeviceClass. */ +enum ETrackedDeviceProperty +{ + Prop_Invalid = 0, + + // general properties that apply to all device classes + Prop_TrackingSystemName_String = 1000, + Prop_ModelNumber_String = 1001, + Prop_SerialNumber_String = 1002, + Prop_RenderModelName_String = 1003, + Prop_WillDriftInYaw_Bool = 1004, + Prop_ManufacturerName_String = 1005, + Prop_TrackingFirmwareVersion_String = 1006, + Prop_HardwareRevision_String = 1007, + Prop_AllWirelessDongleDescriptions_String = 1008, + Prop_ConnectedWirelessDongle_String = 1009, + Prop_DeviceIsWireless_Bool = 1010, + Prop_DeviceIsCharging_Bool = 1011, + Prop_DeviceBatteryPercentage_Float = 1012, // 0 is empty, 1 is full + Prop_StatusDisplayTransform_Matrix34 = 1013, + Prop_Firmware_UpdateAvailable_Bool = 1014, + Prop_Firmware_ManualUpdate_Bool = 1015, + Prop_Firmware_ManualUpdateURL_String = 1016, + Prop_HardwareRevision_Uint64 = 1017, + Prop_FirmwareVersion_Uint64 = 1018, + Prop_FPGAVersion_Uint64 = 1019, + Prop_VRCVersion_Uint64 = 1020, + Prop_RadioVersion_Uint64 = 1021, + Prop_DongleVersion_Uint64 = 1022, + Prop_BlockServerShutdown_Bool = 1023, + Prop_CanUnifyCoordinateSystemWithHmd_Bool = 1024, + Prop_ContainsProximitySensor_Bool = 1025, + Prop_DeviceProvidesBatteryStatus_Bool = 1026, + Prop_DeviceCanPowerOff_Bool = 1027, + Prop_Firmware_ProgrammingTarget_String = 1028, + Prop_DeviceClass_Int32 = 1029, + Prop_HasCamera_Bool = 1030, + Prop_DriverVersion_String = 1031, + Prop_Firmware_ForceUpdateRequired_Bool = 1032, + Prop_ViveSystemButtonFixRequired_Bool = 1033, + Prop_ParentDriver_Uint64 = 1034, + Prop_ResourceRoot_String = 1035, + + // Properties that are unique to TrackedDeviceClass_HMD + Prop_ReportsTimeSinceVSync_Bool = 2000, + Prop_SecondsFromVsyncToPhotons_Float = 2001, + Prop_DisplayFrequency_Float = 2002, + Prop_UserIpdMeters_Float = 2003, + Prop_CurrentUniverseId_Uint64 = 2004, + Prop_PreviousUniverseId_Uint64 = 2005, + Prop_DisplayFirmwareVersion_Uint64 = 2006, + Prop_IsOnDesktop_Bool = 2007, + Prop_DisplayMCType_Int32 = 2008, + Prop_DisplayMCOffset_Float = 2009, + Prop_DisplayMCScale_Float = 2010, + Prop_EdidVendorID_Int32 = 2011, + Prop_DisplayMCImageLeft_String = 2012, + Prop_DisplayMCImageRight_String = 2013, + Prop_DisplayGCBlackClamp_Float = 2014, + Prop_EdidProductID_Int32 = 2015, + Prop_CameraToHeadTransform_Matrix34 = 2016, + Prop_DisplayGCType_Int32 = 2017, + Prop_DisplayGCOffset_Float = 2018, + Prop_DisplayGCScale_Float = 2019, + Prop_DisplayGCPrescale_Float = 2020, + Prop_DisplayGCImage_String = 2021, + Prop_LensCenterLeftU_Float = 2022, + Prop_LensCenterLeftV_Float = 2023, + Prop_LensCenterRightU_Float = 2024, + Prop_LensCenterRightV_Float = 2025, + Prop_UserHeadToEyeDepthMeters_Float = 2026, + Prop_CameraFirmwareVersion_Uint64 = 2027, + Prop_CameraFirmwareDescription_String = 2028, + Prop_DisplayFPGAVersion_Uint64 = 2029, + Prop_DisplayBootloaderVersion_Uint64 = 2030, + Prop_DisplayHardwareVersion_Uint64 = 2031, + Prop_AudioFirmwareVersion_Uint64 = 2032, + Prop_CameraCompatibilityMode_Int32 = 2033, + Prop_ScreenshotHorizontalFieldOfViewDegrees_Float = 2034, + Prop_ScreenshotVerticalFieldOfViewDegrees_Float = 2035, + Prop_DisplaySuppressed_Bool = 2036, + Prop_DisplayAllowNightMode_Bool = 2037, + Prop_DisplayMCImageWidth_Int32 = 2038, + Prop_DisplayMCImageHeight_Int32 = 2039, + Prop_DisplayMCImageNumChannels_Int32 = 2040, + Prop_DisplayMCImageData_Binary = 2041, + Prop_SecondsFromPhotonsToVblank_Float = 2042, + Prop_DriverDirectModeSendsVsyncEvents_Bool = 2043, + Prop_DisplayDebugMode_Bool = 2044, + Prop_GraphicsAdapterLuid_Uint64 = 2045, + + // Properties that are unique to TrackedDeviceClass_Controller + Prop_AttachedDeviceId_String = 3000, + Prop_SupportedButtons_Uint64 = 3001, + Prop_Axis0Type_Int32 = 3002, // Return value is of type EVRControllerAxisType + Prop_Axis1Type_Int32 = 3003, // Return value is of type EVRControllerAxisType + Prop_Axis2Type_Int32 = 3004, // Return value is of type EVRControllerAxisType + Prop_Axis3Type_Int32 = 3005, // Return value is of type EVRControllerAxisType + Prop_Axis4Type_Int32 = 3006, // Return value is of type EVRControllerAxisType + Prop_ControllerRoleHint_Int32 = 3007, // Return value is of type ETrackedControllerRole + + // Properties that are unique to TrackedDeviceClass_TrackingReference + Prop_FieldOfViewLeftDegrees_Float = 4000, + Prop_FieldOfViewRightDegrees_Float = 4001, + Prop_FieldOfViewTopDegrees_Float = 4002, + Prop_FieldOfViewBottomDegrees_Float = 4003, + Prop_TrackingRangeMinimumMeters_Float = 4004, + Prop_TrackingRangeMaximumMeters_Float = 4005, + Prop_ModeLabel_String = 4006, + + // Properties that are used for user interface like icons names + Prop_IconPathName_String = 5000, // DEPRECATED. Value not referenced. Now expected to be part of icon path properties. + Prop_NamedIconPathDeviceOff_String = 5001, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceSearching_String = 5002, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceSearchingAlert_String = 5003, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceReady_String = 5004, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceReadyAlert_String = 5005, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceNotReady_String = 5006, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceStandby_String = 5007, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceAlertLow_String = 5008, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + + // Properties that are used by helpers, but are opaque to applications + Prop_DisplayHiddenArea_Binary_Start = 5100, + Prop_DisplayHiddenArea_Binary_End = 5150, + + // Properties that are unique to drivers + Prop_UserConfigPath_String = 6000, + Prop_InstallPath_String = 6001, + Prop_HasDisplayComponent_Bool = 6002, + Prop_HasControllerComponent_Bool = 6003, + Prop_HasCameraComponent_Bool = 6004, + Prop_HasDriverDirectModeComponent_Bool = 6005, + Prop_HasVirtualDisplayComponent_Bool = 6006, + + // Vendors are free to expose private debug data in this reserved region + Prop_VendorSpecific_Reserved_Start = 10000, + Prop_VendorSpecific_Reserved_End = 10999, +}; + +/** No string property will ever be longer than this length */ +static const uint32_t k_unMaxPropertyStringSize = 32 * 1024; + +/** Used to return errors that occur when reading properties. */ +enum ETrackedPropertyError +{ + TrackedProp_Success = 0, + TrackedProp_WrongDataType = 1, + TrackedProp_WrongDeviceClass = 2, + TrackedProp_BufferTooSmall = 3, + TrackedProp_UnknownProperty = 4, // Driver has not set the property (and may not ever). + TrackedProp_InvalidDevice = 5, + TrackedProp_CouldNotContactServer = 6, + TrackedProp_ValueNotProvidedByDevice = 7, + TrackedProp_StringExceedsMaximumLength = 8, + TrackedProp_NotYetAvailable = 9, // The property value isn't known yet, but is expected soon. Call again later. + TrackedProp_PermissionDenied = 10, + TrackedProp_InvalidOperation = 11, +}; + +/** Allows the application to control what part of the provided texture will be used in the +* frame buffer. */ +struct VRTextureBounds_t +{ + float uMin, vMin; + float uMax, vMax; +}; + + +/** Allows the application to control how scene textures are used by the compositor when calling Submit. */ +enum EVRSubmitFlags +{ + // Simple render path. App submits rendered left and right eye images with no lens distortion correction applied. + Submit_Default = 0x00, + + // App submits final left and right eye images with lens distortion already applied (lens distortion makes the images appear + // barrel distorted with chromatic aberration correction applied). The app would have used the data returned by + // vr::IVRSystem::ComputeDistortion() to apply the correct distortion to the rendered images before calling Submit(). + Submit_LensDistortionAlreadyApplied = 0x01, + + // If the texture pointer passed in is actually a renderbuffer (e.g. for MSAA in OpenGL) then set this flag. + Submit_GlRenderBuffer = 0x02, + + // Do not use + Submit_Reserved = 0x04, +}; + +/** Data required for passing Vulkan textures to IVRCompositor::Submit. +* Be sure to call OpenVR_Shutdown before destroying these resources. */ +struct VRVulkanTextureData_t +{ + uint64_t m_nImage; // VkImage + VkDevice_T *m_pDevice; + VkPhysicalDevice_T *m_pPhysicalDevice; + VkInstance_T *m_pInstance; + VkQueue_T *m_pQueue; + uint32_t m_nQueueFamilyIndex; + uint32_t m_nWidth, m_nHeight, m_nFormat, m_nSampleCount; +}; + +/** Data required for passing D3D12 textures to IVRCompositor::Submit. +* Be sure to call OpenVR_Shutdown before destroying these resources. */ +struct D3D12TextureData_t +{ + ID3D12Resource *m_pResource; + ID3D12CommandQueue *m_pCommandQueue; + uint32_t m_nNodeMask; +}; + +/** Status of the overall system or tracked objects */ +enum EVRState +{ + VRState_Undefined = -1, + VRState_Off = 0, + VRState_Searching = 1, + VRState_Searching_Alert = 2, + VRState_Ready = 3, + VRState_Ready_Alert = 4, + VRState_NotReady = 5, + VRState_Standby = 6, + VRState_Ready_Alert_Low = 7, +}; + +/** The types of events that could be posted (and what the parameters mean for each event type) */ +enum EVREventType +{ + VREvent_None = 0, + + VREvent_TrackedDeviceActivated = 100, + VREvent_TrackedDeviceDeactivated = 101, + VREvent_TrackedDeviceUpdated = 102, + VREvent_TrackedDeviceUserInteractionStarted = 103, + VREvent_TrackedDeviceUserInteractionEnded = 104, + VREvent_IpdChanged = 105, + VREvent_EnterStandbyMode = 106, + VREvent_LeaveStandbyMode = 107, + VREvent_TrackedDeviceRoleChanged = 108, + VREvent_WatchdogWakeUpRequested = 109, + VREvent_LensDistortionChanged = 110, + VREvent_PropertyChanged = 111, + + VREvent_ButtonPress = 200, // data is controller + VREvent_ButtonUnpress = 201, // data is controller + VREvent_ButtonTouch = 202, // data is controller + VREvent_ButtonUntouch = 203, // data is controller + + VREvent_MouseMove = 300, // data is mouse + VREvent_MouseButtonDown = 301, // data is mouse + VREvent_MouseButtonUp = 302, // data is mouse + VREvent_FocusEnter = 303, // data is overlay + VREvent_FocusLeave = 304, // data is overlay + VREvent_Scroll = 305, // data is mouse + VREvent_TouchPadMove = 306, // data is mouse + VREvent_OverlayFocusChanged = 307, // data is overlay, global event + + VREvent_InputFocusCaptured = 400, // data is process DEPRECATED + VREvent_InputFocusReleased = 401, // data is process DEPRECATED + VREvent_SceneFocusLost = 402, // data is process + VREvent_SceneFocusGained = 403, // data is process + VREvent_SceneApplicationChanged = 404, // data is process - The App actually drawing the scene changed (usually to or from the compositor) + VREvent_SceneFocusChanged = 405, // data is process - New app got access to draw the scene + VREvent_InputFocusChanged = 406, // data is process + VREvent_SceneApplicationSecondaryRenderingStarted = 407, // data is process + + VREvent_HideRenderModels = 410, // Sent to the scene application to request hiding render models temporarily + VREvent_ShowRenderModels = 411, // Sent to the scene application to request restoring render model visibility + + VREvent_OverlayShown = 500, + VREvent_OverlayHidden = 501, + VREvent_DashboardActivated = 502, + VREvent_DashboardDeactivated = 503, + VREvent_DashboardThumbSelected = 504, // Sent to the overlay manager - data is overlay + VREvent_DashboardRequested = 505, // Sent to the overlay manager - data is overlay + VREvent_ResetDashboard = 506, // Send to the overlay manager + VREvent_RenderToast = 507, // Send to the dashboard to render a toast - data is the notification ID + VREvent_ImageLoaded = 508, // Sent to overlays when a SetOverlayRaw or SetOverlayFromFile call finishes loading + VREvent_ShowKeyboard = 509, // Sent to keyboard renderer in the dashboard to invoke it + VREvent_HideKeyboard = 510, // Sent to keyboard renderer in the dashboard to hide it + VREvent_OverlayGamepadFocusGained = 511, // Sent to an overlay when IVROverlay::SetFocusOverlay is called on it + VREvent_OverlayGamepadFocusLost = 512, // Send to an overlay when it previously had focus and IVROverlay::SetFocusOverlay is called on something else + VREvent_OverlaySharedTextureChanged = 513, + VREvent_DashboardGuideButtonDown = 514, + VREvent_DashboardGuideButtonUp = 515, + VREvent_ScreenshotTriggered = 516, // Screenshot button combo was pressed, Dashboard should request a screenshot + VREvent_ImageFailed = 517, // Sent to overlays when a SetOverlayRaw or SetOverlayfromFail fails to load + VREvent_DashboardOverlayCreated = 518, + + // Screenshot API + VREvent_RequestScreenshot = 520, // Sent by vrclient application to compositor to take a screenshot + VREvent_ScreenshotTaken = 521, // Sent by compositor to the application that the screenshot has been taken + VREvent_ScreenshotFailed = 522, // Sent by compositor to the application that the screenshot failed to be taken + VREvent_SubmitScreenshotToDashboard = 523, // Sent by compositor to the dashboard that a completed screenshot was submitted + VREvent_ScreenshotProgressToDashboard = 524, // Sent by compositor to the dashboard that a completed screenshot was submitted + + VREvent_PrimaryDashboardDeviceChanged = 525, + + VREvent_Notification_Shown = 600, + VREvent_Notification_Hidden = 601, + VREvent_Notification_BeginInteraction = 602, + VREvent_Notification_Destroyed = 603, + + VREvent_Quit = 700, // data is process + VREvent_ProcessQuit = 701, // data is process + VREvent_QuitAborted_UserPrompt = 702, // data is process + VREvent_QuitAcknowledged = 703, // data is process + VREvent_DriverRequestedQuit = 704, // The driver has requested that SteamVR shut down + + VREvent_ChaperoneDataHasChanged = 800, + VREvent_ChaperoneUniverseHasChanged = 801, + VREvent_ChaperoneTempDataHasChanged = 802, + VREvent_ChaperoneSettingsHaveChanged = 803, + VREvent_SeatedZeroPoseReset = 804, + + VREvent_AudioSettingsHaveChanged = 820, + + VREvent_BackgroundSettingHasChanged = 850, + VREvent_CameraSettingsHaveChanged = 851, + VREvent_ReprojectionSettingHasChanged = 852, + VREvent_ModelSkinSettingsHaveChanged = 853, + VREvent_EnvironmentSettingsHaveChanged = 854, + VREvent_PowerSettingsHaveChanged = 855, + VREvent_EnableHomeAppSettingsHaveChanged = 856, + + VREvent_StatusUpdate = 900, + + VREvent_MCImageUpdated = 1000, + + VREvent_FirmwareUpdateStarted = 1100, + VREvent_FirmwareUpdateFinished = 1101, + + VREvent_KeyboardClosed = 1200, + VREvent_KeyboardCharInput = 1201, + VREvent_KeyboardDone = 1202, // Sent when DONE button clicked on keyboard + + VREvent_ApplicationTransitionStarted = 1300, + VREvent_ApplicationTransitionAborted = 1301, + VREvent_ApplicationTransitionNewAppStarted = 1302, + VREvent_ApplicationListUpdated = 1303, + VREvent_ApplicationMimeTypeLoad = 1304, + VREvent_ApplicationTransitionNewAppLaunchComplete = 1305, + VREvent_ProcessConnected = 1306, + VREvent_ProcessDisconnected = 1307, + + VREvent_Compositor_MirrorWindowShown = 1400, + VREvent_Compositor_MirrorWindowHidden = 1401, + VREvent_Compositor_ChaperoneBoundsShown = 1410, + VREvent_Compositor_ChaperoneBoundsHidden = 1411, + + VREvent_TrackedCamera_StartVideoStream = 1500, + VREvent_TrackedCamera_StopVideoStream = 1501, + VREvent_TrackedCamera_PauseVideoStream = 1502, + VREvent_TrackedCamera_ResumeVideoStream = 1503, + VREvent_TrackedCamera_EditingSurface = 1550, + + VREvent_PerformanceTest_EnableCapture = 1600, + VREvent_PerformanceTest_DisableCapture = 1601, + VREvent_PerformanceTest_FidelityLevel = 1602, + + VREvent_MessageOverlay_Closed = 1650, + + // Vendors are free to expose private events in this reserved region + VREvent_VendorSpecific_Reserved_Start = 10000, + VREvent_VendorSpecific_Reserved_End = 19999, +}; + + +/** Level of Hmd activity */ +// UserInteraction_Timeout means the device is in the process of timing out. +// InUse = ( k_EDeviceActivityLevel_UserInteraction || k_EDeviceActivityLevel_UserInteraction_Timeout ) +// VREvent_TrackedDeviceUserInteractionStarted fires when the devices transitions from Standby -> UserInteraction or Idle -> UserInteraction. +// VREvent_TrackedDeviceUserInteractionEnded fires when the devices transitions from UserInteraction_Timeout -> Idle +enum EDeviceActivityLevel +{ + k_EDeviceActivityLevel_Unknown = -1, + k_EDeviceActivityLevel_Idle = 0, // No activity for the last 10 seconds + k_EDeviceActivityLevel_UserInteraction = 1, // Activity (movement or prox sensor) is happening now + k_EDeviceActivityLevel_UserInteraction_Timeout = 2, // No activity for the last 0.5 seconds + k_EDeviceActivityLevel_Standby = 3, // Idle for at least 5 seconds (configurable in Settings -> Power Management) +}; + + +/** VR controller button and axis IDs */ +enum EVRButtonId +{ + k_EButton_System = 0, + k_EButton_ApplicationMenu = 1, + k_EButton_Grip = 2, + k_EButton_DPad_Left = 3, + k_EButton_DPad_Up = 4, + k_EButton_DPad_Right = 5, + k_EButton_DPad_Down = 6, + k_EButton_A = 7, + + k_EButton_ProximitySensor = 31, + + k_EButton_Axis0 = 32, + k_EButton_Axis1 = 33, + k_EButton_Axis2 = 34, + k_EButton_Axis3 = 35, + k_EButton_Axis4 = 36, + + // aliases for well known controllers + k_EButton_SteamVR_Touchpad = k_EButton_Axis0, + k_EButton_SteamVR_Trigger = k_EButton_Axis1, + + k_EButton_Dashboard_Back = k_EButton_Grip, + + k_EButton_Max = 64 +}; + +inline uint64_t ButtonMaskFromId( EVRButtonId id ) { return 1ull << id; } + +/** used for controller button events */ +struct VREvent_Controller_t +{ + uint32_t button; // EVRButtonId enum +}; + + +/** used for simulated mouse events in overlay space */ +enum EVRMouseButton +{ + VRMouseButton_Left = 0x0001, + VRMouseButton_Right = 0x0002, + VRMouseButton_Middle = 0x0004, +}; + + +/** used for simulated mouse events in overlay space */ +struct VREvent_Mouse_t +{ + float x, y; // co-ords are in GL space, bottom left of the texture is 0,0 + uint32_t button; // EVRMouseButton enum +}; + +/** used for simulated mouse wheel scroll in overlay space */ +struct VREvent_Scroll_t +{ + float xdelta, ydelta; // movement in fraction of the pad traversed since last delta, 1.0 for a full swipe + uint32_t repeatCount; +}; + +/** when in mouse input mode you can receive data from the touchpad, these events are only sent if the users finger + is on the touchpad (or just released from it) +**/ +struct VREvent_TouchPadMove_t +{ + // true if the users finger is detected on the touch pad + bool bFingerDown; + + // How long the finger has been down in seconds + float flSecondsFingerDown; + + // These values indicate the starting finger position (so you can do some basic swipe stuff) + float fValueXFirst; + float fValueYFirst; + + // This is the raw sampled coordinate without deadzoning + float fValueXRaw; + float fValueYRaw; +}; + +/** notification related events. Details will still change at this point */ +struct VREvent_Notification_t +{ + uint64_t ulUserValue; + uint32_t notificationId; +}; + +/** Used for events about processes */ +struct VREvent_Process_t +{ + uint32_t pid; + uint32_t oldPid; + bool bForced; +}; + + +/** Used for a few events about overlays */ +struct VREvent_Overlay_t +{ + uint64_t overlayHandle; +}; + + +/** Used for a few events about overlays */ +struct VREvent_Status_t +{ + uint32_t statusState; // EVRState enum +}; + +/** Used for keyboard events **/ +struct VREvent_Keyboard_t +{ + char cNewInput[8]; // Up to 11 bytes of new input + uint64_t uUserValue; // Possible flags about the new input +}; + +struct VREvent_Ipd_t +{ + float ipdMeters; +}; + +struct VREvent_Chaperone_t +{ + uint64_t m_nPreviousUniverse; + uint64_t m_nCurrentUniverse; +}; + +/** Not actually used for any events */ +struct VREvent_Reserved_t +{ + uint64_t reserved0; + uint64_t reserved1; +}; + +struct VREvent_PerformanceTest_t +{ + uint32_t m_nFidelityLevel; +}; + +struct VREvent_SeatedZeroPoseReset_t +{ + bool bResetBySystemMenu; +}; + +struct VREvent_Screenshot_t +{ + uint32_t handle; + uint32_t type; +}; + +struct VREvent_ScreenshotProgress_t +{ + float progress; +}; + +struct VREvent_ApplicationLaunch_t +{ + uint32_t pid; + uint32_t unArgsHandle; +}; + +struct VREvent_EditingCameraSurface_t +{ + uint64_t overlayHandle; + uint32_t nVisualMode; +}; + +struct VREvent_MessageOverlay_t +{ + uint32_t unVRMessageOverlayResponse; // vr::VRMessageOverlayResponse enum +}; + +struct VREvent_Property_t +{ + PropertyContainerHandle_t container; + ETrackedDeviceProperty prop; +}; + +/** NOTE!!! If you change this you MUST manually update openvr_interop.cs.py */ +typedef union +{ + VREvent_Reserved_t reserved; + VREvent_Controller_t controller; + VREvent_Mouse_t mouse; + VREvent_Scroll_t scroll; + VREvent_Process_t process; + VREvent_Notification_t notification; + VREvent_Overlay_t overlay; + VREvent_Status_t status; + VREvent_Keyboard_t keyboard; + VREvent_Ipd_t ipd; + VREvent_Chaperone_t chaperone; + VREvent_PerformanceTest_t performanceTest; + VREvent_TouchPadMove_t touchPadMove; + VREvent_SeatedZeroPoseReset_t seatedZeroPoseReset; + VREvent_Screenshot_t screenshot; + VREvent_ScreenshotProgress_t screenshotProgress; + VREvent_ApplicationLaunch_t applicationLaunch; + VREvent_EditingCameraSurface_t cameraSurface; + VREvent_MessageOverlay_t messageOverlay; + VREvent_Property_t property; +} VREvent_Data_t; + + +#if defined(__linux__) || defined(__APPLE__) +// This structure was originally defined mis-packed on Linux, preserved for +// compatibility. +#pragma pack( push, 4 ) +#endif + +/** An event posted by the server to all running applications */ +struct VREvent_t +{ + uint32_t eventType; // EVREventType enum + TrackedDeviceIndex_t trackedDeviceIndex; + float eventAgeSeconds; + // event data must be the end of the struct as its size is variable + VREvent_Data_t data; +}; + +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( pop ) +#endif + +/** The mesh to draw into the stencil (or depth) buffer to perform +* early stencil (or depth) kills of pixels that will never appear on the HMD. +* This mesh draws on all the pixels that will be hidden after distortion. +* +* If the HMD does not provide a visible area mesh pVertexData will be +* NULL and unTriangleCount will be 0. */ +struct HiddenAreaMesh_t +{ + const HmdVector2_t *pVertexData; + uint32_t unTriangleCount; +}; + + +enum EHiddenAreaMeshType +{ + k_eHiddenAreaMesh_Standard = 0, + k_eHiddenAreaMesh_Inverse = 1, + k_eHiddenAreaMesh_LineLoop = 2, + + k_eHiddenAreaMesh_Max = 3, +}; + + +/** Identifies what kind of axis is on the controller at index n. Read this type +* with pVRSystem->Get( nControllerDeviceIndex, Prop_Axis0Type_Int32 + n ); +*/ +enum EVRControllerAxisType +{ + k_eControllerAxis_None = 0, + k_eControllerAxis_TrackPad = 1, + k_eControllerAxis_Joystick = 2, + k_eControllerAxis_Trigger = 3, // Analog trigger data is in the X axis +}; + + +/** contains information about one axis on the controller */ +struct VRControllerAxis_t +{ + 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. + float y; // Ranges from -1.0 to 1.0 for joysticks and track pads. Is always 0.0 for triggers. +}; + + +/** the number of axes in the controller state */ +static const uint32_t k_unControllerStateAxisCount = 5; + + +#if defined(__linux__) || defined(__APPLE__) +// This structure was originally defined mis-packed on Linux, preserved for +// compatibility. +#pragma pack( push, 4 ) +#endif + +/** Holds all the state of a controller at one moment in time. */ +struct VRControllerState001_t +{ + // If packet num matches that on your prior call, then the controller state hasn't been changed since + // your last call and there is no need to process it + uint32_t unPacketNum; + + // bit flags for each of the buttons. Use ButtonMaskFromId to turn an ID into a mask + uint64_t ulButtonPressed; + uint64_t ulButtonTouched; + + // Axis data for the controller's analog inputs + VRControllerAxis_t rAxis[ k_unControllerStateAxisCount ]; +}; +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( pop ) +#endif + + +typedef VRControllerState001_t VRControllerState_t; + + +/** determines how to provide output to the application of various event processing functions. */ +enum EVRControllerEventOutputType +{ + ControllerEventOutput_OSEvents = 0, + ControllerEventOutput_VREvents = 1, +}; + + + +/** Collision Bounds Style */ +enum ECollisionBoundsStyle +{ + COLLISION_BOUNDS_STYLE_BEGINNER = 0, + COLLISION_BOUNDS_STYLE_INTERMEDIATE, + COLLISION_BOUNDS_STYLE_SQUARES, + COLLISION_BOUNDS_STYLE_ADVANCED, + COLLISION_BOUNDS_STYLE_NONE, + + COLLISION_BOUNDS_STYLE_COUNT +}; + +/** Allows the application to customize how the overlay appears in the compositor */ +struct Compositor_OverlaySettings +{ + uint32_t size; // sizeof(Compositor_OverlaySettings) + bool curved, antialias; + float scale, distance, alpha; + float uOffset, vOffset, uScale, vScale; + float gridDivs, gridWidth, gridScale; + HmdMatrix44_t transform; +}; + +/** used to refer to a single VR overlay */ +typedef uint64_t VROverlayHandle_t; + +static const VROverlayHandle_t k_ulOverlayHandleInvalid = 0; + +/** Errors that can occur around VR overlays */ +enum EVROverlayError +{ + VROverlayError_None = 0, + + VROverlayError_UnknownOverlay = 10, + VROverlayError_InvalidHandle = 11, + VROverlayError_PermissionDenied = 12, + VROverlayError_OverlayLimitExceeded = 13, // No more overlays could be created because the maximum number already exist + VROverlayError_WrongVisibilityType = 14, + VROverlayError_KeyTooLong = 15, + VROverlayError_NameTooLong = 16, + VROverlayError_KeyInUse = 17, + VROverlayError_WrongTransformType = 18, + VROverlayError_InvalidTrackedDevice = 19, + VROverlayError_InvalidParameter = 20, + VROverlayError_ThumbnailCantBeDestroyed = 21, + VROverlayError_ArrayTooSmall = 22, + VROverlayError_RequestFailed = 23, + VROverlayError_InvalidTexture = 24, + VROverlayError_UnableToLoadFile = 25, + VROverlayError_KeyboardAlreadyInUse = 26, + VROverlayError_NoNeighbor = 27, + VROverlayError_TooManyMaskPrimitives = 29, + VROverlayError_BadMaskPrimitive = 30, +}; + +/** enum values to pass in to VR_Init to identify whether the application will +* draw a 3D scene. */ +enum EVRApplicationType +{ + VRApplication_Other = 0, // Some other kind of application that isn't covered by the other entries + VRApplication_Scene = 1, // Application will submit 3D frames + VRApplication_Overlay = 2, // Application only interacts with overlays + VRApplication_Background = 3, // Application should not start SteamVR if it's not already running, and should not + // keep it running if everything else quits. + VRApplication_Utility = 4, // Init should not try to load any drivers. The application needs access to utility + // interfaces (like IVRSettings and IVRApplications) but not hardware. + VRApplication_VRMonitor = 5, // Reserved for vrmonitor + VRApplication_SteamWatchdog = 6,// Reserved for Steam + VRApplication_Bootstrapper = 7, // Start up SteamVR + + VRApplication_Max +}; + + +/** error codes for firmware */ +enum EVRFirmwareError +{ + VRFirmwareError_None = 0, + VRFirmwareError_Success = 1, + VRFirmwareError_Fail = 2, +}; + + +/** error codes for notifications */ +enum EVRNotificationError +{ + VRNotificationError_OK = 0, + VRNotificationError_InvalidNotificationId = 100, + VRNotificationError_NotificationQueueFull = 101, + VRNotificationError_InvalidOverlayHandle = 102, + VRNotificationError_SystemWithUserValueAlreadyExists = 103, +}; + + +/** error codes returned by Vr_Init */ + +// Please add adequate error description to https://developer.valvesoftware.com/w/index.php?title=Category:SteamVRHelp +enum EVRInitError +{ + VRInitError_None = 0, + VRInitError_Unknown = 1, + + VRInitError_Init_InstallationNotFound = 100, + VRInitError_Init_InstallationCorrupt = 101, + VRInitError_Init_VRClientDLLNotFound = 102, + VRInitError_Init_FileNotFound = 103, + VRInitError_Init_FactoryNotFound = 104, + VRInitError_Init_InterfaceNotFound = 105, + VRInitError_Init_InvalidInterface = 106, + VRInitError_Init_UserConfigDirectoryInvalid = 107, + VRInitError_Init_HmdNotFound = 108, + VRInitError_Init_NotInitialized = 109, + VRInitError_Init_PathRegistryNotFound = 110, + VRInitError_Init_NoConfigPath = 111, + VRInitError_Init_NoLogPath = 112, + VRInitError_Init_PathRegistryNotWritable = 113, + VRInitError_Init_AppInfoInitFailed = 114, + VRInitError_Init_Retry = 115, // Used internally to cause retries to vrserver + VRInitError_Init_InitCanceledByUser = 116, // The calling application should silently exit. The user canceled app startup + VRInitError_Init_AnotherAppLaunching = 117, + VRInitError_Init_SettingsInitFailed = 118, + VRInitError_Init_ShuttingDown = 119, + VRInitError_Init_TooManyObjects = 120, + VRInitError_Init_NoServerForBackgroundApp = 121, + VRInitError_Init_NotSupportedWithCompositor = 122, + VRInitError_Init_NotAvailableToUtilityApps = 123, + VRInitError_Init_Internal = 124, + VRInitError_Init_HmdDriverIdIsNone = 125, + VRInitError_Init_HmdNotFoundPresenceFailed = 126, + VRInitError_Init_VRMonitorNotFound = 127, + VRInitError_Init_VRMonitorStartupFailed = 128, + VRInitError_Init_LowPowerWatchdogNotSupported = 129, + VRInitError_Init_InvalidApplicationType = 130, + VRInitError_Init_NotAvailableToWatchdogApps = 131, + VRInitError_Init_WatchdogDisabledInSettings = 132, + VRInitError_Init_VRDashboardNotFound = 133, + VRInitError_Init_VRDashboardStartupFailed = 134, + VRInitError_Init_VRHomeNotFound = 135, + VRInitError_Init_VRHomeStartupFailed = 136, + + VRInitError_Driver_Failed = 200, + VRInitError_Driver_Unknown = 201, + VRInitError_Driver_HmdUnknown = 202, + VRInitError_Driver_NotLoaded = 203, + VRInitError_Driver_RuntimeOutOfDate = 204, + VRInitError_Driver_HmdInUse = 205, + VRInitError_Driver_NotCalibrated = 206, + VRInitError_Driver_CalibrationInvalid = 207, + VRInitError_Driver_HmdDisplayNotFound = 208, + VRInitError_Driver_TrackedDeviceInterfaceUnknown = 209, + // VRInitError_Driver_HmdDisplayNotFoundAfterFix = 210, // not needed: here for historic reasons + VRInitError_Driver_HmdDriverIdOutOfBounds = 211, + VRInitError_Driver_HmdDisplayMirrored = 212, + + VRInitError_IPC_ServerInitFailed = 300, + VRInitError_IPC_ConnectFailed = 301, + VRInitError_IPC_SharedStateInitFailed = 302, + VRInitError_IPC_CompositorInitFailed = 303, + VRInitError_IPC_MutexInitFailed = 304, + VRInitError_IPC_Failed = 305, + VRInitError_IPC_CompositorConnectFailed = 306, + VRInitError_IPC_CompositorInvalidConnectResponse = 307, + VRInitError_IPC_ConnectFailedAfterMultipleAttempts = 308, + + VRInitError_Compositor_Failed = 400, + VRInitError_Compositor_D3D11HardwareRequired = 401, + VRInitError_Compositor_FirmwareRequiresUpdate = 402, + VRInitError_Compositor_OverlayInitFailed = 403, + VRInitError_Compositor_ScreenshotsInitFailed = 404, + VRInitError_Compositor_UnableToCreateDevice = 405, + + VRInitError_VendorSpecific_UnableToConnectToOculusRuntime = 1000, + + VRInitError_VendorSpecific_HmdFound_CantOpenDevice = 1101, + VRInitError_VendorSpecific_HmdFound_UnableToRequestConfigStart = 1102, + VRInitError_VendorSpecific_HmdFound_NoStoredConfig = 1103, + VRInitError_VendorSpecific_HmdFound_ConfigTooBig = 1104, + VRInitError_VendorSpecific_HmdFound_ConfigTooSmall = 1105, + VRInitError_VendorSpecific_HmdFound_UnableToInitZLib = 1106, + VRInitError_VendorSpecific_HmdFound_CantReadFirmwareVersion = 1107, + VRInitError_VendorSpecific_HmdFound_UnableToSendUserDataStart = 1108, + VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataStart = 1109, + VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataNext = 1110, + VRInitError_VendorSpecific_HmdFound_UserDataAddressRange = 1111, + VRInitError_VendorSpecific_HmdFound_UserDataError = 1112, + VRInitError_VendorSpecific_HmdFound_ConfigFailedSanityCheck = 1113, + + VRInitError_Steam_SteamInstallationNotFound = 2000, +}; + +enum EVRScreenshotType +{ + VRScreenshotType_None = 0, + VRScreenshotType_Mono = 1, // left eye only + VRScreenshotType_Stereo = 2, + VRScreenshotType_Cubemap = 3, + VRScreenshotType_MonoPanorama = 4, + VRScreenshotType_StereoPanorama = 5 +}; + +enum EVRScreenshotPropertyFilenames +{ + VRScreenshotPropertyFilenames_Preview = 0, + VRScreenshotPropertyFilenames_VR = 1, +}; + +enum EVRTrackedCameraError +{ + VRTrackedCameraError_None = 0, + VRTrackedCameraError_OperationFailed = 100, + VRTrackedCameraError_InvalidHandle = 101, + VRTrackedCameraError_InvalidFrameHeaderVersion = 102, + VRTrackedCameraError_OutOfHandles = 103, + VRTrackedCameraError_IPCFailure = 104, + VRTrackedCameraError_NotSupportedForThisDevice = 105, + VRTrackedCameraError_SharedMemoryFailure = 106, + VRTrackedCameraError_FrameBufferingFailure = 107, + VRTrackedCameraError_StreamSetupFailure = 108, + VRTrackedCameraError_InvalidGLTextureId = 109, + VRTrackedCameraError_InvalidSharedTextureHandle = 110, + VRTrackedCameraError_FailedToGetGLTextureId = 111, + VRTrackedCameraError_SharedTextureFailure = 112, + VRTrackedCameraError_NoFrameAvailable = 113, + VRTrackedCameraError_InvalidArgument = 114, + VRTrackedCameraError_InvalidFrameBufferSize = 115, +}; + +enum EVRTrackedCameraFrameType +{ + VRTrackedCameraFrameType_Distorted = 0, // This is the camera video frame size in pixels, still distorted. + VRTrackedCameraFrameType_Undistorted, // In pixels, an undistorted inscribed rectangle region without invalid regions. This size is subject to changes shortly. + VRTrackedCameraFrameType_MaximumUndistorted, // In pixels, maximum undistorted with invalid regions. Non zero alpha component identifies valid regions. + MAX_CAMERA_FRAME_TYPES +}; + +typedef uint64_t TrackedCameraHandle_t; +#define INVALID_TRACKED_CAMERA_HANDLE ((vr::TrackedCameraHandle_t)0) + +struct CameraVideoStreamFrameHeader_t +{ + EVRTrackedCameraFrameType eFrameType; + + uint32_t nWidth; + uint32_t nHeight; + uint32_t nBytesPerPixel; + + uint32_t nFrameSequence; + + TrackedDevicePose_t standingTrackedDevicePose; +}; + +// Screenshot types +typedef uint32_t ScreenshotHandle_t; + +static const uint32_t k_unScreenshotHandleInvalid = 0; + +#pragma pack( pop ) + +// figure out how to import from the VR API dll +#if defined(_WIN32) + +#ifdef VR_API_EXPORT +#define VR_INTERFACE extern "C" __declspec( dllexport ) +#else +#define VR_INTERFACE extern "C" __declspec( dllimport ) +#endif + +#elif defined(__GNUC__) || defined(COMPILER_GCC) || defined(__APPLE__) + +#ifdef VR_API_EXPORT +#define VR_INTERFACE extern "C" __attribute__((visibility("default"))) +#else +#define VR_INTERFACE extern "C" +#endif + +#else +#error "Unsupported Platform." +#endif + + +#if defined( _WIN32 ) +#define VR_CALLTYPE __cdecl +#else +#define VR_CALLTYPE +#endif + +} // namespace vr + +#endif // _INCLUDE_VRTYPES_H + + +// vrannotation.h +#ifdef API_GEN +# define VR_CLANG_ATTR(ATTR) __attribute__((annotate( ATTR ))) +#else +# define VR_CLANG_ATTR(ATTR) +#endif + +#define VR_METHOD_DESC(DESC) VR_CLANG_ATTR( "desc:" #DESC ";" ) +#define VR_IGNOREATTR() VR_CLANG_ATTR( "ignore" ) +#define VR_OUT_STRUCT() VR_CLANG_ATTR( "out_struct: ;" ) +#define VR_OUT_STRING() VR_CLANG_ATTR( "out_string: ;" ) +#define VR_OUT_ARRAY_CALL(COUNTER,FUNCTION,PARAMS) VR_CLANG_ATTR( "out_array_call:" #COUNTER "," #FUNCTION "," #PARAMS ";" ) +#define VR_OUT_ARRAY_COUNT(COUNTER) VR_CLANG_ATTR( "out_array_count:" #COUNTER ";" ) +#define VR_ARRAY_COUNT(COUNTER) VR_CLANG_ATTR( "array_count:" #COUNTER ";" ) +#define VR_ARRAY_COUNT_D(COUNTER, DESC) VR_CLANG_ATTR( "array_count:" #COUNTER ";desc:" #DESC ) +#define VR_BUFFER_COUNT(COUNTER) VR_CLANG_ATTR( "buffer_count:" #COUNTER ";" ) +#define VR_OUT_BUFFER_COUNT(COUNTER) VR_CLANG_ATTR( "out_buffer_count:" #COUNTER ";" ) +#define VR_OUT_STRING_COUNT(COUNTER) VR_CLANG_ATTR( "out_string_count:" #COUNTER ";" ) + +// ivrsystem.h +namespace vr +{ + +class IVRSystem +{ +public: + + + // ------------------------------------ + // Display Methods + // ------------------------------------ + + /** Suggested size for the intermediate render target that the distortion pulls from. */ + virtual void GetRecommendedRenderTargetSize( uint32_t *pnWidth, uint32_t *pnHeight ) = 0; + + /** The projection matrix for the specified eye */ + virtual HmdMatrix44_t GetProjectionMatrix( EVREye eEye, float fNearZ, float fFarZ ) = 0; + + /** The components necessary to build your own projection matrix in case your + * application is doing something fancy like infinite Z */ + virtual void GetProjectionRaw( EVREye eEye, float *pfLeft, float *pfRight, float *pfTop, float *pfBottom ) = 0; + + /** Gets the result of the distortion function for the specified eye and input UVs. UVs go from 0,0 in + * the upper left of that eye's viewport and 1,1 in the lower right of that eye's viewport. + * Returns true for success. Otherwise, returns false, and distortion coordinates are not suitable. */ + virtual bool ComputeDistortion( EVREye eEye, float fU, float fV, DistortionCoordinates_t *pDistortionCoordinates ) = 0; + + /** Returns the transform from eye space to the head space. Eye space is the per-eye flavor of head + * space that provides stereo disparity. Instead of Model * View * Projection the sequence is Model * View * Eye^-1 * Projection. + * Normally View and Eye^-1 will be multiplied together and treated as View in your application. + */ + virtual HmdMatrix34_t GetEyeToHeadTransform( EVREye eEye ) = 0; + + /** Returns the number of elapsed seconds since the last recorded vsync event. This + * will come from a vsync timer event in the timer if possible or from the application-reported + * time if that is not available. If no vsync times are available the function will + * return zero for vsync time and frame counter and return false from the method. */ + virtual bool GetTimeSinceLastVsync( float *pfSecondsSinceLastVsync, uint64_t *pulFrameCounter ) = 0; + + /** [D3D9 Only] + * Returns the adapter index that the user should pass into CreateDevice to set up D3D9 in such + * a way that it can go full screen exclusive on the HMD. Returns -1 if there was an error. + */ + virtual int32_t GetD3D9AdapterIndex() = 0; + + /** [D3D10/11 Only] + * Returns the adapter index that the user should pass into EnumAdapters to create the device + * and swap chain in DX10 and DX11. If an error occurs the index will be set to -1. + */ + virtual void GetDXGIOutputInfo( int32_t *pnAdapterIndex ) = 0; + + /** + * Returns platform- and texture-type specific adapter identification so that applications and the + * compositor are creating textures and swap chains on the same GPU. If an error occurs the device + * will be set to 0. + * [D3D10/11/12 Only (D3D9 Not Supported)] + * Returns the adapter LUID that identifies the GPU attached to the HMD. The user should + * enumerate all adapters using IDXGIFactory::EnumAdapters and IDXGIAdapter::GetDesc to find + * the adapter with the matching LUID, or use IDXGIFactory4::EnumAdapterByLuid. + * The discovered IDXGIAdapter should be used to create the device and swap chain. + * [Vulkan Only] + * Returns the vk::PhysicalDevice that should be used by the application. + * [macOS Only] + * Returns an id that should be used by the application. + */ + virtual void GetOutputDevice( uint64_t *pnDevice, ETextureType textureType ) = 0; + + // ------------------------------------ + // Display Mode methods + // ------------------------------------ + + /** Use to determine if the headset display is part of the desktop (i.e. extended) or hidden (i.e. direct mode). */ + virtual bool IsDisplayOnDesktop() = 0; + + /** Set the display visibility (true = extended, false = direct mode). Return value of true indicates that the change was successful. */ + virtual bool SetDisplayVisibility( bool bIsVisibleOnDesktop ) = 0; + + // ------------------------------------ + // Tracking Methods + // ------------------------------------ + + /** The pose that the tracker thinks that the HMD will be in at the specified number of seconds into the + * future. Pass 0 to get the state at the instant the method is called. Most of the time the application should + * calculate the time until the photons will be emitted from the display and pass that time into the method. + * + * This is roughly analogous to the inverse of the view matrix in most applications, though + * many games will need to do some additional rotation or translation on top of the rotation + * and translation provided by the head pose. + * + * For devices where bPoseIsValid is true the application can use the pose to position the device + * in question. The provided array can be any size up to k_unMaxTrackedDeviceCount. + * + * Seated experiences should call this method with TrackingUniverseSeated and receive poses relative + * to the seated zero pose. Standing experiences should call this method with TrackingUniverseStanding + * and receive poses relative to the Chaperone Play Area. TrackingUniverseRawAndUncalibrated should + * probably not be used unless the application is the Chaperone calibration tool itself, but will provide + * poses relative to the hardware-specific coordinate system in the driver. + */ + virtual void GetDeviceToAbsoluteTrackingPose( ETrackingUniverseOrigin eOrigin, float fPredictedSecondsToPhotonsFromNow, VR_ARRAY_COUNT(unTrackedDevicePoseArrayCount) TrackedDevicePose_t *pTrackedDevicePoseArray, uint32_t unTrackedDevicePoseArrayCount ) = 0; + + /** Sets the zero pose for the seated tracker coordinate system to the current position and yaw of the HMD. After + * ResetSeatedZeroPose all GetDeviceToAbsoluteTrackingPose calls that pass TrackingUniverseSeated as the origin + * will be relative to this new zero pose. The new zero coordinate system will not change the fact that the Y axis + * is up in the real world, so the next pose returned from GetDeviceToAbsoluteTrackingPose after a call to + * ResetSeatedZeroPose may not be exactly an identity matrix. + * + * NOTE: This function overrides the user's previously saved seated zero pose and should only be called as the result of a user action. + * Users are also able to set their seated zero pose via the OpenVR Dashboard. + **/ + virtual void ResetSeatedZeroPose() = 0; + + /** Returns the transform from the seated zero pose to the standing absolute tracking system. This allows + * applications to represent the seated origin to used or transform object positions from one coordinate + * system to the other. + * + * The seated origin may or may not be inside the Play Area or Collision Bounds returned by IVRChaperone. Its position + * depends on what the user has set from the Dashboard settings and previous calls to ResetSeatedZeroPose. */ + virtual HmdMatrix34_t GetSeatedZeroPoseToStandingAbsoluteTrackingPose() = 0; + + /** Returns the transform from the tracking origin to the standing absolute tracking system. This allows + * applications to convert from raw tracking space to the calibrated standing coordinate system. */ + virtual HmdMatrix34_t GetRawZeroPoseToStandingAbsoluteTrackingPose() = 0; + + /** Get a sorted array of device indices of a given class of tracked devices (e.g. controllers). Devices are sorted right to left + * relative to the specified tracked device (default: hmd -- pass in -1 for absolute tracking space). Returns the number of devices + * in the list, or the size of the array needed if not large enough. */ + 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; + + /** Returns the level of activity on the device. */ + virtual EDeviceActivityLevel GetTrackedDeviceActivityLevel( vr::TrackedDeviceIndex_t unDeviceId ) = 0; + + /** Convenience utility to apply the specified transform to the specified pose. + * This properly transforms all pose components, including velocity and angular velocity + */ + virtual void ApplyTransform( TrackedDevicePose_t *pOutputPose, const TrackedDevicePose_t *pTrackedDevicePose, const HmdMatrix34_t *pTransform ) = 0; + + /** Returns the device index associated with a specific role, for example the left hand or the right hand. */ + virtual vr::TrackedDeviceIndex_t GetTrackedDeviceIndexForControllerRole( vr::ETrackedControllerRole unDeviceType ) = 0; + + /** Returns the controller type associated with a device index. */ + virtual vr::ETrackedControllerRole GetControllerRoleForTrackedDeviceIndex( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0; + + // ------------------------------------ + // Property methods + // ------------------------------------ + + /** Returns the device class of a tracked device. If there has not been a device connected in this slot + * since the application started this function will return TrackedDevice_Invalid. For previous detected + * devices the function will return the previously observed device class. + * + * To determine which devices exist on the system, just loop from 0 to k_unMaxTrackedDeviceCount and check + * the device class. Every device with something other than TrackedDevice_Invalid is associated with an + * actual tracked device. */ + virtual ETrackedDeviceClass GetTrackedDeviceClass( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0; + + /** Returns true if there is a device connected in this slot. */ + virtual bool IsTrackedDeviceConnected( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0; + + /** Returns a bool property. If the device index is not valid or the property is not a bool type this function will return false. */ + virtual bool GetBoolTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0; + + /** Returns a float property. If the device index is not valid or the property is not a float type this function will return 0. */ + virtual float GetFloatTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0; + + /** Returns an int property. If the device index is not valid or the property is not a int type this function will return 0. */ + virtual int32_t GetInt32TrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0; + + /** Returns a uint64 property. If the device index is not valid or the property is not a uint64 type this function will return 0. */ + virtual uint64_t GetUint64TrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0; + + /** Returns a matrix property. If the device index is not valid or the property is not a matrix type, this function will return identity. */ + virtual HmdMatrix34_t GetMatrix34TrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0; + + /** Returns a string property. If the device index is not valid or the property is not a string type this function will + * return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing + * null. Strings will always fit in buffers of k_unMaxPropertyStringSize characters. */ + virtual uint32_t GetStringTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize, ETrackedPropertyError *pError = 0L ) = 0; + + /** returns a string that corresponds with the specified property error. The string will be the name + * of the error enum value for all valid error codes */ + virtual const char *GetPropErrorNameFromEnum( ETrackedPropertyError error ) = 0; + + // ------------------------------------ + // Event methods + // ------------------------------------ + + /** Returns true and fills the event with the next event on the queue if there is one. If there are no events + * this method returns false. uncbVREvent should be the size in bytes of the VREvent_t struct */ + virtual bool PollNextEvent( VREvent_t *pEvent, uint32_t uncbVREvent ) = 0; + + /** Returns true and fills the event with the next event on the queue if there is one. If there are no events + * this method returns false. Fills in the pose of the associated tracked device in the provided pose struct. + * This pose will always be older than the call to this function and should not be used to render the device. + uncbVREvent should be the size in bytes of the VREvent_t struct */ + virtual bool PollNextEventWithPose( ETrackingUniverseOrigin eOrigin, VREvent_t *pEvent, uint32_t uncbVREvent, vr::TrackedDevicePose_t *pTrackedDevicePose ) = 0; + + /** returns the name of an EVREvent enum value */ + virtual const char *GetEventTypeNameFromEnum( EVREventType eType ) = 0; + + // ------------------------------------ + // Rendering helper methods + // ------------------------------------ + + /** 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 + * 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. + * This mesh is meant to be rendered into the stencil buffer (or into the depth buffer setting nearz) before rendering each eye's view. + * This will improve performance by letting the GPU early-reject pixels the user will never see before running the pixel shader. + * NOTE: Render this mesh with backface culling disabled since the winding order of the vertices can be different per-HMD or per-eye. + * 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. + * 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. + */ + virtual HiddenAreaMesh_t GetHiddenAreaMesh( EVREye eEye, EHiddenAreaMeshType type = k_eHiddenAreaMesh_Standard ) = 0; + + // ------------------------------------ + // Controller methods + // ------------------------------------ + + /** Fills the supplied struct with the current state of the controller. Returns false if the controller index + * is invalid. */ + virtual bool GetControllerState( vr::TrackedDeviceIndex_t unControllerDeviceIndex, vr::VRControllerState_t *pControllerState, uint32_t unControllerStateSize ) = 0; + + /** fills the supplied struct with the current state of the controller and the provided pose with the pose of + * the controller when the controller state was updated most recently. Use this form if you need a precise controller + * pose as input to your application when the user presses or releases a button. */ + virtual bool GetControllerStateWithPose( ETrackingUniverseOrigin eOrigin, vr::TrackedDeviceIndex_t unControllerDeviceIndex, vr::VRControllerState_t *pControllerState, uint32_t unControllerStateSize, TrackedDevicePose_t *pTrackedDevicePose ) = 0; + + /** Trigger a single haptic pulse on a controller. After this call the application may not trigger another haptic pulse on this controller + * and axis combination for 5ms. */ + virtual void TriggerHapticPulse( vr::TrackedDeviceIndex_t unControllerDeviceIndex, uint32_t unAxisId, unsigned short usDurationMicroSec ) = 0; + + /** returns the name of an EVRButtonId enum value */ + virtual const char *GetButtonIdNameFromEnum( EVRButtonId eButtonId ) = 0; + + /** returns the name of an EVRControllerAxisType enum value */ + virtual const char *GetControllerAxisTypeNameFromEnum( EVRControllerAxisType eAxisType ) = 0; + + /** Tells OpenVR that this process wants exclusive access to controller button states and button events. Other apps will be notified that + * they have lost input focus with a VREvent_InputFocusCaptured event. Returns false if input focus could not be captured for + * some reason. */ + virtual bool CaptureInputFocus() = 0; + + /** Tells OpenVR that this process no longer wants exclusive access to button states and button events. Other apps will be notified + * that input focus has been released with a VREvent_InputFocusReleased event. */ + virtual void ReleaseInputFocus() = 0; + + /** Returns true if input focus is captured by another process. */ + virtual bool IsInputFocusCapturedByAnotherProcess() = 0; + + // ------------------------------------ + // Debug Methods + // ------------------------------------ + + /** Sends a request to the driver for the specified device and returns the response. The maximum response size is 32k, + * but this method can be called with a smaller buffer. If the response exceeds the size of the buffer, it is truncated. + * The size of the response including its terminating null is returned. */ + virtual uint32_t DriverDebugRequest( vr::TrackedDeviceIndex_t unDeviceIndex, const char *pchRequest, char *pchResponseBuffer, uint32_t unResponseBufferSize ) = 0; + + // ------------------------------------ + // Firmware methods + // ------------------------------------ + + /** Performs the actual firmware update if applicable. + * The following events will be sent, if VRFirmwareError_None was returned: VREvent_FirmwareUpdateStarted, VREvent_FirmwareUpdateFinished + * Use the properties Prop_Firmware_UpdateAvailable_Bool, Prop_Firmware_ManualUpdate_Bool, and Prop_Firmware_ManualUpdateURL_String + * to figure our whether a firmware update is available, and to figure out whether its a manual update + * Prop_Firmware_ManualUpdateURL_String should point to an URL describing the manual update process */ + virtual vr::EVRFirmwareError PerformFirmwareUpdate( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0; + + // ------------------------------------ + // Application life cycle methods + // ------------------------------------ + + /** Call this to acknowledge to the system that VREvent_Quit has been received and that the process is exiting. + * This extends the timeout until the process is killed. */ + virtual void AcknowledgeQuit_Exiting() = 0; + + /** Call this to tell the system that the user is being prompted to save data. This + * halts the timeout and dismisses the dashboard (if it was up). Applications should be sure to actually + * prompt the user to save and then exit afterward, otherwise the user will be left in a confusing state. */ + virtual void AcknowledgeQuit_UserPrompt() = 0; + +}; + +static const char * const IVRSystem_Version = "IVRSystem_016"; + +} + + +// ivrapplications.h +namespace vr +{ + + /** Used for all errors reported by the IVRApplications interface */ + enum EVRApplicationError + { + VRApplicationError_None = 0, + + VRApplicationError_AppKeyAlreadyExists = 100, // Only one application can use any given key + VRApplicationError_NoManifest = 101, // the running application does not have a manifest + VRApplicationError_NoApplication = 102, // No application is running + VRApplicationError_InvalidIndex = 103, + VRApplicationError_UnknownApplication = 104, // the application could not be found + VRApplicationError_IPCFailed = 105, // An IPC failure caused the request to fail + VRApplicationError_ApplicationAlreadyRunning = 106, + VRApplicationError_InvalidManifest = 107, + VRApplicationError_InvalidApplication = 108, + VRApplicationError_LaunchFailed = 109, // the process didn't start + VRApplicationError_ApplicationAlreadyStarting = 110, // the system was already starting the same application + VRApplicationError_LaunchInProgress = 111, // The system was already starting a different application + VRApplicationError_OldApplicationQuitting = 112, + VRApplicationError_TransitionAborted = 113, + VRApplicationError_IsTemplate = 114, // error when you try to call LaunchApplication() on a template type app (use LaunchTemplateApplication) + + VRApplicationError_BufferTooSmall = 200, // The provided buffer was too small to fit the requested data + VRApplicationError_PropertyNotSet = 201, // The requested property was not set + VRApplicationError_UnknownProperty = 202, + VRApplicationError_InvalidParameter = 203, + }; + + /** The maximum length of an application key */ + static const uint32_t k_unMaxApplicationKeyLength = 128; + + /** these are the properties available on applications. */ + enum EVRApplicationProperty + { + VRApplicationProperty_Name_String = 0, + + VRApplicationProperty_LaunchType_String = 11, + VRApplicationProperty_WorkingDirectory_String = 12, + VRApplicationProperty_BinaryPath_String = 13, + VRApplicationProperty_Arguments_String = 14, + VRApplicationProperty_URL_String = 15, + + VRApplicationProperty_Description_String = 50, + VRApplicationProperty_NewsURL_String = 51, + VRApplicationProperty_ImagePath_String = 52, + VRApplicationProperty_Source_String = 53, + + VRApplicationProperty_IsDashboardOverlay_Bool = 60, + VRApplicationProperty_IsTemplate_Bool = 61, + VRApplicationProperty_IsInstanced_Bool = 62, + VRApplicationProperty_IsInternal_Bool = 63, + + VRApplicationProperty_LastLaunchTime_Uint64 = 70, + }; + + /** These are states the scene application startup process will go through. */ + enum EVRApplicationTransitionState + { + VRApplicationTransition_None = 0, + + VRApplicationTransition_OldAppQuitSent = 10, + VRApplicationTransition_WaitingForExternalLaunch = 11, + + VRApplicationTransition_NewAppLaunched = 20, + }; + + struct AppOverrideKeys_t + { + const char *pchKey; + const char *pchValue; + }; + + /** Currently recognized mime types */ + static const char * const k_pch_MimeType_HomeApp = "vr/home"; + static const char * const k_pch_MimeType_GameTheater = "vr/game_theater"; + + class IVRApplications + { + public: + + // --------------- Application management --------------- // + + /** Adds an application manifest to the list to load when building the list of installed applications. + * Temporary manifests are not automatically loaded */ + virtual EVRApplicationError AddApplicationManifest( const char *pchApplicationManifestFullPath, bool bTemporary = false ) = 0; + + /** Removes an application manifest from the list to load when building the list of installed applications. */ + virtual EVRApplicationError RemoveApplicationManifest( const char *pchApplicationManifestFullPath ) = 0; + + /** Returns true if an application is installed */ + virtual bool IsApplicationInstalled( const char *pchAppKey ) = 0; + + /** Returns the number of applications available in the list */ + virtual uint32_t GetApplicationCount() = 0; + + /** Returns the key of the specified application. The index is at least 0 and is less than the return + * value of GetApplicationCount(). The buffer should be at least k_unMaxApplicationKeyLength in order to + * fit the key. */ + virtual EVRApplicationError GetApplicationKeyByIndex( uint32_t unApplicationIndex, VR_OUT_STRING() char *pchAppKeyBuffer, uint32_t unAppKeyBufferLen ) = 0; + + /** Returns the key of the application for the specified Process Id. The buffer should be at least + * k_unMaxApplicationKeyLength in order to fit the key. */ + virtual EVRApplicationError GetApplicationKeyByProcessId( uint32_t unProcessId, char *pchAppKeyBuffer, uint32_t unAppKeyBufferLen ) = 0; + + /** Launches the application. The existing scene application will exit and then the new application will start. + * This call is not valid for dashboard overlay applications. */ + virtual EVRApplicationError LaunchApplication( const char *pchAppKey ) = 0; + + /** Launches an instance of an application of type template, with its app key being pchNewAppKey (which must be unique) and optionally override sections + * from the manifest file via AppOverrideKeys_t + */ + virtual EVRApplicationError LaunchTemplateApplication( const char *pchTemplateAppKey, const char *pchNewAppKey, VR_ARRAY_COUNT( unKeys ) const AppOverrideKeys_t *pKeys, uint32_t unKeys ) = 0; + + /** 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 */ + virtual vr::EVRApplicationError LaunchApplicationFromMimeType( const char *pchMimeType, const char *pchArgs ) = 0; + + /** Launches the dashboard overlay application if it is not already running. This call is only valid for + * dashboard overlay applications. */ + virtual EVRApplicationError LaunchDashboardOverlay( const char *pchAppKey ) = 0; + + /** Cancel a pending launch for an application */ + virtual bool CancelApplicationLaunch( const char *pchAppKey ) = 0; + + /** Identifies a running application. OpenVR can't always tell which process started in response + * to a URL. This function allows a URL handler (or the process itself) to identify the app key + * for the now running application. Passing a process ID of 0 identifies the calling process. + * The application must be one that's known to the system via a call to AddApplicationManifest. */ + virtual EVRApplicationError IdentifyApplication( uint32_t unProcessId, const char *pchAppKey ) = 0; + + /** Returns the process ID for an application. Return 0 if the application was not found or is not running. */ + virtual uint32_t GetApplicationProcessId( const char *pchAppKey ) = 0; + + /** Returns a string for an applications error */ + virtual const char *GetApplicationsErrorNameFromEnum( EVRApplicationError error ) = 0; + + // --------------- Application properties --------------- // + + /** Returns a value for an application property. The required buffer size to fit this value will be returned. */ + virtual uint32_t GetApplicationPropertyString( const char *pchAppKey, EVRApplicationProperty eProperty, VR_OUT_STRING() char *pchPropertyValueBuffer, uint32_t unPropertyValueBufferLen, EVRApplicationError *peError = nullptr ) = 0; + + /** Returns a bool value for an application property. Returns false in all error cases. */ + virtual bool GetApplicationPropertyBool( const char *pchAppKey, EVRApplicationProperty eProperty, EVRApplicationError *peError = nullptr ) = 0; + + /** Returns a uint64 value for an application property. Returns 0 in all error cases. */ + virtual uint64_t GetApplicationPropertyUint64( const char *pchAppKey, EVRApplicationProperty eProperty, EVRApplicationError *peError = nullptr ) = 0; + + /** Sets the application auto-launch flag. This is only valid for applications which return true for VRApplicationProperty_IsDashboardOverlay_Bool. */ + virtual EVRApplicationError SetApplicationAutoLaunch( const char *pchAppKey, bool bAutoLaunch ) = 0; + + /** Gets the application auto-launch flag. This is only valid for applications which return true for VRApplicationProperty_IsDashboardOverlay_Bool. */ + virtual bool GetApplicationAutoLaunch( const char *pchAppKey ) = 0; + + /** Adds this mime-type to the list of supported mime types for this application*/ + virtual EVRApplicationError SetDefaultApplicationForMimeType( const char *pchAppKey, const char *pchMimeType ) = 0; + + /** return the app key that will open this mime type */ + virtual bool GetDefaultApplicationForMimeType( const char *pchMimeType, char *pchAppKeyBuffer, uint32_t unAppKeyBufferLen ) = 0; + + /** Get the list of supported mime types for this application, comma-delimited */ + virtual bool GetApplicationSupportedMimeTypes( const char *pchAppKey, char *pchMimeTypesBuffer, uint32_t unMimeTypesBuffer ) = 0; + + /** 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 */ + virtual uint32_t GetApplicationsThatSupportMimeType( const char *pchMimeType, char *pchAppKeysThatSupportBuffer, uint32_t unAppKeysThatSupportBuffer ) = 0; + + /** Get the args list from an app launch that had the process already running, you call this when you get a VREvent_ApplicationMimeTypeLoad */ + virtual uint32_t GetApplicationLaunchArguments( uint32_t unHandle, char *pchArgs, uint32_t unArgs ) = 0; + + // --------------- Transition methods --------------- // + + /** Returns the app key for the application that is starting up */ + virtual EVRApplicationError GetStartingApplication( char *pchAppKeyBuffer, uint32_t unAppKeyBufferLen ) = 0; + + /** Returns the application transition state */ + virtual EVRApplicationTransitionState GetTransitionState() = 0; + + /** Returns errors that would prevent the specified application from launching immediately. Calling this function will + * cause the current scene application to quit, so only call it when you are actually about to launch something else. + * What the caller should do about these failures depends on the failure: + * VRApplicationError_OldApplicationQuitting - An existing application has been told to quit. Wait for a VREvent_ProcessQuit + * and try again. + * VRApplicationError_ApplicationAlreadyStarting - This application is already starting. This is a permanent failure. + * VRApplicationError_LaunchInProgress - A different application is already starting. This is a permanent failure. + * VRApplicationError_None - Go ahead and launch. Everything is clear. + */ + virtual EVRApplicationError PerformApplicationPrelaunchCheck( const char *pchAppKey ) = 0; + + /** Returns a string for an application transition state */ + virtual const char *GetApplicationsTransitionStateNameFromEnum( EVRApplicationTransitionState state ) = 0; + + /** Returns true if the outgoing scene app has requested a save prompt before exiting */ + virtual bool IsQuitUserPromptRequested() = 0; + + /** Starts a subprocess within the calling application. This + * suppresses all application transition UI and automatically identifies the new executable + * as part of the same application. On success the calling process should exit immediately. + * If working directory is NULL or "" the directory portion of the binary path will be + * the working directory. */ + virtual EVRApplicationError LaunchInternalProcess( const char *pchBinaryPath, const char *pchArguments, const char *pchWorkingDirectory ) = 0; + + /** Returns the current scene process ID according to the application system. A scene process will get scene + * focus once it starts rendering, but it will appear here once it calls VR_Init with the Scene application + * type. */ + virtual uint32_t GetCurrentSceneProcessId() = 0; + }; + + static const char * const IVRApplications_Version = "IVRApplications_006"; + +} // namespace vr + +// ivrsettings.h +namespace vr +{ + enum EVRSettingsError + { + VRSettingsError_None = 0, + VRSettingsError_IPCFailed = 1, + VRSettingsError_WriteFailed = 2, + VRSettingsError_ReadFailed = 3, + VRSettingsError_JsonParseFailed = 4, + VRSettingsError_UnsetSettingHasNoDefault = 5, // This will be returned if the setting does not appear in the appropriate default file and has not been set + }; + + // The maximum length of a settings key + static const uint32_t k_unMaxSettingsKeyLength = 128; + + class IVRSettings + { + public: + virtual const char *GetSettingsErrorNameFromEnum( EVRSettingsError eError ) = 0; + + // Returns true if file sync occurred (force or settings dirty) + virtual bool Sync( bool bForce = false, EVRSettingsError *peError = nullptr ) = 0; + + virtual void SetBool( const char *pchSection, const char *pchSettingsKey, bool bValue, EVRSettingsError *peError = nullptr ) = 0; + virtual void SetInt32( const char *pchSection, const char *pchSettingsKey, int32_t nValue, EVRSettingsError *peError = nullptr ) = 0; + virtual void SetFloat( const char *pchSection, const char *pchSettingsKey, float flValue, EVRSettingsError *peError = nullptr ) = 0; + virtual void SetString( const char *pchSection, const char *pchSettingsKey, const char *pchValue, EVRSettingsError *peError = nullptr ) = 0; + + // Users of the system need to provide a proper default in default.vrsettings in the resources/settings/ directory + // of either the runtime or the driver_xxx directory. Otherwise the default will be false, 0, 0.0 or "" + virtual bool GetBool( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0; + virtual int32_t GetInt32( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0; + virtual float GetFloat( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0; + virtual void GetString( const char *pchSection, const char *pchSettingsKey, VR_OUT_STRING() char *pchValue, uint32_t unValueLen, EVRSettingsError *peError = nullptr ) = 0; + + virtual void RemoveSection( const char *pchSection, EVRSettingsError *peError = nullptr ) = 0; + virtual void RemoveKeyInSection( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0; + }; + + //----------------------------------------------------------------------------- + static const char * const IVRSettings_Version = "IVRSettings_002"; + + //----------------------------------------------------------------------------- + // steamvr keys + static const char * const k_pch_SteamVR_Section = "steamvr"; + static const char * const k_pch_SteamVR_RequireHmd_String = "requireHmd"; + static const char * const k_pch_SteamVR_ForcedDriverKey_String = "forcedDriver"; + static const char * const k_pch_SteamVR_ForcedHmdKey_String = "forcedHmd"; + static const char * const k_pch_SteamVR_DisplayDebug_Bool = "displayDebug"; + static const char * const k_pch_SteamVR_DebugProcessPipe_String = "debugProcessPipe"; + static const char * const k_pch_SteamVR_DisplayDebugX_Int32 = "displayDebugX"; + static const char * const k_pch_SteamVR_DisplayDebugY_Int32 = "displayDebugY"; + static const char * const k_pch_SteamVR_SendSystemButtonToAllApps_Bool= "sendSystemButtonToAllApps"; + static const char * const k_pch_SteamVR_LogLevel_Int32 = "loglevel"; + static const char * const k_pch_SteamVR_IPD_Float = "ipd"; + static const char * const k_pch_SteamVR_Background_String = "background"; + static const char * const k_pch_SteamVR_BackgroundUseDomeProjection_Bool = "backgroundUseDomeProjection"; + static const char * const k_pch_SteamVR_BackgroundCameraHeight_Float = "backgroundCameraHeight"; + static const char * const k_pch_SteamVR_BackgroundDomeRadius_Float = "backgroundDomeRadius"; + static const char * const k_pch_SteamVR_GridColor_String = "gridColor"; + static const char * const k_pch_SteamVR_PlayAreaColor_String = "playAreaColor"; + static const char * const k_pch_SteamVR_ShowStage_Bool = "showStage"; + static const char * const k_pch_SteamVR_ActivateMultipleDrivers_Bool = "activateMultipleDrivers"; + static const char * const k_pch_SteamVR_DirectMode_Bool = "directMode"; + static const char * const k_pch_SteamVR_DirectModeEdidVid_Int32 = "directModeEdidVid"; + static const char * const k_pch_SteamVR_DirectModeEdidPid_Int32 = "directModeEdidPid"; + static const char * const k_pch_SteamVR_UsingSpeakers_Bool = "usingSpeakers"; + static const char * const k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float = "speakersForwardYawOffsetDegrees"; + static const char * const k_pch_SteamVR_BaseStationPowerManagement_Bool = "basestationPowerManagement"; + static const char * const k_pch_SteamVR_NeverKillProcesses_Bool = "neverKillProcesses"; + static const char * const k_pch_SteamVR_SupersampleScale_Float = "supersampleScale"; + static const char * const k_pch_SteamVR_AllowAsyncReprojection_Bool = "allowAsyncReprojection"; + static const char * const k_pch_SteamVR_AllowReprojection_Bool = "allowInterleavedReprojection"; + static const char * const k_pch_SteamVR_ForceReprojection_Bool = "forceReprojection"; + static const char * const k_pch_SteamVR_ForceFadeOnBadTracking_Bool = "forceFadeOnBadTracking"; + static const char * const k_pch_SteamVR_DefaultMirrorView_Int32 = "defaultMirrorView"; + static const char * const k_pch_SteamVR_ShowMirrorView_Bool = "showMirrorView"; + static const char * const k_pch_SteamVR_MirrorViewGeometry_String = "mirrorViewGeometry"; + static const char * const k_pch_SteamVR_StartMonitorFromAppLaunch = "startMonitorFromAppLaunch"; + static const char * const k_pch_SteamVR_StartCompositorFromAppLaunch_Bool = "startCompositorFromAppLaunch"; + static const char * const k_pch_SteamVR_StartDashboardFromAppLaunch_Bool = "startDashboardFromAppLaunch"; + static const char * const k_pch_SteamVR_StartOverlayAppsFromDashboard_Bool = "startOverlayAppsFromDashboard"; + static const char * const k_pch_SteamVR_EnableHomeApp = "enableHomeApp"; + static const char * const k_pch_SteamVR_CycleBackgroundImageTimeSec_Int32 = "CycleBackgroundImageTimeSec"; + static const char * const k_pch_SteamVR_RetailDemo_Bool = "retailDemo"; + static const char * const k_pch_SteamVR_IpdOffset_Float = "ipdOffset"; + static const char * const k_pch_SteamVR_AllowSupersampleFiltering_Bool = "allowSupersampleFiltering"; + + //----------------------------------------------------------------------------- + // lighthouse keys + static const char * const k_pch_Lighthouse_Section = "driver_lighthouse"; + static const char * const k_pch_Lighthouse_DisableIMU_Bool = "disableimu"; + static const char * const k_pch_Lighthouse_UseDisambiguation_String = "usedisambiguation"; + static const char * const k_pch_Lighthouse_DisambiguationDebug_Int32 = "disambiguationdebug"; + static const char * const k_pch_Lighthouse_PrimaryBasestation_Int32 = "primarybasestation"; + static const char * const k_pch_Lighthouse_DBHistory_Bool = "dbhistory"; + + //----------------------------------------------------------------------------- + // null keys + static const char * const k_pch_Null_Section = "driver_null"; + static const char * const k_pch_Null_SerialNumber_String = "serialNumber"; + static const char * const k_pch_Null_ModelNumber_String = "modelNumber"; + static const char * const k_pch_Null_WindowX_Int32 = "windowX"; + static const char * const k_pch_Null_WindowY_Int32 = "windowY"; + static const char * const k_pch_Null_WindowWidth_Int32 = "windowWidth"; + static const char * const k_pch_Null_WindowHeight_Int32 = "windowHeight"; + static const char * const k_pch_Null_RenderWidth_Int32 = "renderWidth"; + static const char * const k_pch_Null_RenderHeight_Int32 = "renderHeight"; + static const char * const k_pch_Null_SecondsFromVsyncToPhotons_Float = "secondsFromVsyncToPhotons"; + static const char * const k_pch_Null_DisplayFrequency_Float = "displayFrequency"; + + //----------------------------------------------------------------------------- + // user interface keys + static const char * const k_pch_UserInterface_Section = "userinterface"; + static const char * const k_pch_UserInterface_StatusAlwaysOnTop_Bool = "StatusAlwaysOnTop"; + static const char * const k_pch_UserInterface_MinimizeToTray_Bool = "MinimizeToTray"; + static const char * const k_pch_UserInterface_Screenshots_Bool = "screenshots"; + static const char * const k_pch_UserInterface_ScreenshotType_Int = "screenshotType"; + + //----------------------------------------------------------------------------- + // notification keys + static const char * const k_pch_Notifications_Section = "notifications"; + static const char * const k_pch_Notifications_DoNotDisturb_Bool = "DoNotDisturb"; + + //----------------------------------------------------------------------------- + // keyboard keys + static const char * const k_pch_Keyboard_Section = "keyboard"; + static const char * const k_pch_Keyboard_TutorialCompletions = "TutorialCompletions"; + static const char * const k_pch_Keyboard_ScaleX = "ScaleX"; + static const char * const k_pch_Keyboard_ScaleY = "ScaleY"; + static const char * const k_pch_Keyboard_OffsetLeftX = "OffsetLeftX"; + static const char * const k_pch_Keyboard_OffsetRightX = "OffsetRightX"; + static const char * const k_pch_Keyboard_OffsetY = "OffsetY"; + static const char * const k_pch_Keyboard_Smoothing = "Smoothing"; + + //----------------------------------------------------------------------------- + // perf keys + static const char * const k_pch_Perf_Section = "perfcheck"; + static const char * const k_pch_Perf_HeuristicActive_Bool = "heuristicActive"; + static const char * const k_pch_Perf_NotifyInHMD_Bool = "warnInHMD"; + static const char * const k_pch_Perf_NotifyOnlyOnce_Bool = "warnOnlyOnce"; + static const char * const k_pch_Perf_AllowTimingStore_Bool = "allowTimingStore"; + static const char * const k_pch_Perf_SaveTimingsOnExit_Bool = "saveTimingsOnExit"; + static const char * const k_pch_Perf_TestData_Float = "perfTestData"; + static const char * const k_pch_Perf_LinuxGPUProfiling_Bool = "linuxGPUProfiling"; + + //----------------------------------------------------------------------------- + // collision bounds keys + static const char * const k_pch_CollisionBounds_Section = "collisionBounds"; + static const char * const k_pch_CollisionBounds_Style_Int32 = "CollisionBoundsStyle"; + static const char * const k_pch_CollisionBounds_GroundPerimeterOn_Bool = "CollisionBoundsGroundPerimeterOn"; + static const char * const k_pch_CollisionBounds_CenterMarkerOn_Bool = "CollisionBoundsCenterMarkerOn"; + static const char * const k_pch_CollisionBounds_PlaySpaceOn_Bool = "CollisionBoundsPlaySpaceOn"; + static const char * const k_pch_CollisionBounds_FadeDistance_Float = "CollisionBoundsFadeDistance"; + static const char * const k_pch_CollisionBounds_ColorGammaR_Int32 = "CollisionBoundsColorGammaR"; + static const char * const k_pch_CollisionBounds_ColorGammaG_Int32 = "CollisionBoundsColorGammaG"; + static const char * const k_pch_CollisionBounds_ColorGammaB_Int32 = "CollisionBoundsColorGammaB"; + static const char * const k_pch_CollisionBounds_ColorGammaA_Int32 = "CollisionBoundsColorGammaA"; + + //----------------------------------------------------------------------------- + // camera keys + static const char * const k_pch_Camera_Section = "camera"; + static const char * const k_pch_Camera_EnableCamera_Bool = "enableCamera"; + static const char * const k_pch_Camera_EnableCameraInDashboard_Bool = "enableCameraInDashboard"; + static const char * const k_pch_Camera_EnableCameraForCollisionBounds_Bool = "enableCameraForCollisionBounds"; + static const char * const k_pch_Camera_EnableCameraForRoomView_Bool = "enableCameraForRoomView"; + static const char * const k_pch_Camera_BoundsColorGammaR_Int32 = "cameraBoundsColorGammaR"; + static const char * const k_pch_Camera_BoundsColorGammaG_Int32 = "cameraBoundsColorGammaG"; + static const char * const k_pch_Camera_BoundsColorGammaB_Int32 = "cameraBoundsColorGammaB"; + static const char * const k_pch_Camera_BoundsColorGammaA_Int32 = "cameraBoundsColorGammaA"; + static const char * const k_pch_Camera_BoundsStrength_Int32 = "cameraBoundsStrength"; + + //----------------------------------------------------------------------------- + // audio keys + static const char * const k_pch_audio_Section = "audio"; + static const char * const k_pch_audio_OnPlaybackDevice_String = "onPlaybackDevice"; + static const char * const k_pch_audio_OnRecordDevice_String = "onRecordDevice"; + static const char * const k_pch_audio_OnPlaybackMirrorDevice_String = "onPlaybackMirrorDevice"; + static const char * const k_pch_audio_OffPlaybackDevice_String = "offPlaybackDevice"; + static const char * const k_pch_audio_OffRecordDevice_String = "offRecordDevice"; + static const char * const k_pch_audio_VIVEHDMIGain = "viveHDMIGain"; + + //----------------------------------------------------------------------------- + // power management keys + static const char * const k_pch_Power_Section = "power"; + static const char * const k_pch_Power_PowerOffOnExit_Bool = "powerOffOnExit"; + static const char * const k_pch_Power_TurnOffScreensTimeout_Float = "turnOffScreensTimeout"; + static const char * const k_pch_Power_TurnOffControllersTimeout_Float = "turnOffControllersTimeout"; + static const char * const k_pch_Power_ReturnToWatchdogTimeout_Float = "returnToWatchdogTimeout"; + static const char * const k_pch_Power_AutoLaunchSteamVROnButtonPress = "autoLaunchSteamVROnButtonPress"; + + //----------------------------------------------------------------------------- + // dashboard keys + static const char * const k_pch_Dashboard_Section = "dashboard"; + static const char * const k_pch_Dashboard_EnableDashboard_Bool = "enableDashboard"; + static const char * const k_pch_Dashboard_ArcadeMode_Bool = "arcadeMode"; + + //----------------------------------------------------------------------------- + // model skin keys + static const char * const k_pch_modelskin_Section = "modelskins"; + + //----------------------------------------------------------------------------- + // driver keys - These could be checked in any driver_ section + static const char * const k_pch_Driver_Enable_Bool = "enable"; + +} // namespace vr + +// ivrchaperone.h +namespace vr +{ + +#pragma pack( push, 8 ) + +enum ChaperoneCalibrationState +{ + // OK! + ChaperoneCalibrationState_OK = 1, // Chaperone is fully calibrated and working correctly + + // Warnings + ChaperoneCalibrationState_Warning = 100, + ChaperoneCalibrationState_Warning_BaseStationMayHaveMoved = 101, // A base station thinks that it might have moved + ChaperoneCalibrationState_Warning_BaseStationRemoved = 102, // There are less base stations than when calibrated + ChaperoneCalibrationState_Warning_SeatedBoundsInvalid = 103, // Seated bounds haven't been calibrated for the current tracking center + + // Errors + ChaperoneCalibrationState_Error = 200, // The UniverseID is invalid + ChaperoneCalibrationState_Error_BaseStationUninitialized = 201, // Tracking center hasn't be calibrated for at least one of the base stations + ChaperoneCalibrationState_Error_BaseStationConflict = 202, // Tracking center is calibrated, but base stations disagree on the tracking space + ChaperoneCalibrationState_Error_PlayAreaInvalid = 203, // Play Area hasn't been calibrated for the current tracking center + ChaperoneCalibrationState_Error_CollisionBoundsInvalid = 204, // Collision Bounds haven't been calibrated for the current tracking center +}; + + +/** HIGH LEVEL TRACKING SPACE ASSUMPTIONS: +* 0,0,0 is the preferred standing area center. +* 0Y is the floor height. +* -Z is the preferred forward facing direction. */ +class IVRChaperone +{ +public: + + /** Get the current state of Chaperone calibration. This state can change at any time during a session due to physical base station changes. **/ + virtual ChaperoneCalibrationState GetCalibrationState() = 0; + + /** Returns the width and depth of the Play Area (formerly named Soft Bounds) in X and Z. + * Tracking space center (0,0,0) is the center of the Play Area. **/ + virtual bool GetPlayAreaSize( float *pSizeX, float *pSizeZ ) = 0; + + /** Returns the 4 corner positions of the Play Area (formerly named Soft Bounds). + * Corners are in counter-clockwise order. + * Standing center (0,0,0) is the center of the Play Area. + * It's a rectangle. + * 2 sides are parallel to the X axis and 2 sides are parallel to the Z axis. + * Height of every corner is 0Y (on the floor). **/ + virtual bool GetPlayAreaRect( HmdQuad_t *rect ) = 0; + + /** Reload Chaperone data from the .vrchap file on disk. */ + virtual void ReloadInfo( void ) = 0; + + /** Optionally give the chaperone system a hit about the color and brightness in the scene **/ + virtual void SetSceneColor( HmdColor_t color ) = 0; + + /** Get the current chaperone bounds draw color and brightness **/ + virtual void GetBoundsColor( HmdColor_t *pOutputColorArray, int nNumOutputColors, float flCollisionBoundsFadeDistance, HmdColor_t *pOutputCameraColor ) = 0; + + /** Determine whether the bounds are showing right now **/ + virtual bool AreBoundsVisible() = 0; + + /** Force the bounds to show, mostly for utilities **/ + virtual void ForceBoundsVisible( bool bForce ) = 0; +}; + +static const char * const IVRChaperone_Version = "IVRChaperone_003"; + +#pragma pack( pop ) + +} + +// ivrchaperonesetup.h +namespace vr +{ + +enum EChaperoneConfigFile +{ + EChaperoneConfigFile_Live = 1, // The live chaperone config, used by most applications and games + EChaperoneConfigFile_Temp = 2, // The temporary chaperone config, used to live-preview collision bounds in room setup +}; + +enum EChaperoneImportFlags +{ + EChaperoneImport_BoundsOnly = 0x0001, +}; + +/** Manages the working copy of the chaperone info. By default this will be the same as the +* live copy. Any changes made with this interface will stay in the working copy until +* CommitWorkingCopy() is called, at which point the working copy and the live copy will be +* the same again. */ +class IVRChaperoneSetup +{ +public: + + /** Saves the current working copy to disk */ + virtual bool CommitWorkingCopy( EChaperoneConfigFile configFile ) = 0; + + /** Reverts the working copy to match the live chaperone calibration. + * To modify existing data this MUST be do WHILE getting a non-error ChaperoneCalibrationStatus. + * Only after this should you do gets and sets on the existing data. */ + virtual void RevertWorkingCopy() = 0; + + /** Returns the width and depth of the Play Area (formerly named Soft Bounds) in X and Z from the working copy. + * Tracking space center (0,0,0) is the center of the Play Area. */ + virtual bool GetWorkingPlayAreaSize( float *pSizeX, float *pSizeZ ) = 0; + + /** Returns the 4 corner positions of the Play Area (formerly named Soft Bounds) from the working copy. + * Corners are in clockwise order. + * Tracking space center (0,0,0) is the center of the Play Area. + * It's a rectangle. + * 2 sides are parallel to the X axis and 2 sides are parallel to the Z axis. + * Height of every corner is 0Y (on the floor). **/ + virtual bool GetWorkingPlayAreaRect( HmdQuad_t *rect ) = 0; + + /** Returns the number of Quads if the buffer points to null. Otherwise it returns Quads + * into the buffer up to the max specified from the working copy. */ + virtual bool GetWorkingCollisionBoundsInfo( VR_OUT_ARRAY_COUNT(punQuadsCount) HmdQuad_t *pQuadsBuffer, uint32_t* punQuadsCount ) = 0; + + /** Returns the number of Quads if the buffer points to null. Otherwise it returns Quads + * into the buffer up to the max specified. */ + virtual bool GetLiveCollisionBoundsInfo( VR_OUT_ARRAY_COUNT(punQuadsCount) HmdQuad_t *pQuadsBuffer, uint32_t* punQuadsCount ) = 0; + + /** Returns the preferred seated position from the working copy. */ + virtual bool GetWorkingSeatedZeroPoseToRawTrackingPose( HmdMatrix34_t *pmatSeatedZeroPoseToRawTrackingPose ) = 0; + + /** Returns the standing origin from the working copy. */ + virtual bool GetWorkingStandingZeroPoseToRawTrackingPose( HmdMatrix34_t *pmatStandingZeroPoseToRawTrackingPose ) = 0; + + /** Sets the Play Area in the working copy. */ + virtual void SetWorkingPlayAreaSize( float sizeX, float sizeZ ) = 0; + + /** Sets the Collision Bounds in the working copy. */ + virtual void SetWorkingCollisionBoundsInfo( VR_ARRAY_COUNT(unQuadsCount) HmdQuad_t *pQuadsBuffer, uint32_t unQuadsCount ) = 0; + + /** Sets the preferred seated position in the working copy. */ + virtual void SetWorkingSeatedZeroPoseToRawTrackingPose( const HmdMatrix34_t *pMatSeatedZeroPoseToRawTrackingPose ) = 0; + + /** Sets the preferred standing position in the working copy. */ + virtual void SetWorkingStandingZeroPoseToRawTrackingPose( const HmdMatrix34_t *pMatStandingZeroPoseToRawTrackingPose ) = 0; + + /** Tear everything down and reload it from the file on disk */ + virtual void ReloadFromDisk( EChaperoneConfigFile configFile ) = 0; + + /** Returns the preferred seated position. */ + virtual bool GetLiveSeatedZeroPoseToRawTrackingPose( HmdMatrix34_t *pmatSeatedZeroPoseToRawTrackingPose ) = 0; + + virtual void SetWorkingCollisionBoundsTagsInfo( VR_ARRAY_COUNT(unTagCount) uint8_t *pTagsBuffer, uint32_t unTagCount ) = 0; + virtual bool GetLiveCollisionBoundsTagsInfo( VR_OUT_ARRAY_COUNT(punTagCount) uint8_t *pTagsBuffer, uint32_t *punTagCount ) = 0; + + virtual bool SetWorkingPhysicalBoundsInfo( VR_ARRAY_COUNT(unQuadsCount) HmdQuad_t *pQuadsBuffer, uint32_t unQuadsCount ) = 0; + virtual bool GetLivePhysicalBoundsInfo( VR_OUT_ARRAY_COUNT(punQuadsCount) HmdQuad_t *pQuadsBuffer, uint32_t* punQuadsCount ) = 0; + + virtual bool ExportLiveToBuffer( VR_OUT_STRING() char *pBuffer, uint32_t *pnBufferLength ) = 0; + virtual bool ImportFromBufferToWorking( const char *pBuffer, uint32_t nImportFlags ) = 0; +}; + +static const char * const IVRChaperoneSetup_Version = "IVRChaperoneSetup_005"; + + +} + +// ivrcompositor.h +namespace vr +{ + +#pragma pack( push, 8 ) + +/** Errors that can occur with the VR compositor */ +enum EVRCompositorError +{ + VRCompositorError_None = 0, + VRCompositorError_RequestFailed = 1, + VRCompositorError_IncompatibleVersion = 100, + VRCompositorError_DoNotHaveFocus = 101, + VRCompositorError_InvalidTexture = 102, + VRCompositorError_IsNotSceneApplication = 103, + VRCompositorError_TextureIsOnWrongDevice = 104, + VRCompositorError_TextureUsesUnsupportedFormat = 105, + VRCompositorError_SharedTexturesNotSupported = 106, + VRCompositorError_IndexOutOfRange = 107, + VRCompositorError_AlreadySubmitted = 108, +}; + +const uint32_t VRCompositor_ReprojectionReason_Cpu = 0x01; +const uint32_t VRCompositor_ReprojectionReason_Gpu = 0x02; +const uint32_t VRCompositor_ReprojectionAsync = 0x04; // This flag indicates the async reprojection mode is active, + // but does not indicate if reprojection actually happened or not. + // Use the ReprojectionReason flags above to check if reprojection + // was actually applied (i.e. scene texture was reused). + // NumFramePresents > 1 also indicates the scene texture was reused, + // and also the number of times that it was presented in total. + +/** Provides a single frame's timing information to the app */ +struct Compositor_FrameTiming +{ + uint32_t m_nSize; // Set to sizeof( Compositor_FrameTiming ) + uint32_t m_nFrameIndex; + uint32_t m_nNumFramePresents; // number of times this frame was presented + uint32_t m_nNumMisPresented; // number of times this frame was presented on a vsync other than it was originally predicted to + uint32_t m_nNumDroppedFrames; // number of additional times previous frame was scanned out + uint32_t m_nReprojectionFlags; + + /** Absolute time reference for comparing frames. This aligns with the vsync that running start is relative to. */ + double m_flSystemTimeInSeconds; + + /** These times may include work from other processes due to OS scheduling. + * The fewer packets of work these are broken up into, the less likely this will happen. + * GPU work can be broken up by calling Flush. This can sometimes be useful to get the GPU started + * processing that work earlier in the frame. */ + float m_flPreSubmitGpuMs; // time spent rendering the scene (gpu work submitted between WaitGetPoses and second Submit) + float m_flPostSubmitGpuMs; // additional time spent rendering by application (e.g. companion window) + float m_flTotalRenderGpuMs; // time between work submitted immediately after present (ideally vsync) until the end of compositor submitted work + float m_flCompositorRenderGpuMs; // time spend performing distortion correction, rendering chaperone, overlays, etc. + float m_flCompositorRenderCpuMs; // time spent on cpu submitting the above work for this frame + float m_flCompositorIdleCpuMs; // time spent waiting for running start (application could have used this much more time) + + /** Miscellaneous measured intervals. */ + float m_flClientFrameIntervalMs; // time between calls to WaitGetPoses + float m_flPresentCallCpuMs; // time blocked on call to present (usually 0.0, but can go long) + float m_flWaitForPresentCpuMs; // time spent spin-waiting for frame index to change (not near-zero indicates wait object failure) + float m_flSubmitFrameMs; // time spent in IVRCompositor::Submit (not near-zero indicates driver issue) + + /** The following are all relative to this frame's SystemTimeInSeconds */ + float m_flWaitGetPosesCalledMs; + float m_flNewPosesReadyMs; + float m_flNewFrameReadyMs; // second call to IVRCompositor::Submit + float m_flCompositorUpdateStartMs; + float m_flCompositorUpdateEndMs; + float m_flCompositorRenderStartMs; + + vr::TrackedDevicePose_t m_HmdPose; // pose used by app to render this frame +}; + +/** Cumulative stats for current application. These are not cleared until a new app connects, +* but they do stop accumulating once the associated app disconnects. */ +struct Compositor_CumulativeStats +{ + uint32_t m_nPid; // Process id associated with these stats (may no longer be running). + uint32_t m_nNumFramePresents; // total number of times we called present (includes reprojected frames) + uint32_t m_nNumDroppedFrames; // total number of times an old frame was re-scanned out (without reprojection) + uint32_t m_nNumReprojectedFrames; // total number of times a frame was scanned out a second time (with reprojection) + + /** Values recorded at startup before application has fully faded in the first time. */ + uint32_t m_nNumFramePresentsOnStartup; + uint32_t m_nNumDroppedFramesOnStartup; + uint32_t m_nNumReprojectedFramesOnStartup; + + /** Applications may explicitly fade to the compositor. This is usually to handle level transitions, and loading often causes + * system wide hitches. The following stats are collected during this period. Does not include values recorded during startup. */ + uint32_t m_nNumLoading; + uint32_t m_nNumFramePresentsLoading; + uint32_t m_nNumDroppedFramesLoading; + uint32_t m_nNumReprojectedFramesLoading; + + /** 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 + * fading back to the compositor. The following stats are a result of this, and are a subset of those recorded above. + * Does not include values recorded during start up or loading. */ + uint32_t m_nNumTimedOut; + uint32_t m_nNumFramePresentsTimedOut; + uint32_t m_nNumDroppedFramesTimedOut; + uint32_t m_nNumReprojectedFramesTimedOut; +}; + +#pragma pack( pop ) + +/** Allows the application to interact with the compositor */ +class IVRCompositor +{ +public: + /** Sets tracking space returned by WaitGetPoses */ + virtual void SetTrackingSpace( ETrackingUniverseOrigin eOrigin ) = 0; + + /** Gets current tracking space returned by WaitGetPoses */ + virtual ETrackingUniverseOrigin GetTrackingSpace() = 0; + + /** Scene applications should call this function to get poses to render with (and optionally poses predicted an additional frame out to use for gameplay). + * 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 + * start rendering. + * + * Return codes: + * - IsNotSceneApplication (make sure to call VR_Init with VRApplicaiton_Scene) + * - DoNotHaveFocus (some other app has taken focus - this will throttle the call to 10hz to reduce the impact on that app) + */ + virtual EVRCompositorError WaitGetPoses( VR_ARRAY_COUNT(unRenderPoseArrayCount) TrackedDevicePose_t* pRenderPoseArray, uint32_t unRenderPoseArrayCount, + VR_ARRAY_COUNT(unGamePoseArrayCount) TrackedDevicePose_t* pGamePoseArray, uint32_t unGamePoseArrayCount ) = 0; + + /** Get the last set of poses returned by WaitGetPoses. */ + virtual EVRCompositorError GetLastPoses( VR_ARRAY_COUNT( unRenderPoseArrayCount ) TrackedDevicePose_t* pRenderPoseArray, uint32_t unRenderPoseArrayCount, + VR_ARRAY_COUNT( unGamePoseArrayCount ) TrackedDevicePose_t* pGamePoseArray, uint32_t unGamePoseArrayCount ) = 0; + + /** Interface for accessing last set of poses returned by WaitGetPoses one at a time. + * Returns VRCompositorError_IndexOutOfRange if unDeviceIndex not less than k_unMaxTrackedDeviceCount otherwise VRCompositorError_None. + * It is okay to pass NULL for either pose if you only want one of the values. */ + virtual EVRCompositorError GetLastPoseForTrackedDeviceIndex( TrackedDeviceIndex_t unDeviceIndex, TrackedDevicePose_t *pOutputPose, TrackedDevicePose_t *pOutputGamePose ) = 0; + + /** 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 + * 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. + * + * OpenGL dirty state: + * glBindTexture + * + * Return codes: + * - IsNotSceneApplication (make sure to call VR_Init with VRApplicaiton_Scene) + * - DoNotHaveFocus (some other app has taken focus) + * - TextureIsOnWrongDevice (application did not use proper AdapterIndex - see IVRSystem.GetDXGIOutputInfo) + * - SharedTexturesNotSupported (application needs to call CreateDXGIFactory1 or later before creating DX device) + * - TextureUsesUnsupportedFormat (scene textures must be compatible with DXGI sharing rules - e.g. uncompressed, no mips, etc.) + * - InvalidTexture (usually means bad arguments passed in) + * - AlreadySubmitted (app has submitted two left textures or two right textures in a single frame - i.e. before calling WaitGetPoses again) + */ + virtual EVRCompositorError Submit( EVREye eEye, const Texture_t *pTexture, const VRTextureBounds_t* pBounds = 0, EVRSubmitFlags nSubmitFlags = Submit_Default ) = 0; + + /** Clears the frame that was sent with the last call to Submit. This will cause the + * compositor to show the grid until Submit is called again. */ + virtual void ClearLastSubmittedFrame() = 0; + + /** Call immediately after presenting your app's window (i.e. companion window) to unblock the compositor. + * This is an optional call, which only needs to be used if you can't instead call WaitGetPoses immediately after Present. + * 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 + * introduce a deadlock of some sort. This function tells the compositor that you have finished all rendering after having Submitted buffers for both + * eyes, and it is free to start its rendering work. This should only be called from the same thread you are rendering on. */ + virtual void PostPresentHandoff() = 0; + + /** Returns true if timing data is filled it. Sets oldest timing info if nFramesAgo is larger than the stored history. + * Be sure to set timing.size = sizeof(Compositor_FrameTiming) on struct passed in before calling this function. */ + virtual bool GetFrameTiming( Compositor_FrameTiming *pTiming, uint32_t unFramesAgo = 0 ) = 0; + + /** 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. + * 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. */ + virtual uint32_t GetFrameTimings( Compositor_FrameTiming *pTiming, uint32_t nFrames ) = 0; + + /** Returns the time in seconds left in the current (as identified by FrameTiming's frameIndex) frame. + * Due to "running start", this value may roll over to the next frame before ever reaching 0.0. */ + virtual float GetFrameTimeRemaining() = 0; + + /** Fills out stats accumulated for the last connected application. Pass in sizeof( Compositor_CumulativeStats ) as second parameter. */ + virtual void GetCumulativeStats( Compositor_CumulativeStats *pStats, uint32_t nStatsSizeInBytes ) = 0; + + /** Fades the view on the HMD to the specified color. The fade will take fSeconds, and the color values are between + * 0.0 and 1.0. This color is faded on top of the scene based on the alpha parameter. Removing the fade color instantly + * would be FadeToColor( 0.0, 0.0, 0.0, 0.0, 0.0 ). Values are in un-premultiplied alpha space. */ + virtual void FadeToColor( float fSeconds, float fRed, float fGreen, float fBlue, float fAlpha, bool bBackground = false ) = 0; + + /** Get current fade color value. */ + virtual HmdColor_t GetCurrentFadeColor( bool bBackground = false ) = 0; + + /** Fading the Grid in or out in fSeconds */ + virtual void FadeGrid( float fSeconds, bool bFadeIn ) = 0; + + /** Get current alpha value of grid. */ + virtual float GetCurrentGridAlpha() = 0; + + /** Override the skybox used in the compositor (e.g. for during level loads when the app can't feed scene images fast enough) + * Order is Front, Back, Left, Right, Top, Bottom. If only a single texture is passed, it is assumed in lat-long format. + * If two are passed, it is assumed a lat-long stereo pair. */ + virtual EVRCompositorError SetSkyboxOverride( VR_ARRAY_COUNT( unTextureCount ) const Texture_t *pTextures, uint32_t unTextureCount ) = 0; + + /** Resets compositor skybox back to defaults. */ + virtual void ClearSkyboxOverride() = 0; + + /** Brings the compositor window to the front. This is useful for covering any other window that may be on the HMD + * and is obscuring the compositor window. */ + virtual void CompositorBringToFront() = 0; + + /** Pushes the compositor window to the back. This is useful for allowing other applications to draw directly to the HMD. */ + virtual void CompositorGoToBack() = 0; + + /** Tells the compositor process to clean up and exit. You do not need to call this function at shutdown. Under normal + * circumstances the compositor will manage its own life cycle based on what applications are running. */ + virtual void CompositorQuit() = 0; + + /** Return whether the compositor is fullscreen */ + virtual bool IsFullscreen() = 0; + + /** Returns the process ID of the process that is currently rendering the scene */ + virtual uint32_t GetCurrentSceneFocusProcess() = 0; + + /** Returns the process ID of the process that rendered the last frame (or 0 if the compositor itself rendered the frame.) + * Returns 0 when fading out from an app and the app's process Id when fading into an app. */ + virtual uint32_t GetLastFrameRenderer() = 0; + + /** Returns true if the current process has the scene focus */ + virtual bool CanRenderScene() = 0; + + /** Creates a window on the primary monitor to display what is being shown in the headset. */ + virtual void ShowMirrorWindow() = 0; + + /** Closes the mirror window. */ + virtual void HideMirrorWindow() = 0; + + /** Returns true if the mirror window is shown. */ + virtual bool IsMirrorWindowVisible() = 0; + + /** Writes all images that the compositor knows about (including overlays) to a 'screenshots' folder in the SteamVR runtime root. */ + virtual void CompositorDumpImages() = 0; + + /** Let an app know it should be rendering with low resources. */ + virtual bool ShouldAppRenderWithLowResources() = 0; + + /** Override interleaved reprojection logic to force on. */ + virtual void ForceInterleavedReprojectionOn( bool bOverride ) = 0; + + /** Force reconnecting to the compositor process. */ + virtual void ForceReconnectProcess() = 0; + + /** Temporarily suspends rendering (useful for finer control over scene transitions). */ + virtual void SuspendRendering( bool bSuspend ) = 0; + + /** Opens a shared D3D11 texture with the undistorted composited image for each eye. Use ReleaseMirrorTextureD3D11 when finished + * instead of calling Release on the resource itself. */ + virtual vr::EVRCompositorError GetMirrorTextureD3D11( vr::EVREye eEye, void *pD3D11DeviceOrResource, void **ppD3D11ShaderResourceView ) = 0; + virtual void ReleaseMirrorTextureD3D11( void *pD3D11ShaderResourceView ) = 0; + + /** Access to mirror textures from OpenGL. */ + virtual vr::EVRCompositorError GetMirrorTextureGL( vr::EVREye eEye, vr::glUInt_t *pglTextureId, vr::glSharedTextureHandle_t *pglSharedTextureHandle ) = 0; + virtual bool ReleaseSharedGLTexture( vr::glUInt_t glTextureId, vr::glSharedTextureHandle_t glSharedTextureHandle ) = 0; + virtual void LockGLSharedTextureForAccess( vr::glSharedTextureHandle_t glSharedTextureHandle ) = 0; + virtual void UnlockGLSharedTextureForAccess( vr::glSharedTextureHandle_t glSharedTextureHandle ) = 0; + + /** [Vulkan Only] + * return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing + * null. The string will be a space separated list of-required instance extensions to enable in VkCreateInstance */ + virtual uint32_t GetVulkanInstanceExtensionsRequired( VR_OUT_STRING() char *pchValue, uint32_t unBufferSize ) = 0; + + /** [Vulkan only] + * return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing + * null. The string will be a space separated list of required device extensions to enable in VkCreateDevice */ + virtual uint32_t GetVulkanDeviceExtensionsRequired( VkPhysicalDevice_T *pPhysicalDevice, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize ) = 0; + +}; + +static const char * const IVRCompositor_Version = "IVRCompositor_020"; + +} // namespace vr + + + +// ivrnotifications.h +namespace vr +{ + +#pragma pack( push, 8 ) + +// Used for passing graphic data +struct NotificationBitmap_t +{ + NotificationBitmap_t() + : m_pImageData( nullptr ) + , m_nWidth( 0 ) + , m_nHeight( 0 ) + , m_nBytesPerPixel( 0 ) + { + }; + + void *m_pImageData; + int32_t m_nWidth; + int32_t m_nHeight; + int32_t m_nBytesPerPixel; +}; + + +/** Be aware that the notification type is used as 'priority' to pick the next notification */ +enum EVRNotificationType +{ + /** Transient notifications are automatically hidden after a period of time set by the user. + * They are used for things like information and chat messages that do not require user interaction. */ + EVRNotificationType_Transient = 0, + + /** Persistent notifications are shown to the user until they are hidden by calling RemoveNotification(). + * They are used for things like phone calls and alarms that require user interaction. */ + EVRNotificationType_Persistent = 1, + + /** System notifications are shown no matter what. It is expected, that the ulUserValue is used as ID. + * If there is already a system notification in the queue with that ID it is not accepted into the queue + * to prevent spamming with system notification */ + EVRNotificationType_Transient_SystemWithUserValue = 2, +}; + +enum EVRNotificationStyle +{ + /** Creates a notification with minimal external styling. */ + EVRNotificationStyle_None = 0, + + /** Used for notifications about overlay-level status. In Steam this is used for events like downloads completing. */ + EVRNotificationStyle_Application = 100, + + /** Used for notifications about contacts that are unknown or not available. In Steam this is used for friend invitations and offline friends. */ + EVRNotificationStyle_Contact_Disabled = 200, + + /** 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. */ + EVRNotificationStyle_Contact_Enabled = 201, + + /** 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. */ + EVRNotificationStyle_Contact_Active = 202, +}; + +static const uint32_t k_unNotificationTextMaxSize = 256; + +typedef uint32_t VRNotificationId; + + + +#pragma pack( pop ) + +/** Allows notification sources to interact with the VR system + This current interface is not yet implemented. Do not use yet. */ +class IVRNotifications +{ +public: + /** Create a notification and enqueue it to be shown to the user. + * An overlay handle is required to create a notification, as otherwise it would be impossible for a user to act on it. + * To create a two-line notification, use a line break ('\n') to split the text into two lines. + * The pImage argument may be NULL, in which case the specified overlay's icon will be used instead. */ + virtual EVRNotificationError CreateNotification( VROverlayHandle_t ulOverlayHandle, uint64_t ulUserValue, EVRNotificationType type, const char *pchText, EVRNotificationStyle style, const NotificationBitmap_t *pImage, /* out */ VRNotificationId *pNotificationId ) = 0; + + /** Destroy a notification, hiding it first if it currently shown to the user. */ + virtual EVRNotificationError RemoveNotification( VRNotificationId notificationId ) = 0; + +}; + +static const char * const IVRNotifications_Version = "IVRNotifications_002"; + +} // namespace vr + + + +// ivroverlay.h +namespace vr +{ + + /** The maximum length of an overlay key in bytes, counting the terminating null character. */ + static const uint32_t k_unVROverlayMaxKeyLength = 128; + + /** The maximum length of an overlay name in bytes, counting the terminating null character. */ + static const uint32_t k_unVROverlayMaxNameLength = 128; + + /** The maximum number of overlays that can exist in the system at one time. */ + static const uint32_t k_unMaxOverlayCount = 64; + + /** The maximum number of overlay intersection mask primitives per overlay */ + static const uint32_t k_unMaxOverlayIntersectionMaskPrimitivesCount = 32; + + /** Types of input supported by VR Overlays */ + enum VROverlayInputMethod + { + VROverlayInputMethod_None = 0, // No input events will be generated automatically for this overlay + VROverlayInputMethod_Mouse = 1, // Tracked controllers will get mouse events automatically + }; + + /** Allows the caller to figure out which overlay transform getter to call. */ + enum VROverlayTransformType + { + VROverlayTransform_Absolute = 0, + VROverlayTransform_TrackedDeviceRelative = 1, + VROverlayTransform_SystemOverlay = 2, + VROverlayTransform_TrackedComponent = 3, + }; + + /** Overlay control settings */ + enum VROverlayFlags + { + VROverlayFlags_None = 0, + + // The following only take effect when rendered using the high quality render path (see SetHighQualityOverlay). + VROverlayFlags_Curved = 1, + VROverlayFlags_RGSS4X = 2, + + // Set this flag on a dashboard overlay to prevent a tab from showing up for that overlay + VROverlayFlags_NoDashboardTab = 3, + + // Set this flag on a dashboard that is able to deal with gamepad focus events + VROverlayFlags_AcceptsGamepadEvents = 4, + + // Indicates that the overlay should dim/brighten to show gamepad focus + VROverlayFlags_ShowGamepadFocus = 5, + + // When in VROverlayInputMethod_Mouse you can optionally enable sending VRScroll_t + VROverlayFlags_SendVRScrollEvents = 6, + VROverlayFlags_SendVRTouchpadEvents = 7, + + // If set this will render a vertical scroll wheel on the primary controller, + // only needed if not using VROverlayFlags_SendVRScrollEvents but you still want to represent a scroll wheel + VROverlayFlags_ShowTouchPadScrollWheel = 8, + + // If this is set ownership and render access to the overlay are transferred + // to the new scene process on a call to IVRApplications::LaunchInternalProcess + VROverlayFlags_TransferOwnershipToInternalProcess = 9, + + // If set, renders 50% of the texture in each eye, side by side + VROverlayFlags_SideBySide_Parallel = 10, // Texture is left/right + VROverlayFlags_SideBySide_Crossed = 11, // Texture is crossed and right/left + + VROverlayFlags_Panorama = 12, // Texture is a panorama + VROverlayFlags_StereoPanorama = 13, // Texture is a stereo panorama + + // If this is set on an overlay owned by the scene application that overlay + // will be sorted with the "Other" overlays on top of all other scene overlays + VROverlayFlags_SortWithNonSceneOverlays = 14, + + // If set, the overlay will be shown in the dashboard, otherwise it will be hidden. + VROverlayFlags_VisibleInDashboard = 15, + }; + + enum VRMessageOverlayResponse + { + VRMessageOverlayResponse_ButtonPress_0 = 0, + VRMessageOverlayResponse_ButtonPress_1 = 1, + VRMessageOverlayResponse_ButtonPress_2 = 2, + VRMessageOverlayResponse_ButtonPress_3 = 3, + VRMessageOverlayResponse_CouldntFindSystemOverlay = 4, + VRMessageOverlayResponse_CouldntFindOrCreateClientOverlay= 5, + VRMessageOverlayResponse_ApplicationQuit = 6 + }; + + struct VROverlayIntersectionParams_t + { + HmdVector3_t vSource; + HmdVector3_t vDirection; + ETrackingUniverseOrigin eOrigin; + }; + + struct VROverlayIntersectionResults_t + { + HmdVector3_t vPoint; + HmdVector3_t vNormal; + HmdVector2_t vUVs; + float fDistance; + }; + + // Input modes for the Big Picture gamepad text entry + enum EGamepadTextInputMode + { + k_EGamepadTextInputModeNormal = 0, + k_EGamepadTextInputModePassword = 1, + k_EGamepadTextInputModeSubmit = 2, + }; + + // Controls number of allowed lines for the Big Picture gamepad text entry + enum EGamepadTextInputLineMode + { + k_EGamepadTextInputLineModeSingleLine = 0, + k_EGamepadTextInputLineModeMultipleLines = 1 + }; + + /** Directions for changing focus between overlays with the gamepad */ + enum EOverlayDirection + { + OverlayDirection_Up = 0, + OverlayDirection_Down = 1, + OverlayDirection_Left = 2, + OverlayDirection_Right = 3, + + OverlayDirection_Count = 4, + }; + + enum EVROverlayIntersectionMaskPrimitiveType + { + OverlayIntersectionPrimitiveType_Rectangle, + OverlayIntersectionPrimitiveType_Circle, + }; + + struct IntersectionMaskRectangle_t + { + float m_flTopLeftX; + float m_flTopLeftY; + float m_flWidth; + float m_flHeight; + }; + + struct IntersectionMaskCircle_t + { + float m_flCenterX; + float m_flCenterY; + float m_flRadius; + }; + + /** NOTE!!! If you change this you MUST manually update openvr_interop.cs.py and openvr_api_flat.h.py */ + typedef union + { + IntersectionMaskRectangle_t m_Rectangle; + IntersectionMaskCircle_t m_Circle; + } VROverlayIntersectionMaskPrimitive_Data_t; + + struct VROverlayIntersectionMaskPrimitive_t + { + EVROverlayIntersectionMaskPrimitiveType m_nPrimitiveType; + VROverlayIntersectionMaskPrimitive_Data_t m_Primitive; + }; + + class IVROverlay + { + public: + + // --------------------------------------------- + // Overlay management methods + // --------------------------------------------- + + /** Finds an existing overlay with the specified key. */ + virtual EVROverlayError FindOverlay( const char *pchOverlayKey, VROverlayHandle_t * pOverlayHandle ) = 0; + + /** Creates a new named overlay. All overlays start hidden and with default settings. */ + virtual EVROverlayError CreateOverlay( const char *pchOverlayKey, const char *pchOverlayName, VROverlayHandle_t * pOverlayHandle ) = 0; + + /** Destroys the specified overlay. When an application calls VR_Shutdown all overlays created by that app are + * automatically destroyed. */ + virtual EVROverlayError DestroyOverlay( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** Specify which overlay to use the high quality render path. This overlay will be composited in during the distortion pass which + * results in it drawing on top of everything else, but also at a higher quality as it samples the source texture directly rather than + * rasterizing into each eye's render texture first. Because if this, only one of these is supported at any given time. It is most useful + * for overlays that are expected to take up most of the user's view (e.g. streaming video). + * This mode does not support mouse input to your overlay. */ + virtual EVROverlayError SetHighQualityOverlay( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** Returns the overlay handle of the current overlay being rendered using the single high quality overlay render path. + * Otherwise it will return k_ulOverlayHandleInvalid. */ + virtual vr::VROverlayHandle_t GetHighQualityOverlay() = 0; + + /** Fills the provided buffer with the string key of the overlay. Returns the size of buffer required to store the key, including + * the terminating null character. k_unVROverlayMaxKeyLength will be enough bytes to fit the string. */ + virtual uint32_t GetOverlayKey( VROverlayHandle_t ulOverlayHandle, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize, EVROverlayError *pError = 0L ) = 0; + + /** Fills the provided buffer with the friendly name of the overlay. Returns the size of buffer required to store the key, including + * the terminating null character. k_unVROverlayMaxNameLength will be enough bytes to fit the string. */ + virtual uint32_t GetOverlayName( VROverlayHandle_t ulOverlayHandle, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize, EVROverlayError *pError = 0L ) = 0; + + /** set the name to use for this overlay */ + virtual EVROverlayError SetOverlayName( VROverlayHandle_t ulOverlayHandle, const char *pchName ) = 0; + + /** 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 + * will be set and VROverlayError_ArrayTooSmall is returned. */ + virtual EVROverlayError GetOverlayImageData( VROverlayHandle_t ulOverlayHandle, void *pvBuffer, uint32_t unBufferSize, uint32_t *punWidth, uint32_t *punHeight ) = 0; + + /** returns a string that corresponds with the specified overlay error. The string will be the name + * of the error enum value for all valid error codes */ + virtual const char *GetOverlayErrorNameFromEnum( EVROverlayError error ) = 0; + + // --------------------------------------------- + // Overlay rendering methods + // --------------------------------------------- + + /** Sets the pid that is allowed to render to this overlay (the creator pid is always allow to render), + * by default this is the pid of the process that made the overlay */ + virtual EVROverlayError SetOverlayRenderingPid( VROverlayHandle_t ulOverlayHandle, uint32_t unPID ) = 0; + + /** Gets the pid that is allowed to render to this overlay */ + virtual uint32_t GetOverlayRenderingPid( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** Specify flag setting for a given overlay */ + virtual EVROverlayError SetOverlayFlag( VROverlayHandle_t ulOverlayHandle, VROverlayFlags eOverlayFlag, bool bEnabled ) = 0; + + /** Sets flag setting for a given overlay */ + virtual EVROverlayError GetOverlayFlag( VROverlayHandle_t ulOverlayHandle, VROverlayFlags eOverlayFlag, bool *pbEnabled ) = 0; + + /** Sets the color tint of the overlay quad. Use 0.0 to 1.0 per channel. */ + virtual EVROverlayError SetOverlayColor( VROverlayHandle_t ulOverlayHandle, float fRed, float fGreen, float fBlue ) = 0; + + /** Gets the color tint of the overlay quad. */ + virtual EVROverlayError GetOverlayColor( VROverlayHandle_t ulOverlayHandle, float *pfRed, float *pfGreen, float *pfBlue ) = 0; + + /** Sets the alpha of the overlay quad. Use 1.0 for 100 percent opacity to 0.0 for 0 percent opacity. */ + virtual EVROverlayError SetOverlayAlpha( VROverlayHandle_t ulOverlayHandle, float fAlpha ) = 0; + + /** Gets the alpha of the overlay quad. By default overlays are rendering at 100 percent alpha (1.0). */ + virtual EVROverlayError GetOverlayAlpha( VROverlayHandle_t ulOverlayHandle, float *pfAlpha ) = 0; + + /** Sets the aspect ratio of the texels in the overlay. 1.0 means the texels are square. 2.0 means the texels + * are twice as wide as they are tall. Defaults to 1.0. */ + virtual EVROverlayError SetOverlayTexelAspect( VROverlayHandle_t ulOverlayHandle, float fTexelAspect ) = 0; + + /** Gets the aspect ratio of the texels in the overlay. Defaults to 1.0 */ + virtual EVROverlayError GetOverlayTexelAspect( VROverlayHandle_t ulOverlayHandle, float *pfTexelAspect ) = 0; + + /** Sets the rendering sort order for the overlay. Overlays are rendered this order: + * Overlays owned by the scene application + * Overlays owned by some other application + * + * Within a category overlays are rendered lowest sort order to highest sort order. Overlays with the same + * sort order are rendered back to front base on distance from the HMD. + * + * Sort order defaults to 0. */ + virtual EVROverlayError SetOverlaySortOrder( VROverlayHandle_t ulOverlayHandle, uint32_t unSortOrder ) = 0; + + /** Gets the sort order of the overlay. See SetOverlaySortOrder for how this works. */ + virtual EVROverlayError GetOverlaySortOrder( VROverlayHandle_t ulOverlayHandle, uint32_t *punSortOrder ) = 0; + + /** Sets the width of the overlay quad in meters. By default overlays are rendered on a quad that is 1 meter across */ + virtual EVROverlayError SetOverlayWidthInMeters( VROverlayHandle_t ulOverlayHandle, float fWidthInMeters ) = 0; + + /** Returns the width of the overlay quad in meters. By default overlays are rendered on a quad that is 1 meter across */ + virtual EVROverlayError GetOverlayWidthInMeters( VROverlayHandle_t ulOverlayHandle, float *pfWidthInMeters ) = 0; + + /** For high-quality curved overlays only, sets the distance range in meters from the overlay used to automatically curve + * the surface around the viewer. Min is distance is when the surface will be most curved. Max is when least curved. */ + virtual EVROverlayError SetOverlayAutoCurveDistanceRangeInMeters( VROverlayHandle_t ulOverlayHandle, float fMinDistanceInMeters, float fMaxDistanceInMeters ) = 0; + + /** For high-quality curved overlays only, gets the distance range in meters from the overlay used to automatically curve + * the surface around the viewer. Min is distance is when the surface will be most curved. Max is when least curved. */ + virtual EVROverlayError GetOverlayAutoCurveDistanceRangeInMeters( VROverlayHandle_t ulOverlayHandle, float *pfMinDistanceInMeters, float *pfMaxDistanceInMeters ) = 0; + + /** Sets the colorspace the overlay texture's data is in. Defaults to 'auto'. + * If the texture needs to be resolved, you should call SetOverlayTexture with the appropriate colorspace instead. */ + virtual EVROverlayError SetOverlayTextureColorSpace( VROverlayHandle_t ulOverlayHandle, EColorSpace eTextureColorSpace ) = 0; + + /** Gets the overlay's current colorspace setting. */ + virtual EVROverlayError GetOverlayTextureColorSpace( VROverlayHandle_t ulOverlayHandle, EColorSpace *peTextureColorSpace ) = 0; + + /** 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. */ + virtual EVROverlayError SetOverlayTextureBounds( VROverlayHandle_t ulOverlayHandle, const VRTextureBounds_t *pOverlayTextureBounds ) = 0; + + /** 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. */ + virtual EVROverlayError GetOverlayTextureBounds( VROverlayHandle_t ulOverlayHandle, VRTextureBounds_t *pOverlayTextureBounds ) = 0; + + /** Gets render model to draw behind this overlay */ + virtual uint32_t GetOverlayRenderModel( vr::VROverlayHandle_t ulOverlayHandle, char *pchValue, uint32_t unBufferSize, HmdColor_t *pColor, vr::EVROverlayError *pError ) = 0; + + /** Sets render model to draw behind this overlay and the vertex color to use, pass null for pColor to match the overlays vertex color. + The model is scaled by the same amount as the overlay, with a default of 1m. */ + virtual vr::EVROverlayError SetOverlayRenderModel( vr::VROverlayHandle_t ulOverlayHandle, const char *pchRenderModel, const HmdColor_t *pColor ) = 0; + + /** Returns the transform type of this overlay. */ + virtual EVROverlayError GetOverlayTransformType( VROverlayHandle_t ulOverlayHandle, VROverlayTransformType *peTransformType ) = 0; + + /** Sets the transform to absolute tracking origin. */ + virtual EVROverlayError SetOverlayTransformAbsolute( VROverlayHandle_t ulOverlayHandle, ETrackingUniverseOrigin eTrackingOrigin, const HmdMatrix34_t *pmatTrackingOriginToOverlayTransform ) = 0; + + /** Gets the transform if it is absolute. Returns an error if the transform is some other type. */ + virtual EVROverlayError GetOverlayTransformAbsolute( VROverlayHandle_t ulOverlayHandle, ETrackingUniverseOrigin *peTrackingOrigin, HmdMatrix34_t *pmatTrackingOriginToOverlayTransform ) = 0; + + /** Sets the transform to relative to the transform of the specified tracked device. */ + virtual EVROverlayError SetOverlayTransformTrackedDeviceRelative( VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t unTrackedDevice, const HmdMatrix34_t *pmatTrackedDeviceToOverlayTransform ) = 0; + + /** Gets the transform if it is relative to a tracked device. Returns an error if the transform is some other type. */ + virtual EVROverlayError GetOverlayTransformTrackedDeviceRelative( VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t *punTrackedDevice, HmdMatrix34_t *pmatTrackedDeviceToOverlayTransform ) = 0; + + /** Sets the transform to draw the overlay on a rendermodel component mesh instead of a quad. This will only draw when the system is + * drawing the device. Overlays with this transform type cannot receive mouse events. */ + virtual EVROverlayError SetOverlayTransformTrackedDeviceComponent( VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t unDeviceIndex, const char *pchComponentName ) = 0; + + /** Gets the transform information when the overlay is rendering on a component. */ + virtual EVROverlayError GetOverlayTransformTrackedDeviceComponent( VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t *punDeviceIndex, char *pchComponentName, uint32_t unComponentNameSize ) = 0; + + /** Gets the transform if it is relative to another overlay. Returns an error if the transform is some other type. */ + virtual vr::EVROverlayError GetOverlayTransformOverlayRelative( VROverlayHandle_t ulOverlayHandle, VROverlayHandle_t *ulOverlayHandleParent, HmdMatrix34_t *pmatParentOverlayToOverlayTransform ) = 0; + + /** Sets the transform to relative to the transform of the specified overlay. This overlays visibility will also track the parents visibility */ + virtual vr::EVROverlayError SetOverlayTransformOverlayRelative( VROverlayHandle_t ulOverlayHandle, VROverlayHandle_t ulOverlayHandleParent, const HmdMatrix34_t *pmatParentOverlayToOverlayTransform ) = 0; + + /** Shows the VR overlay. For dashboard overlays, only the Dashboard Manager is allowed to call this. */ + virtual EVROverlayError ShowOverlay( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** Hides the VR overlay. For dashboard overlays, only the Dashboard Manager is allowed to call this. */ + virtual EVROverlayError HideOverlay( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** Returns true if the overlay is visible. */ + virtual bool IsOverlayVisible( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** 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 */ + virtual EVROverlayError GetTransformForOverlayCoordinates( VROverlayHandle_t ulOverlayHandle, ETrackingUniverseOrigin eTrackingOrigin, HmdVector2_t coordinatesInOverlay, HmdMatrix34_t *pmatTransform ) = 0; + + // --------------------------------------------- + // Overlay input methods + // --------------------------------------------- + + /** Returns true and fills the event with the next event on the overlay's event queue, if there is one. + * If there are no events this method returns false. uncbVREvent should be the size in bytes of the VREvent_t struct */ + virtual bool PollNextOverlayEvent( VROverlayHandle_t ulOverlayHandle, VREvent_t *pEvent, uint32_t uncbVREvent ) = 0; + + /** Returns the current input settings for the specified overlay. */ + virtual EVROverlayError GetOverlayInputMethod( VROverlayHandle_t ulOverlayHandle, VROverlayInputMethod *peInputMethod ) = 0; + + /** Sets the input settings for the specified overlay. */ + virtual EVROverlayError SetOverlayInputMethod( VROverlayHandle_t ulOverlayHandle, VROverlayInputMethod eInputMethod ) = 0; + + /** Gets the mouse scaling factor that is used for mouse events. The actual texture may be a different size, but this is + * typically the size of the underlying UI in pixels. */ + virtual EVROverlayError GetOverlayMouseScale( VROverlayHandle_t ulOverlayHandle, HmdVector2_t *pvecMouseScale ) = 0; + + /** Sets the mouse scaling factor that is used for mouse events. The actual texture may be a different size, but this is + * typically the size of the underlying UI in pixels (not in world space). */ + virtual EVROverlayError SetOverlayMouseScale( VROverlayHandle_t ulOverlayHandle, const HmdVector2_t *pvecMouseScale ) = 0; + + /** Computes the overlay-space pixel coordinates of where the ray intersects the overlay with the + * specified settings. Returns false if there is no intersection. */ + virtual bool ComputeOverlayIntersection( VROverlayHandle_t ulOverlayHandle, const VROverlayIntersectionParams_t *pParams, VROverlayIntersectionResults_t *pResults ) = 0; + + /** Processes mouse input from the specified controller as though it were a mouse pointed at a compositor overlay with the + * specified settings. The controller is treated like a laser pointer on the -z axis. The point where the laser pointer would + * intersect with the overlay is the mouse position, the trigger is left mouse, and the track pad is right mouse. + * + * Return true if the controller is pointed at the overlay and an event was generated. */ + virtual bool HandleControllerOverlayInteractionAsMouse( VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t unControllerDeviceIndex ) = 0; + + /** Returns true if the specified overlay is the hover target. An overlay is the hover target when it is the last overlay "moused over" + * by the virtual mouse pointer */ + virtual bool IsHoverTargetOverlay( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** Returns the current Gamepad focus overlay */ + virtual vr::VROverlayHandle_t GetGamepadFocusOverlay() = 0; + + /** Sets the current Gamepad focus overlay */ + virtual EVROverlayError SetGamepadFocusOverlay( VROverlayHandle_t ulNewFocusOverlay ) = 0; + + /** Sets an overlay's neighbor. This will also set the neighbor of the "to" overlay + * to point back to the "from" overlay. If an overlay's neighbor is set to invalid both + * ends will be cleared */ + virtual EVROverlayError SetOverlayNeighbor( EOverlayDirection eDirection, VROverlayHandle_t ulFrom, VROverlayHandle_t ulTo ) = 0; + + /** Changes the Gamepad focus from one overlay to one of its neighbors. Returns VROverlayError_NoNeighbor if there is no + * neighbor in that direction */ + virtual EVROverlayError MoveGamepadFocusToNeighbor( EOverlayDirection eDirection, VROverlayHandle_t ulFrom ) = 0; + + // --------------------------------------------- + // Overlay texture methods + // --------------------------------------------- + + /** Texture to draw for the overlay. This function can only be called by the overlay's creator or renderer process (see SetOverlayRenderingPid) . + * + * OpenGL dirty state: + * glBindTexture + */ + virtual EVROverlayError SetOverlayTexture( VROverlayHandle_t ulOverlayHandle, const Texture_t *pTexture ) = 0; + + /** Use this to tell the overlay system to release the texture set for this overlay. */ + virtual EVROverlayError ClearOverlayTexture( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** Separate interface for providing the data as a stream of bytes, but there is an upper bound on data + * that can be sent. This function can only be called by the overlay's renderer process. */ + virtual EVROverlayError SetOverlayRaw( VROverlayHandle_t ulOverlayHandle, void *pvBuffer, uint32_t unWidth, uint32_t unHeight, uint32_t unDepth ) = 0; + + /** Separate interface for providing the image through a filename: can be png or jpg, and should not be bigger than 1920x1080. + * This function can only be called by the overlay's renderer process */ + virtual EVROverlayError SetOverlayFromFile( VROverlayHandle_t ulOverlayHandle, const char *pchFilePath ) = 0; + + /** Get the native texture handle/device for an overlay you have created. + * On windows this handle will be a ID3D11ShaderResourceView with a ID3D11Texture2D bound. + * + * The texture will always be sized to match the backing texture you supplied in SetOverlayTexture above. + * + * You MUST call ReleaseNativeOverlayHandle() with pNativeTextureHandle once you are done with this texture. + * + * pNativeTextureHandle is an OUTPUT, it will be a pointer to a ID3D11ShaderResourceView *. + * pNativeTextureRef is an INPUT and should be a ID3D11Resource *. The device used by pNativeTextureRef will be used to bind pNativeTextureHandle. + */ + 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; + + /** Release the pNativeTextureHandle provided from the GetOverlayTexture call, this allows the system to free the underlying GPU resources for this object, + * so only do it once you stop rendering this texture. + */ + virtual EVROverlayError ReleaseNativeOverlayHandle( VROverlayHandle_t ulOverlayHandle, void *pNativeTextureHandle ) = 0; + + /** Get the size of the overlay texture */ + virtual EVROverlayError GetOverlayTextureSize( VROverlayHandle_t ulOverlayHandle, uint32_t *pWidth, uint32_t *pHeight ) = 0; + + // ---------------------------------------------- + // Dashboard Overlay Methods + // ---------------------------------------------- + + /** Creates a dashboard overlay and returns its handle */ + virtual EVROverlayError CreateDashboardOverlay( const char *pchOverlayKey, const char *pchOverlayFriendlyName, VROverlayHandle_t * pMainHandle, VROverlayHandle_t *pThumbnailHandle ) = 0; + + /** Returns true if the dashboard is visible */ + virtual bool IsDashboardVisible() = 0; + + /** returns true if the dashboard is visible and the specified overlay is the active system Overlay */ + virtual bool IsActiveDashboardOverlay( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** Sets the dashboard overlay to only appear when the specified process ID has scene focus */ + virtual EVROverlayError SetDashboardOverlaySceneProcess( VROverlayHandle_t ulOverlayHandle, uint32_t unProcessId ) = 0; + + /** Gets the process ID that this dashboard overlay requires to have scene focus */ + virtual EVROverlayError GetDashboardOverlaySceneProcess( VROverlayHandle_t ulOverlayHandle, uint32_t *punProcessId ) = 0; + + /** Shows the dashboard. */ + virtual void ShowDashboard( const char *pchOverlayToShow ) = 0; + + /** Returns the tracked device that has the laser pointer in the dashboard */ + virtual vr::TrackedDeviceIndex_t GetPrimaryDashboardDevice() = 0; + + // --------------------------------------------- + // Keyboard methods + // --------------------------------------------- + + /** Show the virtual keyboard to accept input **/ + virtual EVROverlayError ShowKeyboard( EGamepadTextInputMode eInputMode, EGamepadTextInputLineMode eLineInputMode, const char *pchDescription, uint32_t unCharMax, const char *pchExistingText, bool bUseMinimalMode, uint64_t uUserValue ) = 0; + + virtual EVROverlayError ShowKeyboardForOverlay( VROverlayHandle_t ulOverlayHandle, EGamepadTextInputMode eInputMode, EGamepadTextInputLineMode eLineInputMode, const char *pchDescription, uint32_t unCharMax, const char *pchExistingText, bool bUseMinimalMode, uint64_t uUserValue ) = 0; + + /** Get the text that was entered into the text input **/ + virtual uint32_t GetKeyboardText( VR_OUT_STRING() char *pchText, uint32_t cchText ) = 0; + + /** Hide the virtual keyboard **/ + virtual void HideKeyboard() = 0; + + /** Set the position of the keyboard in world space **/ + virtual void SetKeyboardTransformAbsolute( ETrackingUniverseOrigin eTrackingOrigin, const HmdMatrix34_t *pmatTrackingOriginToKeyboardTransform ) = 0; + + /** 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 **/ + virtual void SetKeyboardPositionForOverlay( VROverlayHandle_t ulOverlayHandle, HmdRect2_t avoidRect ) = 0; + + // --------------------------------------------- + // Overlay input methods + // --------------------------------------------- + + /** Sets a list of primitives to be used for controller ray intersection + * typically the size of the underlying UI in pixels (not in world space). */ + virtual EVROverlayError SetOverlayIntersectionMask( VROverlayHandle_t ulOverlayHandle, VROverlayIntersectionMaskPrimitive_t *pMaskPrimitives, uint32_t unNumMaskPrimitives, uint32_t unPrimitiveSize = sizeof( VROverlayIntersectionMaskPrimitive_t ) ) = 0; + + virtual EVROverlayError GetOverlayFlags( VROverlayHandle_t ulOverlayHandle, uint32_t *pFlags ) = 0; + + // --------------------------------------------- + // Message box methods + // --------------------------------------------- + + /** Show the message overlay. This will block and return you a result. **/ + 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; + }; + + static const char * const IVROverlay_Version = "IVROverlay_016"; + +} // namespace vr + +// ivrrendermodels.h +namespace vr +{ + +static const char * const k_pch_Controller_Component_GDC2015 = "gdc2015"; // Canonical coordinate system of the gdc 2015 wired controller, provided for backwards compatibility +static const char * const k_pch_Controller_Component_Base = "base"; // For controllers with an unambiguous 'base'. +static const char * const k_pch_Controller_Component_Tip = "tip"; // For controllers with an unambiguous 'tip' (used for 'laser-pointing') +static 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 +static const char * const k_pch_Controller_Component_Status = "status"; // 1:1 aspect ratio status area, with canonical [0,1] uv mapping + +#pragma pack( push, 8 ) + +/** Errors that can occur with the VR compositor */ +enum EVRRenderModelError +{ + VRRenderModelError_None = 0, + VRRenderModelError_Loading = 100, + VRRenderModelError_NotSupported = 200, + VRRenderModelError_InvalidArg = 300, + VRRenderModelError_InvalidModel = 301, + VRRenderModelError_NoShapes = 302, + VRRenderModelError_MultipleShapes = 303, + VRRenderModelError_TooManyVertices = 304, + VRRenderModelError_MultipleTextures = 305, + VRRenderModelError_BufferTooSmall = 306, + VRRenderModelError_NotEnoughNormals = 307, + VRRenderModelError_NotEnoughTexCoords = 308, + + VRRenderModelError_InvalidTexture = 400, +}; + +typedef uint32_t VRComponentProperties; + +enum EVRComponentProperty +{ + VRComponentProperty_IsStatic = (1 << 0), + VRComponentProperty_IsVisible = (1 << 1), + VRComponentProperty_IsTouched = (1 << 2), + VRComponentProperty_IsPressed = (1 << 3), + VRComponentProperty_IsScrolled = (1 << 4), +}; + +/** Describes state information about a render-model component, including transforms and other dynamic properties */ +struct RenderModel_ComponentState_t +{ + HmdMatrix34_t mTrackingToComponentRenderModel; // Transform required when drawing the component render model + HmdMatrix34_t mTrackingToComponentLocal; // Transform available for attaching to a local component coordinate system (-Z out from surface ) + VRComponentProperties uProperties; +}; + +/** A single vertex in a render model */ +struct RenderModel_Vertex_t +{ + HmdVector3_t vPosition; // position in meters in device space + HmdVector3_t vNormal; + float rfTextureCoord[2]; +}; + +/** A texture map for use on a render model */ +#if defined(__linux__) || defined(__APPLE__) +// This structure was originally defined mis-packed on Linux, preserved for +// compatibility. +#pragma pack( push, 4 ) +#endif + +struct RenderModel_TextureMap_t +{ + uint16_t unWidth, unHeight; // width and height of the texture map in pixels + const uint8_t *rubTextureMapData; // Map texture data. All textures are RGBA with 8 bits per channel per pixel. Data size is width * height * 4ub +}; +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( pop ) +#endif + +/** Session unique texture identifier. Rendermodels which share the same texture will have the same id. +IDs <0 denote the texture is not present */ + +typedef int32_t TextureID_t; + +const TextureID_t INVALID_TEXTURE_ID = -1; + +#if defined(__linux__) || defined(__APPLE__) +// This structure was originally defined mis-packed on Linux, preserved for +// compatibility. +#pragma pack( push, 4 ) +#endif + +struct RenderModel_t +{ + const RenderModel_Vertex_t *rVertexData; // Vertex data for the mesh + uint32_t unVertexCount; // Number of vertices in the vertex data + const uint16_t *rIndexData; // Indices into the vertex data for each triangle + uint32_t unTriangleCount; // Number of triangles in the mesh. Index count is 3 * TriangleCount + TextureID_t diffuseTextureId; // Session unique texture identifier. Rendermodels which share the same texture will have the same id. <0 == texture not present +}; +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( pop ) +#endif + + +struct RenderModel_ControllerMode_State_t +{ + bool bScrollWheelVisible; // is this controller currently set to be in a scroll wheel mode +}; + +#pragma pack( pop ) + +class IVRRenderModels +{ +public: + + /** Loads and returns a render model for use in the application. pchRenderModelName should be a render model name + * from the Prop_RenderModelName_String property or an absolute path name to a render model on disk. + * + * The resulting render model is valid until VR_Shutdown() is called or until FreeRenderModel() is called. When the + * application is finished with the render model it should call FreeRenderModel() to free the memory associated + * with the model. + * + * The method returns VRRenderModelError_Loading while the render model is still being loaded. + * The method returns VRRenderModelError_None once loaded successfully, otherwise will return an error. */ + virtual EVRRenderModelError LoadRenderModel_Async( const char *pchRenderModelName, RenderModel_t **ppRenderModel ) = 0; + + /** Frees a previously returned render model + * It is safe to call this on a null ptr. */ + virtual void FreeRenderModel( RenderModel_t *pRenderModel ) = 0; + + /** Loads and returns a texture for use in the application. */ + virtual EVRRenderModelError LoadTexture_Async( TextureID_t textureId, RenderModel_TextureMap_t **ppTexture ) = 0; + + /** Frees a previously returned texture + * It is safe to call this on a null ptr. */ + virtual void FreeTexture( RenderModel_TextureMap_t *pTexture ) = 0; + + /** Creates a D3D11 texture and loads data into it. */ + virtual EVRRenderModelError LoadTextureD3D11_Async( TextureID_t textureId, void *pD3D11Device, void **ppD3D11Texture2D ) = 0; + + /** Helper function to copy the bits into an existing texture. */ + virtual EVRRenderModelError LoadIntoTextureD3D11_Async( TextureID_t textureId, void *pDstTexture ) = 0; + + /** Use this to free textures created with LoadTextureD3D11_Async instead of calling Release on them. */ + virtual void FreeTextureD3D11( void *pD3D11Texture2D ) = 0; + + /** Use this to get the names of available render models. Index does not correlate to a tracked device index, but + * is only used for iterating over all available render models. If the index is out of range, this function will return 0. + * Otherwise, it will return the size of the buffer required for the name. */ + virtual uint32_t GetRenderModelName( uint32_t unRenderModelIndex, VR_OUT_STRING() char *pchRenderModelName, uint32_t unRenderModelNameLen ) = 0; + + /** Returns the number of available render models. */ + virtual uint32_t GetRenderModelCount() = 0; + + + /** Returns the number of components of the specified render model. + * Components are useful when client application wish to draw, label, or otherwise interact with components of tracked objects. + * Examples controller components: + * renderable things such as triggers, buttons + * non-renderable things which include coordinate systems such as 'tip', 'base', a neutral controller agnostic hand-pose + * If all controller components are enumerated and rendered, it will be equivalent to drawing the traditional render model + * Returns 0 if components not supported, >0 otherwise */ + virtual uint32_t GetComponentCount( const char *pchRenderModelName ) = 0; + + /** Use this to get the names of available components. Index does not correlate to a tracked device index, but + * is only used for iterating over all available components. If the index is out of range, this function will return 0. + * Otherwise, it will return the size of the buffer required for the name. */ + virtual uint32_t GetComponentName( const char *pchRenderModelName, uint32_t unComponentIndex, VR_OUT_STRING( ) char *pchComponentName, uint32_t unComponentNameLen ) = 0; + + /** Get the button mask for all buttons associated with this component + * If no buttons (or axes) are associated with this component, return 0 + * Note: multiple components may be associated with the same button. Ex: two grip buttons on a single controller. + * Note: A single component may be associated with multiple buttons. Ex: A trackpad which also provides "D-pad" functionality */ + virtual uint64_t GetComponentButtonMask( const char *pchRenderModelName, const char *pchComponentName ) = 0; + + /** Use this to get the render model name for the specified rendermode/component combination, to be passed to LoadRenderModel. + * If the component name is out of range, this function will return 0. + * Otherwise, it will return the size of the buffer required for the name. */ + virtual uint32_t GetComponentRenderModelName( const char *pchRenderModelName, const char *pchComponentName, VR_OUT_STRING( ) char *pchComponentRenderModelName, uint32_t unComponentRenderModelNameLen ) = 0; + + /** Use this to query information about the component, as a function of the controller state. + * + * For dynamic controller components (ex: trigger) values will reflect component motions + * For static components this will return a consistent value independent of the VRControllerState_t + * + * If the pchRenderModelName or pchComponentName is invalid, this will return false (and transforms will be set to identity). + * Otherwise, return true + * Note: For dynamic objects, visibility may be dynamic. (I.e., true/false will be returned based on controller state and controller mode state ) */ + 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; + + /** Returns true if the render model has a component with the specified name */ + virtual bool RenderModelHasComponent( const char *pchRenderModelName, const char *pchComponentName ) = 0; + + /** Returns the URL of the thumbnail image for this rendermodel */ + virtual uint32_t GetRenderModelThumbnailURL( const char *pchRenderModelName, VR_OUT_STRING() char *pchThumbnailURL, uint32_t unThumbnailURLLen, vr::EVRRenderModelError *peError ) = 0; + + /** 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 + * 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 + * model. */ + virtual uint32_t GetRenderModelOriginalPath( const char *pchRenderModelName, VR_OUT_STRING() char *pchOriginalPath, uint32_t unOriginalPathLen, vr::EVRRenderModelError *peError ) = 0; + + /** Returns a string for a render model error */ + virtual const char *GetRenderModelErrorNameFromEnum( vr::EVRRenderModelError error ) = 0; +}; + +static const char * const IVRRenderModels_Version = "IVRRenderModels_005"; + +} + + +// ivrextendeddisplay.h +namespace vr +{ + + /** NOTE: Use of this interface is not recommended in production applications. It will not work for displays which use + * direct-to-display mode. Creating our own window is also incompatible with the VR compositor and is not available when the compositor is running. */ + class IVRExtendedDisplay + { + public: + + /** Size and position that the window needs to be on the VR display. */ + virtual void GetWindowBounds( int32_t *pnX, int32_t *pnY, uint32_t *pnWidth, uint32_t *pnHeight ) = 0; + + /** Gets the viewport in the frame buffer to draw the output of the distortion into */ + virtual void GetEyeOutputViewport( EVREye eEye, uint32_t *pnX, uint32_t *pnY, uint32_t *pnWidth, uint32_t *pnHeight ) = 0; + + /** [D3D10/11 Only] + * Returns the adapter index and output index that the user should pass into EnumAdapters and EnumOutputs + * to create the device and swap chain in DX10 and DX11. If an error occurs both indices will be set to -1. + */ + virtual void GetDXGIOutputInfo( int32_t *pnAdapterIndex, int32_t *pnAdapterOutputIndex ) = 0; + + }; + + static const char * const IVRExtendedDisplay_Version = "IVRExtendedDisplay_001"; + +} + + +// ivrtrackedcamera.h +namespace vr +{ + +class IVRTrackedCamera +{ +public: + /** Returns a string for an error */ + virtual const char *GetCameraErrorNameFromEnum( vr::EVRTrackedCameraError eCameraError ) = 0; + + /** For convenience, same as tracked property request Prop_HasCamera_Bool */ + virtual vr::EVRTrackedCameraError HasCamera( vr::TrackedDeviceIndex_t nDeviceIndex, bool *pHasCamera ) = 0; + + /** Gets size of the image frame. */ + virtual vr::EVRTrackedCameraError GetCameraFrameSize( vr::TrackedDeviceIndex_t nDeviceIndex, vr::EVRTrackedCameraFrameType eFrameType, uint32_t *pnWidth, uint32_t *pnHeight, uint32_t *pnFrameBufferSize ) = 0; + + virtual vr::EVRTrackedCameraError GetCameraIntrinsics( vr::TrackedDeviceIndex_t nDeviceIndex, vr::EVRTrackedCameraFrameType eFrameType, vr::HmdVector2_t *pFocalLength, vr::HmdVector2_t *pCenter ) = 0; + + virtual vr::EVRTrackedCameraError GetCameraProjection( vr::TrackedDeviceIndex_t nDeviceIndex, vr::EVRTrackedCameraFrameType eFrameType, float flZNear, float flZFar, vr::HmdMatrix44_t *pProjection ) = 0; + + /** 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. + * 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. + * The camera should be considered a global resource accessible for shared consumption but not exclusive to any caller. + * The camera may go inactive due to lack of active consumers or headset idleness. */ + virtual vr::EVRTrackedCameraError AcquireVideoStreamingService( vr::TrackedDeviceIndex_t nDeviceIndex, vr::TrackedCameraHandle_t *pHandle ) = 0; + virtual vr::EVRTrackedCameraError ReleaseVideoStreamingService( vr::TrackedCameraHandle_t hTrackedCamera ) = 0; + + /** Copies the image frame into a caller's provided buffer. The image data is currently provided as RGBA data, 4 bytes per pixel. + * A caller can provide null for the framebuffer or frameheader if not desired. Requesting the frame header first, followed by the frame buffer allows + * the caller to determine if the frame as advanced per the frame header sequence. + * If there is no frame available yet, due to initial camera spinup or re-activation, the error will be VRTrackedCameraError_NoFrameAvailable. + * Ideally a caller should be polling at ~16ms intervals */ + virtual vr::EVRTrackedCameraError GetVideoStreamFrameBuffer( vr::TrackedCameraHandle_t hTrackedCamera, vr::EVRTrackedCameraFrameType eFrameType, void *pFrameBuffer, uint32_t nFrameBufferSize, vr::CameraVideoStreamFrameHeader_t *pFrameHeader, uint32_t nFrameHeaderSize ) = 0; + + /** Gets size of the image frame. */ + virtual vr::EVRTrackedCameraError GetVideoStreamTextureSize( vr::TrackedDeviceIndex_t nDeviceIndex, vr::EVRTrackedCameraFrameType eFrameType, vr::VRTextureBounds_t *pTextureBounds, uint32_t *pnWidth, uint32_t *pnHeight ) = 0; + + /** Access a shared D3D11 texture for the specified tracked camera stream. + * 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. + * Instead, use GetVideoStreamTextureSize() with VRTrackedCameraFrameType_Undistorted to determine the proper interior subregion bounds along with GetVideoStreamTextureD3D11() with + * VRTrackedCameraFrameType_MaximumUndistorted to provide the texture. The VRTrackedCameraFrameType_MaximumUndistorted will yield an image where the invalid regions are decoded + * 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 + * guarantees a rectangle where all pixels are valid. */ + virtual vr::EVRTrackedCameraError GetVideoStreamTextureD3D11( vr::TrackedCameraHandle_t hTrackedCamera, vr::EVRTrackedCameraFrameType eFrameType, void *pD3D11DeviceOrResource, void **ppD3D11ShaderResourceView, vr::CameraVideoStreamFrameHeader_t *pFrameHeader, uint32_t nFrameHeaderSize ) = 0; + + /** Access a shared GL texture for the specified tracked camera stream */ + virtual vr::EVRTrackedCameraError GetVideoStreamTextureGL( vr::TrackedCameraHandle_t hTrackedCamera, vr::EVRTrackedCameraFrameType eFrameType, vr::glUInt_t *pglTextureId, vr::CameraVideoStreamFrameHeader_t *pFrameHeader, uint32_t nFrameHeaderSize ) = 0; + virtual vr::EVRTrackedCameraError ReleaseVideoStreamTextureGL( vr::TrackedCameraHandle_t hTrackedCamera, vr::glUInt_t glTextureId ) = 0; +}; + +static const char * const IVRTrackedCamera_Version = "IVRTrackedCamera_003"; + +} // namespace vr + + +// ivrscreenshots.h +namespace vr +{ + +/** Errors that can occur with the VR compositor */ +enum EVRScreenshotError +{ + VRScreenshotError_None = 0, + VRScreenshotError_RequestFailed = 1, + VRScreenshotError_IncompatibleVersion = 100, + VRScreenshotError_NotFound = 101, + VRScreenshotError_BufferTooSmall = 102, + VRScreenshotError_ScreenshotAlreadyInProgress = 108, +}; + +/** Allows the application to generate screenshots */ +class IVRScreenshots +{ +public: + /** Request a screenshot of the requested type. + * A request of the VRScreenshotType_Stereo type will always + * work. Other types will depend on the underlying application + * support. + * The first file name is for the preview image and should be a + * regular screenshot (ideally from the left eye). The second + * is the VR screenshot in the correct format. They should be + * in the same aspect ratio. Formats per type: + * VRScreenshotType_Mono: the VR filename is ignored (can be + * nullptr), this is a normal flat single shot. + * VRScreenshotType_Stereo: The VR image should be a + * side-by-side with the left eye image on the left. + * VRScreenshotType_Cubemap: The VR image should be six square + * images composited horizontally. + * VRScreenshotType_StereoPanorama: above/below with left eye + * panorama being the above image. Image is typically square + * with the panorama being 2x horizontal. + * + * Note that the VR dashboard will call this function when + * the user presses the screenshot binding (currently System + * Button + Trigger). If Steam is running, the destination + * file names will be in %TEMP% and will be copied into + * Steam's screenshot library for the running application + * once SubmitScreenshot() is called. + * If Steam is not running, the paths will be in the user's + * documents folder under Documents\SteamVR\Screenshots. + * Other VR applications can call this to initiate a + * screenshot outside of user control. + * The destination file names do not need an extension, + * will be replaced with the correct one for the format + * which is currently .png. */ + virtual vr::EVRScreenshotError RequestScreenshot( vr::ScreenshotHandle_t *pOutScreenshotHandle, vr::EVRScreenshotType type, const char *pchPreviewFilename, const char *pchVRFilename ) = 0; + + /** Called by the running VR application to indicate that it + * wishes to be in charge of screenshots. If the + * application does not call this, the Compositor will only + * support VRScreenshotType_Stereo screenshots that will be + * captured without notification to the running app. + * Once hooked your application will receive a + * VREvent_RequestScreenshot event when the user presses the + * buttons to take a screenshot. */ + virtual vr::EVRScreenshotError HookScreenshot( VR_ARRAY_COUNT( numTypes ) const vr::EVRScreenshotType *pSupportedTypes, int numTypes ) = 0; + + /** When your application receives a + * VREvent_RequestScreenshot event, call these functions to get + * the details of the screenshot request. */ + virtual vr::EVRScreenshotType GetScreenshotPropertyType( vr::ScreenshotHandle_t screenshotHandle, vr::EVRScreenshotError *pError ) = 0; + + /** Get the filename for the preview or vr image (see + * vr::EScreenshotPropertyFilenames). The return value is + * the size of the string. */ + virtual uint32_t GetScreenshotPropertyFilename( vr::ScreenshotHandle_t screenshotHandle, vr::EVRScreenshotPropertyFilenames filenameType, VR_OUT_STRING() char *pchFilename, uint32_t cchFilename, vr::EVRScreenshotError *pError ) = 0; + + /** Call this if the application is taking the screen shot + * will take more than a few ms processing. This will result + * in an overlay being presented that shows a completion + * bar. */ + virtual vr::EVRScreenshotError UpdateScreenshotProgress( vr::ScreenshotHandle_t screenshotHandle, float flProgress ) = 0; + + /** Tells the compositor to take an internal screenshot of + * type VRScreenshotType_Stereo. It will take the current + * submitted scene textures of the running application and + * write them into the preview image and a side-by-side file + * for the VR image. + * This is similar to request screenshot, but doesn't ever + * talk to the application, just takes the shot and submits. */ + virtual vr::EVRScreenshotError TakeStereoScreenshot( vr::ScreenshotHandle_t *pOutScreenshotHandle, const char *pchPreviewFilename, const char *pchVRFilename ) = 0; + + /** Submit the completed screenshot. If Steam is running + * this will call into the Steam client and upload the + * screenshot to the screenshots section of the library for + * the running application. If Steam is not running, this + * function will display a notification to the user that the + * screenshot was taken. The paths should be full paths with + * extensions. + * File paths should be absolute including extensions. + * screenshotHandle can be k_unScreenshotHandleInvalid if this + * was a new shot taking by the app to be saved and not + * initiated by a user (achievement earned or something) */ + virtual vr::EVRScreenshotError SubmitScreenshot( vr::ScreenshotHandle_t screenshotHandle, vr::EVRScreenshotType type, const char *pchSourcePreviewFilename, const char *pchSourceVRFilename ) = 0; +}; + +static const char * const IVRScreenshots_Version = "IVRScreenshots_001"; + +} // namespace vr + + + +// ivrresources.h +namespace vr +{ + +class IVRResources +{ +public: + + // ------------------------------------ + // Shared Resource Methods + // ------------------------------------ + + /** Loads the specified resource into the provided buffer if large enough. + * Returns the size in bytes of the buffer required to hold the specified resource. */ + virtual uint32_t LoadSharedResource( const char *pchResourceName, char *pchBuffer, uint32_t unBufferLen ) = 0; + + /** Provides the full path to the specified resource. Resource names can include named directories for + * drivers and other things, and this resolves all of those and returns the actual physical path. + * pchResourceTypeDirectory is the subdirectory of resources to look in. */ + virtual uint32_t GetResourceFullPath( const char *pchResourceName, const char *pchResourceTypeDirectory, char *pchPathBuffer, uint32_t unBufferLen ) = 0; +}; + +static const char * const IVRResources_Version = "IVRResources_001"; + + +} +// ivrdrivermanager.h +namespace vr +{ + +class IVRDriverManager +{ +public: + virtual uint32_t GetDriverCount() const = 0; + + /** Returns the length of the number of bytes necessary to hold this string including the trailing null. */ + virtual uint32_t GetDriverName( vr::DriverId_t nDriver, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize ) = 0; +}; + +static const char * const IVRDriverManager_Version = "IVRDriverManager_001"; + +} // namespace vr + + +// End + +#endif // _OPENVR_API + + +namespace vr +{ + /** Finds the active installation of the VR API and initializes it. The provided path must be absolute + * or relative to the current working directory. These are the local install versions of the equivalent + * functions in steamvr.h and will work without a local Steam install. + * + * This path is to the "root" of the VR API install. That's the directory with + * the "drivers" directory and a platform (i.e. "win32") directory in it, not the directory with the DLL itself. + */ + inline IVRSystem *VR_Init( EVRInitError *peError, EVRApplicationType eApplicationType ); + + /** unloads vrclient.dll. Any interface pointers from the interface are + * invalid after this point */ + inline void VR_Shutdown(); + + /** Returns true if there is an HMD attached. This check is as lightweight as possible and + * can be called outside of VR_Init/VR_Shutdown. It should be used when an application wants + * to know if initializing VR is a possibility but isn't ready to take that step yet. + */ + VR_INTERFACE bool VR_CALLTYPE VR_IsHmdPresent(); + + /** Returns true if the OpenVR runtime is installed. */ + VR_INTERFACE bool VR_CALLTYPE VR_IsRuntimeInstalled(); + + /** Returns where the OpenVR runtime is installed. */ + VR_INTERFACE const char *VR_CALLTYPE VR_RuntimePath(); + + /** Returns the name of the enum value for an EVRInitError. This function may be called outside of VR_Init()/VR_Shutdown(). */ + VR_INTERFACE const char *VR_CALLTYPE VR_GetVRInitErrorAsSymbol( EVRInitError error ); + + /** Returns an English string for an EVRInitError. Applications should call VR_GetVRInitErrorAsSymbol instead and + * use that as a key to look up their own localized error message. This function may be called outside of VR_Init()/VR_Shutdown(). */ + VR_INTERFACE const char *VR_CALLTYPE VR_GetVRInitErrorAsEnglishDescription( EVRInitError error ); + + /** Returns the interface of the specified version. This method must be called after VR_Init. The + * pointer returned is valid until VR_Shutdown is called. + */ + VR_INTERFACE void *VR_CALLTYPE VR_GetGenericInterface( const char *pchInterfaceVersion, EVRInitError *peError ); + + /** Returns whether the interface of the specified version exists. + */ + VR_INTERFACE bool VR_CALLTYPE VR_IsInterfaceVersionValid( const char *pchInterfaceVersion ); + + /** Returns a token that represents whether the VR interface handles need to be reloaded */ + VR_INTERFACE uint32_t VR_CALLTYPE VR_GetInitToken(); + + // These typedefs allow old enum names from SDK 0.9.11 to be used in applications. + // They will go away in the future. + typedef EVRInitError HmdError; + typedef EVREye Hmd_Eye; + typedef EColorSpace ColorSpace; + typedef ETrackingResult HmdTrackingResult; + typedef ETrackedDeviceClass TrackedDeviceClass; + typedef ETrackingUniverseOrigin TrackingUniverseOrigin; + typedef ETrackedDeviceProperty TrackedDeviceProperty; + typedef ETrackedPropertyError TrackedPropertyError; + typedef EVRSubmitFlags VRSubmitFlags_t; + typedef EVRState VRState_t; + typedef ECollisionBoundsStyle CollisionBoundsStyle_t; + typedef EVROverlayError VROverlayError; + typedef EVRFirmwareError VRFirmwareError; + typedef EVRCompositorError VRCompositorError; + typedef EVRScreenshotError VRScreenshotsError; + + inline uint32_t &VRToken() + { + static uint32_t token; + return token; + } + + class COpenVRContext + { + public: + COpenVRContext() { Clear(); } + void Clear(); + + inline void CheckClear() + { + if ( VRToken() != VR_GetInitToken() ) + { + Clear(); + VRToken() = VR_GetInitToken(); + } + } + + IVRSystem *VRSystem() + { + CheckClear(); + if ( m_pVRSystem == nullptr ) + { + EVRInitError eError; + m_pVRSystem = ( IVRSystem * )VR_GetGenericInterface( IVRSystem_Version, &eError ); + } + return m_pVRSystem; + } + IVRChaperone *VRChaperone() + { + CheckClear(); + if ( m_pVRChaperone == nullptr ) + { + EVRInitError eError; + m_pVRChaperone = ( IVRChaperone * )VR_GetGenericInterface( IVRChaperone_Version, &eError ); + } + return m_pVRChaperone; + } + + IVRChaperoneSetup *VRChaperoneSetup() + { + CheckClear(); + if ( m_pVRChaperoneSetup == nullptr ) + { + EVRInitError eError; + m_pVRChaperoneSetup = ( IVRChaperoneSetup * )VR_GetGenericInterface( IVRChaperoneSetup_Version, &eError ); + } + return m_pVRChaperoneSetup; + } + + IVRCompositor *VRCompositor() + { + CheckClear(); + if ( m_pVRCompositor == nullptr ) + { + EVRInitError eError; + m_pVRCompositor = ( IVRCompositor * )VR_GetGenericInterface( IVRCompositor_Version, &eError ); + } + return m_pVRCompositor; + } + + IVROverlay *VROverlay() + { + CheckClear(); + if ( m_pVROverlay == nullptr ) + { + EVRInitError eError; + m_pVROverlay = ( IVROverlay * )VR_GetGenericInterface( IVROverlay_Version, &eError ); + } + return m_pVROverlay; + } + + IVRResources *VRResources() + { + CheckClear(); + if ( m_pVRResources == nullptr ) + { + EVRInitError eError; + m_pVRResources = (IVRResources *)VR_GetGenericInterface( IVRResources_Version, &eError ); + } + return m_pVRResources; + } + + IVRScreenshots *VRScreenshots() + { + CheckClear(); + if ( m_pVRScreenshots == nullptr ) + { + EVRInitError eError; + m_pVRScreenshots = ( IVRScreenshots * )VR_GetGenericInterface( IVRScreenshots_Version, &eError ); + } + return m_pVRScreenshots; + } + + IVRRenderModels *VRRenderModels() + { + CheckClear(); + if ( m_pVRRenderModels == nullptr ) + { + EVRInitError eError; + m_pVRRenderModels = ( IVRRenderModels * )VR_GetGenericInterface( IVRRenderModels_Version, &eError ); + } + return m_pVRRenderModels; + } + + IVRExtendedDisplay *VRExtendedDisplay() + { + CheckClear(); + if ( m_pVRExtendedDisplay == nullptr ) + { + EVRInitError eError; + m_pVRExtendedDisplay = ( IVRExtendedDisplay * )VR_GetGenericInterface( IVRExtendedDisplay_Version, &eError ); + } + return m_pVRExtendedDisplay; + } + + IVRSettings *VRSettings() + { + CheckClear(); + if ( m_pVRSettings == nullptr ) + { + EVRInitError eError; + m_pVRSettings = ( IVRSettings * )VR_GetGenericInterface( IVRSettings_Version, &eError ); + } + return m_pVRSettings; + } + + IVRApplications *VRApplications() + { + CheckClear(); + if ( m_pVRApplications == nullptr ) + { + EVRInitError eError; + m_pVRApplications = ( IVRApplications * )VR_GetGenericInterface( IVRApplications_Version, &eError ); + } + return m_pVRApplications; + } + + IVRTrackedCamera *VRTrackedCamera() + { + CheckClear(); + if ( m_pVRTrackedCamera == nullptr ) + { + EVRInitError eError; + m_pVRTrackedCamera = ( IVRTrackedCamera * )VR_GetGenericInterface( IVRTrackedCamera_Version, &eError ); + } + return m_pVRTrackedCamera; + } + + IVRDriverManager *VRDriverManager() + { + CheckClear(); + if ( !m_pVRDriverManager ) + { + EVRInitError eError; + m_pVRDriverManager = ( IVRDriverManager * )VR_GetGenericInterface( IVRDriverManager_Version, &eError ); + } + return m_pVRDriverManager; + } + + private: + IVRSystem *m_pVRSystem; + IVRChaperone *m_pVRChaperone; + IVRChaperoneSetup *m_pVRChaperoneSetup; + IVRCompositor *m_pVRCompositor; + IVROverlay *m_pVROverlay; + IVRResources *m_pVRResources; + IVRRenderModels *m_pVRRenderModels; + IVRExtendedDisplay *m_pVRExtendedDisplay; + IVRSettings *m_pVRSettings; + IVRApplications *m_pVRApplications; + IVRTrackedCamera *m_pVRTrackedCamera; + IVRScreenshots *m_pVRScreenshots; + IVRDriverManager *m_pVRDriverManager; + }; + + inline COpenVRContext &OpenVRInternal_ModuleContext() + { + static void *ctx[ sizeof( COpenVRContext ) / sizeof( void * ) ]; + return *( COpenVRContext * )ctx; // bypass zero-init constructor + } + + inline IVRSystem *VR_CALLTYPE VRSystem() { return OpenVRInternal_ModuleContext().VRSystem(); } + inline IVRChaperone *VR_CALLTYPE VRChaperone() { return OpenVRInternal_ModuleContext().VRChaperone(); } + inline IVRChaperoneSetup *VR_CALLTYPE VRChaperoneSetup() { return OpenVRInternal_ModuleContext().VRChaperoneSetup(); } + inline IVRCompositor *VR_CALLTYPE VRCompositor() { return OpenVRInternal_ModuleContext().VRCompositor(); } + inline IVROverlay *VR_CALLTYPE VROverlay() { return OpenVRInternal_ModuleContext().VROverlay(); } + inline IVRScreenshots *VR_CALLTYPE VRScreenshots() { return OpenVRInternal_ModuleContext().VRScreenshots(); } + inline IVRRenderModels *VR_CALLTYPE VRRenderModels() { return OpenVRInternal_ModuleContext().VRRenderModels(); } + inline IVRApplications *VR_CALLTYPE VRApplications() { return OpenVRInternal_ModuleContext().VRApplications(); } + inline IVRSettings *VR_CALLTYPE VRSettings() { return OpenVRInternal_ModuleContext().VRSettings(); } + inline IVRResources *VR_CALLTYPE VRResources() { return OpenVRInternal_ModuleContext().VRResources(); } + inline IVRExtendedDisplay *VR_CALLTYPE VRExtendedDisplay() { return OpenVRInternal_ModuleContext().VRExtendedDisplay(); } + inline IVRTrackedCamera *VR_CALLTYPE VRTrackedCamera() { return OpenVRInternal_ModuleContext().VRTrackedCamera(); } + inline IVRDriverManager *VR_CALLTYPE VRDriverManager() { return OpenVRInternal_ModuleContext().VRDriverManager(); } + + inline void COpenVRContext::Clear() + { + m_pVRSystem = nullptr; + m_pVRChaperone = nullptr; + m_pVRChaperoneSetup = nullptr; + m_pVRCompositor = nullptr; + m_pVROverlay = nullptr; + m_pVRRenderModels = nullptr; + m_pVRExtendedDisplay = nullptr; + m_pVRSettings = nullptr; + m_pVRApplications = nullptr; + m_pVRTrackedCamera = nullptr; + m_pVRResources = nullptr; + m_pVRScreenshots = nullptr; + m_pVRDriverManager = nullptr; + } + + VR_INTERFACE uint32_t VR_CALLTYPE VR_InitInternal( EVRInitError *peError, EVRApplicationType eApplicationType ); + VR_INTERFACE void VR_CALLTYPE VR_ShutdownInternal(); + + /** Finds the active installation of vrclient.dll and initializes it */ + inline IVRSystem *VR_Init( EVRInitError *peError, EVRApplicationType eApplicationType ) + { + IVRSystem *pVRSystem = nullptr; + + EVRInitError eError; + VRToken() = VR_InitInternal( &eError, eApplicationType ); + COpenVRContext &ctx = OpenVRInternal_ModuleContext(); + ctx.Clear(); + + if ( eError == VRInitError_None ) + { + if ( VR_IsInterfaceVersionValid( IVRSystem_Version ) ) + { + pVRSystem = VRSystem(); + } + else + { + VR_ShutdownInternal(); + eError = VRInitError_Init_InterfaceNotFound; + } + } + + if ( peError ) + *peError = eError; + return pVRSystem; + } + + /** unloads vrclient.dll. Any interface pointers from the interface are + * invalid after this point */ + inline void VR_Shutdown() + { + VR_ShutdownInternal(); + } +} diff --git a/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_api.cs b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_api.cs new file mode 100644 index 000000000..2596b3783 --- /dev/null +++ b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_api.cs @@ -0,0 +1,4997 @@ +//======= Copyright (c) Valve Corporation, All rights reserved. =============== +// +// Purpose: This file contains C#/managed code bindings for the OpenVR interfaces +// This file is auto-generated, do not edit it. +// +//============================================================================= + +using System; +using System.Runtime.InteropServices; +using Valve.VR; + +namespace Valve.VR +{ + +[StructLayout(LayoutKind.Sequential)] +public struct IVRSystem +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetRecommendedRenderTargetSize(ref uint pnWidth, ref uint pnHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRecommendedRenderTargetSize GetRecommendedRenderTargetSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HmdMatrix44_t _GetProjectionMatrix(EVREye eEye, float fNearZ, float fFarZ); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetProjectionMatrix GetProjectionMatrix; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetProjectionRaw(EVREye eEye, ref float pfLeft, ref float pfRight, ref float pfTop, ref float pfBottom); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetProjectionRaw GetProjectionRaw; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ComputeDistortion(EVREye eEye, float fU, float fV, ref DistortionCoordinates_t pDistortionCoordinates); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ComputeDistortion ComputeDistortion; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HmdMatrix34_t _GetEyeToHeadTransform(EVREye eEye); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetEyeToHeadTransform GetEyeToHeadTransform; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetTimeSinceLastVsync(ref float pfSecondsSinceLastVsync, ref ulong pulFrameCounter); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTimeSinceLastVsync GetTimeSinceLastVsync; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate int _GetD3D9AdapterIndex(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetD3D9AdapterIndex GetD3D9AdapterIndex; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetDXGIOutputInfo(ref int pnAdapterIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDXGIOutputInfo GetDXGIOutputInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetOutputDevice(ref ulong pnDevice, ETextureType textureType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOutputDevice GetOutputDevice; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsDisplayOnDesktop(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsDisplayOnDesktop IsDisplayOnDesktop; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _SetDisplayVisibility(bool bIsVisibleOnDesktop); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetDisplayVisibility SetDisplayVisibility; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin eOrigin, float fPredictedSecondsToPhotonsFromNow, [In, Out] TrackedDevicePose_t[] pTrackedDevicePoseArray, uint unTrackedDevicePoseArrayCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDeviceToAbsoluteTrackingPose GetDeviceToAbsoluteTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ResetSeatedZeroPose(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ResetSeatedZeroPose ResetSeatedZeroPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HmdMatrix34_t _GetSeatedZeroPoseToStandingAbsoluteTrackingPose(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetSeatedZeroPoseToStandingAbsoluteTrackingPose GetSeatedZeroPoseToStandingAbsoluteTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HmdMatrix34_t _GetRawZeroPoseToStandingAbsoluteTrackingPose(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRawZeroPoseToStandingAbsoluteTrackingPose GetRawZeroPoseToStandingAbsoluteTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetSortedTrackedDeviceIndicesOfClass(ETrackedDeviceClass eTrackedDeviceClass, [In, Out] uint[] punTrackedDeviceIndexArray, uint unTrackedDeviceIndexArrayCount, uint unRelativeToTrackedDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetSortedTrackedDeviceIndicesOfClass GetSortedTrackedDeviceIndicesOfClass; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EDeviceActivityLevel _GetTrackedDeviceActivityLevel(uint unDeviceId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTrackedDeviceActivityLevel GetTrackedDeviceActivityLevel; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ApplyTransform(ref TrackedDevicePose_t pOutputPose, ref TrackedDevicePose_t pTrackedDevicePose, ref HmdMatrix34_t pTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ApplyTransform ApplyTransform; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole unDeviceType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTrackedDeviceIndexForControllerRole GetTrackedDeviceIndexForControllerRole; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ETrackedControllerRole _GetControllerRoleForTrackedDeviceIndex(uint unDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetControllerRoleForTrackedDeviceIndex GetControllerRoleForTrackedDeviceIndex; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ETrackedDeviceClass _GetTrackedDeviceClass(uint unDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTrackedDeviceClass GetTrackedDeviceClass; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsTrackedDeviceConnected(uint unDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsTrackedDeviceConnected IsTrackedDeviceConnected; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetBoolTrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetBoolTrackedDeviceProperty GetBoolTrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate float _GetFloatTrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetFloatTrackedDeviceProperty GetFloatTrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate int _GetInt32TrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetInt32TrackedDeviceProperty GetInt32TrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _GetUint64TrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetUint64TrackedDeviceProperty GetUint64TrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HmdMatrix34_t _GetMatrix34TrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetMatrix34TrackedDeviceProperty GetMatrix34TrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetStringTrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, System.Text.StringBuilder pchValue, uint unBufferSize, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetStringTrackedDeviceProperty GetStringTrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetPropErrorNameFromEnum(ETrackedPropertyError error); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetPropErrorNameFromEnum GetPropErrorNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _PollNextEvent(ref VREvent_t pEvent, uint uncbVREvent); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PollNextEvent PollNextEvent; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _PollNextEventWithPose(ETrackingUniverseOrigin eOrigin, ref VREvent_t pEvent, uint uncbVREvent, ref TrackedDevicePose_t pTrackedDevicePose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PollNextEventWithPose PollNextEventWithPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetEventTypeNameFromEnum(EVREventType eType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetEventTypeNameFromEnum GetEventTypeNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HiddenAreaMesh_t _GetHiddenAreaMesh(EVREye eEye, EHiddenAreaMeshType type); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetHiddenAreaMesh GetHiddenAreaMesh; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetControllerState(uint unControllerDeviceIndex, ref VRControllerState_t pControllerState, uint unControllerStateSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetControllerState GetControllerState; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetControllerStateWithPose(ETrackingUniverseOrigin eOrigin, uint unControllerDeviceIndex, ref VRControllerState_t pControllerState, uint unControllerStateSize, ref TrackedDevicePose_t pTrackedDevicePose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetControllerStateWithPose GetControllerStateWithPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _TriggerHapticPulse(uint unControllerDeviceIndex, uint unAxisId, char usDurationMicroSec); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _TriggerHapticPulse TriggerHapticPulse; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetButtonIdNameFromEnum(EVRButtonId eButtonId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetButtonIdNameFromEnum GetButtonIdNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetControllerAxisTypeNameFromEnum(EVRControllerAxisType eAxisType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetControllerAxisTypeNameFromEnum GetControllerAxisTypeNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _CaptureInputFocus(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CaptureInputFocus CaptureInputFocus; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ReleaseInputFocus(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseInputFocus ReleaseInputFocus; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsInputFocusCapturedByAnotherProcess(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsInputFocusCapturedByAnotherProcess IsInputFocusCapturedByAnotherProcess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _DriverDebugRequest(uint unDeviceIndex, string pchRequest, string pchResponseBuffer, uint unResponseBufferSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _DriverDebugRequest DriverDebugRequest; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRFirmwareError _PerformFirmwareUpdate(uint unDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PerformFirmwareUpdate PerformFirmwareUpdate; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _AcknowledgeQuit_Exiting(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _AcknowledgeQuit_Exiting AcknowledgeQuit_Exiting; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _AcknowledgeQuit_UserPrompt(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _AcknowledgeQuit_UserPrompt AcknowledgeQuit_UserPrompt; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRExtendedDisplay +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetWindowBounds(ref int pnX, ref int pnY, ref uint pnWidth, ref uint pnHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWindowBounds GetWindowBounds; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetEyeOutputViewport(EVREye eEye, ref uint pnX, ref uint pnY, ref uint pnWidth, ref uint pnHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetEyeOutputViewport GetEyeOutputViewport; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetDXGIOutputInfo(ref int pnAdapterIndex, ref int pnAdapterOutputIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDXGIOutputInfo GetDXGIOutputInfo; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRTrackedCamera +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetCameraErrorNameFromEnum(EVRTrackedCameraError eCameraError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCameraErrorNameFromEnum GetCameraErrorNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _HasCamera(uint nDeviceIndex, ref bool pHasCamera); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HasCamera HasCamera; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetCameraFrameSize(uint nDeviceIndex, EVRTrackedCameraFrameType eFrameType, ref uint pnWidth, ref uint pnHeight, ref uint pnFrameBufferSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCameraFrameSize GetCameraFrameSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetCameraIntrinsics(uint nDeviceIndex, EVRTrackedCameraFrameType eFrameType, ref HmdVector2_t pFocalLength, ref HmdVector2_t pCenter); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCameraIntrinsics GetCameraIntrinsics; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetCameraProjection(uint nDeviceIndex, EVRTrackedCameraFrameType eFrameType, float flZNear, float flZFar, ref HmdMatrix44_t pProjection); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCameraProjection GetCameraProjection; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _AcquireVideoStreamingService(uint nDeviceIndex, ref ulong pHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _AcquireVideoStreamingService AcquireVideoStreamingService; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _ReleaseVideoStreamingService(ulong hTrackedCamera); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseVideoStreamingService ReleaseVideoStreamingService; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetVideoStreamFrameBuffer(ulong hTrackedCamera, EVRTrackedCameraFrameType eFrameType, IntPtr pFrameBuffer, uint nFrameBufferSize, ref CameraVideoStreamFrameHeader_t pFrameHeader, uint nFrameHeaderSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVideoStreamFrameBuffer GetVideoStreamFrameBuffer; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetVideoStreamTextureSize(uint nDeviceIndex, EVRTrackedCameraFrameType eFrameType, ref VRTextureBounds_t pTextureBounds, ref uint pnWidth, ref uint pnHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVideoStreamTextureSize GetVideoStreamTextureSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetVideoStreamTextureD3D11(ulong hTrackedCamera, EVRTrackedCameraFrameType eFrameType, IntPtr pD3D11DeviceOrResource, ref IntPtr ppD3D11ShaderResourceView, ref CameraVideoStreamFrameHeader_t pFrameHeader, uint nFrameHeaderSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVideoStreamTextureD3D11 GetVideoStreamTextureD3D11; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetVideoStreamTextureGL(ulong hTrackedCamera, EVRTrackedCameraFrameType eFrameType, ref uint pglTextureId, ref CameraVideoStreamFrameHeader_t pFrameHeader, uint nFrameHeaderSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVideoStreamTextureGL GetVideoStreamTextureGL; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _ReleaseVideoStreamTextureGL(ulong hTrackedCamera, uint glTextureId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseVideoStreamTextureGL ReleaseVideoStreamTextureGL; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRApplications +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _AddApplicationManifest(string pchApplicationManifestFullPath, bool bTemporary); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _AddApplicationManifest AddApplicationManifest; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _RemoveApplicationManifest(string pchApplicationManifestFullPath); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RemoveApplicationManifest RemoveApplicationManifest; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsApplicationInstalled(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsApplicationInstalled IsApplicationInstalled; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetApplicationCount(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationCount GetApplicationCount; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _GetApplicationKeyByIndex(uint unApplicationIndex, System.Text.StringBuilder pchAppKeyBuffer, uint unAppKeyBufferLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationKeyByIndex GetApplicationKeyByIndex; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _GetApplicationKeyByProcessId(uint unProcessId, string pchAppKeyBuffer, uint unAppKeyBufferLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationKeyByProcessId GetApplicationKeyByProcessId; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _LaunchApplication(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LaunchApplication LaunchApplication; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _LaunchTemplateApplication(string pchTemplateAppKey, string pchNewAppKey, [In, Out] AppOverrideKeys_t[] pKeys, uint unKeys); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LaunchTemplateApplication LaunchTemplateApplication; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _LaunchApplicationFromMimeType(string pchMimeType, string pchArgs); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LaunchApplicationFromMimeType LaunchApplicationFromMimeType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _LaunchDashboardOverlay(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LaunchDashboardOverlay LaunchDashboardOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _CancelApplicationLaunch(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CancelApplicationLaunch CancelApplicationLaunch; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _IdentifyApplication(uint unProcessId, string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IdentifyApplication IdentifyApplication; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetApplicationProcessId(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationProcessId GetApplicationProcessId; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetApplicationsErrorNameFromEnum(EVRApplicationError error); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationsErrorNameFromEnum GetApplicationsErrorNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetApplicationPropertyString(string pchAppKey, EVRApplicationProperty eProperty, System.Text.StringBuilder pchPropertyValueBuffer, uint unPropertyValueBufferLen, ref EVRApplicationError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationPropertyString GetApplicationPropertyString; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetApplicationPropertyBool(string pchAppKey, EVRApplicationProperty eProperty, ref EVRApplicationError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationPropertyBool GetApplicationPropertyBool; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _GetApplicationPropertyUint64(string pchAppKey, EVRApplicationProperty eProperty, ref EVRApplicationError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationPropertyUint64 GetApplicationPropertyUint64; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _SetApplicationAutoLaunch(string pchAppKey, bool bAutoLaunch); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetApplicationAutoLaunch SetApplicationAutoLaunch; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetApplicationAutoLaunch(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationAutoLaunch GetApplicationAutoLaunch; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _SetDefaultApplicationForMimeType(string pchAppKey, string pchMimeType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetDefaultApplicationForMimeType SetDefaultApplicationForMimeType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetDefaultApplicationForMimeType(string pchMimeType, string pchAppKeyBuffer, uint unAppKeyBufferLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDefaultApplicationForMimeType GetDefaultApplicationForMimeType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetApplicationSupportedMimeTypes(string pchAppKey, string pchMimeTypesBuffer, uint unMimeTypesBuffer); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationSupportedMimeTypes GetApplicationSupportedMimeTypes; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetApplicationsThatSupportMimeType(string pchMimeType, string pchAppKeysThatSupportBuffer, uint unAppKeysThatSupportBuffer); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationsThatSupportMimeType GetApplicationsThatSupportMimeType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetApplicationLaunchArguments(uint unHandle, string pchArgs, uint unArgs); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationLaunchArguments GetApplicationLaunchArguments; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _GetStartingApplication(string pchAppKeyBuffer, uint unAppKeyBufferLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetStartingApplication GetStartingApplication; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationTransitionState _GetTransitionState(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTransitionState GetTransitionState; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _PerformApplicationPrelaunchCheck(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PerformApplicationPrelaunchCheck PerformApplicationPrelaunchCheck; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetApplicationsTransitionStateNameFromEnum(EVRApplicationTransitionState state); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationsTransitionStateNameFromEnum GetApplicationsTransitionStateNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsQuitUserPromptRequested(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsQuitUserPromptRequested IsQuitUserPromptRequested; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _LaunchInternalProcess(string pchBinaryPath, string pchArguments, string pchWorkingDirectory); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LaunchInternalProcess LaunchInternalProcess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetCurrentSceneProcessId(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCurrentSceneProcessId GetCurrentSceneProcessId; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRChaperone +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ChaperoneCalibrationState _GetCalibrationState(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCalibrationState GetCalibrationState; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetPlayAreaSize(ref float pSizeX, ref float pSizeZ); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetPlayAreaSize GetPlayAreaSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetPlayAreaRect(ref HmdQuad_t rect); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetPlayAreaRect GetPlayAreaRect; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ReloadInfo(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReloadInfo ReloadInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetSceneColor(HmdColor_t color); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetSceneColor SetSceneColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetBoundsColor(ref HmdColor_t pOutputColorArray, int nNumOutputColors, float flCollisionBoundsFadeDistance, ref HmdColor_t pOutputCameraColor); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetBoundsColor GetBoundsColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _AreBoundsVisible(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _AreBoundsVisible AreBoundsVisible; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ForceBoundsVisible(bool bForce); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ForceBoundsVisible ForceBoundsVisible; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRChaperoneSetup +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _CommitWorkingCopy(EChaperoneConfigFile configFile); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CommitWorkingCopy CommitWorkingCopy; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _RevertWorkingCopy(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RevertWorkingCopy RevertWorkingCopy; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingPlayAreaSize(ref float pSizeX, ref float pSizeZ); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingPlayAreaSize GetWorkingPlayAreaSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingPlayAreaRect(ref HmdQuad_t rect); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingPlayAreaRect GetWorkingPlayAreaRect; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingCollisionBoundsInfo([In, Out] HmdQuad_t[] pQuadsBuffer, ref uint punQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingCollisionBoundsInfo GetWorkingCollisionBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetLiveCollisionBoundsInfo([In, Out] HmdQuad_t[] pQuadsBuffer, ref uint punQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLiveCollisionBoundsInfo GetLiveCollisionBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingSeatedZeroPoseToRawTrackingPose(ref HmdMatrix34_t pmatSeatedZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingSeatedZeroPoseToRawTrackingPose GetWorkingSeatedZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingStandingZeroPoseToRawTrackingPose(ref HmdMatrix34_t pmatStandingZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingStandingZeroPoseToRawTrackingPose GetWorkingStandingZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingPlayAreaSize(float sizeX, float sizeZ); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingPlayAreaSize SetWorkingPlayAreaSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingCollisionBoundsInfo([In, Out] HmdQuad_t[] pQuadsBuffer, uint unQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingCollisionBoundsInfo SetWorkingCollisionBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingSeatedZeroPoseToRawTrackingPose(ref HmdMatrix34_t pMatSeatedZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingSeatedZeroPoseToRawTrackingPose SetWorkingSeatedZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingStandingZeroPoseToRawTrackingPose(ref HmdMatrix34_t pMatStandingZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingStandingZeroPoseToRawTrackingPose SetWorkingStandingZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ReloadFromDisk(EChaperoneConfigFile configFile); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReloadFromDisk ReloadFromDisk; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetLiveSeatedZeroPoseToRawTrackingPose(ref HmdMatrix34_t pmatSeatedZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLiveSeatedZeroPoseToRawTrackingPose GetLiveSeatedZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingCollisionBoundsTagsInfo([In, Out] byte[] pTagsBuffer, uint unTagCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingCollisionBoundsTagsInfo SetWorkingCollisionBoundsTagsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetLiveCollisionBoundsTagsInfo([In, Out] byte[] pTagsBuffer, ref uint punTagCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLiveCollisionBoundsTagsInfo GetLiveCollisionBoundsTagsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _SetWorkingPhysicalBoundsInfo([In, Out] HmdQuad_t[] pQuadsBuffer, uint unQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingPhysicalBoundsInfo SetWorkingPhysicalBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetLivePhysicalBoundsInfo([In, Out] HmdQuad_t[] pQuadsBuffer, ref uint punQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLivePhysicalBoundsInfo GetLivePhysicalBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ExportLiveToBuffer(System.Text.StringBuilder pBuffer, ref uint pnBufferLength); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ExportLiveToBuffer ExportLiveToBuffer; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ImportFromBufferToWorking(string pBuffer, uint nImportFlags); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ImportFromBufferToWorking ImportFromBufferToWorking; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRCompositor +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetTrackingSpace(ETrackingUniverseOrigin eOrigin); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetTrackingSpace SetTrackingSpace; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ETrackingUniverseOrigin _GetTrackingSpace(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTrackingSpace GetTrackingSpace; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _WaitGetPoses([In, Out] TrackedDevicePose_t[] pRenderPoseArray, uint unRenderPoseArrayCount, [In, Out] TrackedDevicePose_t[] pGamePoseArray, uint unGamePoseArrayCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _WaitGetPoses WaitGetPoses; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _GetLastPoses([In, Out] TrackedDevicePose_t[] pRenderPoseArray, uint unRenderPoseArrayCount, [In, Out] TrackedDevicePose_t[] pGamePoseArray, uint unGamePoseArrayCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLastPoses GetLastPoses; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _GetLastPoseForTrackedDeviceIndex(uint unDeviceIndex, ref TrackedDevicePose_t pOutputPose, ref TrackedDevicePose_t pOutputGamePose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLastPoseForTrackedDeviceIndex GetLastPoseForTrackedDeviceIndex; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _Submit(EVREye eEye, ref Texture_t pTexture, ref VRTextureBounds_t pBounds, EVRSubmitFlags nSubmitFlags); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _Submit Submit; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ClearLastSubmittedFrame(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ClearLastSubmittedFrame ClearLastSubmittedFrame; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _PostPresentHandoff(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PostPresentHandoff PostPresentHandoff; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetFrameTiming(ref Compositor_FrameTiming pTiming, uint unFramesAgo); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetFrameTiming GetFrameTiming; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetFrameTimings(ref Compositor_FrameTiming pTiming, uint nFrames); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetFrameTimings GetFrameTimings; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate float _GetFrameTimeRemaining(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetFrameTimeRemaining GetFrameTimeRemaining; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetCumulativeStats(ref Compositor_CumulativeStats pStats, uint nStatsSizeInBytes); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCumulativeStats GetCumulativeStats; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _FadeToColor(float fSeconds, float fRed, float fGreen, float fBlue, float fAlpha, bool bBackground); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FadeToColor FadeToColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HmdColor_t _GetCurrentFadeColor(bool bBackground); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCurrentFadeColor GetCurrentFadeColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _FadeGrid(float fSeconds, bool bFadeIn); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FadeGrid FadeGrid; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate float _GetCurrentGridAlpha(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCurrentGridAlpha GetCurrentGridAlpha; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _SetSkyboxOverride([In, Out] Texture_t[] pTextures, uint unTextureCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetSkyboxOverride SetSkyboxOverride; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ClearSkyboxOverride(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ClearSkyboxOverride ClearSkyboxOverride; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _CompositorBringToFront(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CompositorBringToFront CompositorBringToFront; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _CompositorGoToBack(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CompositorGoToBack CompositorGoToBack; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _CompositorQuit(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CompositorQuit CompositorQuit; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsFullscreen(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsFullscreen IsFullscreen; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetCurrentSceneFocusProcess(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCurrentSceneFocusProcess GetCurrentSceneFocusProcess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetLastFrameRenderer(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLastFrameRenderer GetLastFrameRenderer; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _CanRenderScene(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CanRenderScene CanRenderScene; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ShowMirrorWindow(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowMirrorWindow ShowMirrorWindow; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _HideMirrorWindow(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HideMirrorWindow HideMirrorWindow; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsMirrorWindowVisible(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsMirrorWindowVisible IsMirrorWindowVisible; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _CompositorDumpImages(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CompositorDumpImages CompositorDumpImages; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ShouldAppRenderWithLowResources(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShouldAppRenderWithLowResources ShouldAppRenderWithLowResources; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ForceInterleavedReprojectionOn(bool bOverride); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ForceInterleavedReprojectionOn ForceInterleavedReprojectionOn; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ForceReconnectProcess(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ForceReconnectProcess ForceReconnectProcess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SuspendRendering(bool bSuspend); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SuspendRendering SuspendRendering; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _GetMirrorTextureD3D11(EVREye eEye, IntPtr pD3D11DeviceOrResource, ref IntPtr ppD3D11ShaderResourceView); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetMirrorTextureD3D11 GetMirrorTextureD3D11; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ReleaseMirrorTextureD3D11(IntPtr pD3D11ShaderResourceView); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseMirrorTextureD3D11 ReleaseMirrorTextureD3D11; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _GetMirrorTextureGL(EVREye eEye, ref uint pglTextureId, IntPtr pglSharedTextureHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetMirrorTextureGL GetMirrorTextureGL; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ReleaseSharedGLTexture(uint glTextureId, IntPtr glSharedTextureHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseSharedGLTexture ReleaseSharedGLTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _LockGLSharedTextureForAccess(IntPtr glSharedTextureHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LockGLSharedTextureForAccess LockGLSharedTextureForAccess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _UnlockGLSharedTextureForAccess(IntPtr glSharedTextureHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _UnlockGLSharedTextureForAccess UnlockGLSharedTextureForAccess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetVulkanInstanceExtensionsRequired(System.Text.StringBuilder pchValue, uint unBufferSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVulkanInstanceExtensionsRequired GetVulkanInstanceExtensionsRequired; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetVulkanDeviceExtensionsRequired(IntPtr pPhysicalDevice, System.Text.StringBuilder pchValue, uint unBufferSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVulkanDeviceExtensionsRequired GetVulkanDeviceExtensionsRequired; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVROverlay +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _FindOverlay(string pchOverlayKey, ref ulong pOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FindOverlay FindOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _CreateOverlay(string pchOverlayKey, string pchOverlayName, ref ulong pOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CreateOverlay CreateOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _DestroyOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _DestroyOverlay DestroyOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetHighQualityOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetHighQualityOverlay SetHighQualityOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _GetHighQualityOverlay(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetHighQualityOverlay GetHighQualityOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetOverlayKey(ulong ulOverlayHandle, System.Text.StringBuilder pchValue, uint unBufferSize, ref EVROverlayError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayKey GetOverlayKey; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetOverlayName(ulong ulOverlayHandle, System.Text.StringBuilder pchValue, uint unBufferSize, ref EVROverlayError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayName GetOverlayName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayName(ulong ulOverlayHandle, string pchName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayName SetOverlayName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayImageData(ulong ulOverlayHandle, IntPtr pvBuffer, uint unBufferSize, ref uint punWidth, ref uint punHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayImageData GetOverlayImageData; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetOverlayErrorNameFromEnum(EVROverlayError error); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayErrorNameFromEnum GetOverlayErrorNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayRenderingPid(ulong ulOverlayHandle, uint unPID); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayRenderingPid SetOverlayRenderingPid; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetOverlayRenderingPid(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayRenderingPid GetOverlayRenderingPid; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayFlag(ulong ulOverlayHandle, VROverlayFlags eOverlayFlag, bool bEnabled); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayFlag SetOverlayFlag; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayFlag(ulong ulOverlayHandle, VROverlayFlags eOverlayFlag, ref bool pbEnabled); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayFlag GetOverlayFlag; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayColor(ulong ulOverlayHandle, float fRed, float fGreen, float fBlue); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayColor SetOverlayColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayColor(ulong ulOverlayHandle, ref float pfRed, ref float pfGreen, ref float pfBlue); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayColor GetOverlayColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayAlpha(ulong ulOverlayHandle, float fAlpha); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayAlpha SetOverlayAlpha; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayAlpha(ulong ulOverlayHandle, ref float pfAlpha); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayAlpha GetOverlayAlpha; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTexelAspect(ulong ulOverlayHandle, float fTexelAspect); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTexelAspect SetOverlayTexelAspect; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTexelAspect(ulong ulOverlayHandle, ref float pfTexelAspect); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTexelAspect GetOverlayTexelAspect; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlaySortOrder(ulong ulOverlayHandle, uint unSortOrder); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlaySortOrder SetOverlaySortOrder; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlaySortOrder(ulong ulOverlayHandle, ref uint punSortOrder); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlaySortOrder GetOverlaySortOrder; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayWidthInMeters(ulong ulOverlayHandle, float fWidthInMeters); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayWidthInMeters SetOverlayWidthInMeters; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayWidthInMeters(ulong ulOverlayHandle, ref float pfWidthInMeters); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayWidthInMeters GetOverlayWidthInMeters; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayAutoCurveDistanceRangeInMeters(ulong ulOverlayHandle, float fMinDistanceInMeters, float fMaxDistanceInMeters); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayAutoCurveDistanceRangeInMeters SetOverlayAutoCurveDistanceRangeInMeters; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayAutoCurveDistanceRangeInMeters(ulong ulOverlayHandle, ref float pfMinDistanceInMeters, ref float pfMaxDistanceInMeters); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayAutoCurveDistanceRangeInMeters GetOverlayAutoCurveDistanceRangeInMeters; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTextureColorSpace(ulong ulOverlayHandle, EColorSpace eTextureColorSpace); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTextureColorSpace SetOverlayTextureColorSpace; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTextureColorSpace(ulong ulOverlayHandle, ref EColorSpace peTextureColorSpace); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTextureColorSpace GetOverlayTextureColorSpace; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTextureBounds(ulong ulOverlayHandle, ref VRTextureBounds_t pOverlayTextureBounds); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTextureBounds SetOverlayTextureBounds; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTextureBounds(ulong ulOverlayHandle, ref VRTextureBounds_t pOverlayTextureBounds); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTextureBounds GetOverlayTextureBounds; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetOverlayRenderModel(ulong ulOverlayHandle, string pchValue, uint unBufferSize, ref HmdColor_t pColor, ref EVROverlayError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayRenderModel GetOverlayRenderModel; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayRenderModel(ulong ulOverlayHandle, string pchRenderModel, ref HmdColor_t pColor); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayRenderModel SetOverlayRenderModel; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTransformType(ulong ulOverlayHandle, ref VROverlayTransformType peTransformType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTransformType GetOverlayTransformType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTransformAbsolute(ulong ulOverlayHandle, ETrackingUniverseOrigin eTrackingOrigin, ref HmdMatrix34_t pmatTrackingOriginToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTransformAbsolute SetOverlayTransformAbsolute; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTransformAbsolute(ulong ulOverlayHandle, ref ETrackingUniverseOrigin peTrackingOrigin, ref HmdMatrix34_t pmatTrackingOriginToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTransformAbsolute GetOverlayTransformAbsolute; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTransformTrackedDeviceRelative(ulong ulOverlayHandle, uint unTrackedDevice, ref HmdMatrix34_t pmatTrackedDeviceToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTransformTrackedDeviceRelative SetOverlayTransformTrackedDeviceRelative; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTransformTrackedDeviceRelative(ulong ulOverlayHandle, ref uint punTrackedDevice, ref HmdMatrix34_t pmatTrackedDeviceToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTransformTrackedDeviceRelative GetOverlayTransformTrackedDeviceRelative; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTransformTrackedDeviceComponent(ulong ulOverlayHandle, uint unDeviceIndex, string pchComponentName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTransformTrackedDeviceComponent SetOverlayTransformTrackedDeviceComponent; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTransformTrackedDeviceComponent(ulong ulOverlayHandle, ref uint punDeviceIndex, string pchComponentName, uint unComponentNameSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTransformTrackedDeviceComponent GetOverlayTransformTrackedDeviceComponent; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTransformOverlayRelative(ulong ulOverlayHandle, ref ulong ulOverlayHandleParent, ref HmdMatrix34_t pmatParentOverlayToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTransformOverlayRelative GetOverlayTransformOverlayRelative; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTransformOverlayRelative(ulong ulOverlayHandle, ulong ulOverlayHandleParent, ref HmdMatrix34_t pmatParentOverlayToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTransformOverlayRelative SetOverlayTransformOverlayRelative; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _ShowOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowOverlay ShowOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _HideOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HideOverlay HideOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsOverlayVisible(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsOverlayVisible IsOverlayVisible; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetTransformForOverlayCoordinates(ulong ulOverlayHandle, ETrackingUniverseOrigin eTrackingOrigin, HmdVector2_t coordinatesInOverlay, ref HmdMatrix34_t pmatTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTransformForOverlayCoordinates GetTransformForOverlayCoordinates; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _PollNextOverlayEvent(ulong ulOverlayHandle, ref VREvent_t pEvent, uint uncbVREvent); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PollNextOverlayEvent PollNextOverlayEvent; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayInputMethod(ulong ulOverlayHandle, ref VROverlayInputMethod peInputMethod); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayInputMethod GetOverlayInputMethod; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayInputMethod(ulong ulOverlayHandle, VROverlayInputMethod eInputMethod); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayInputMethod SetOverlayInputMethod; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayMouseScale(ulong ulOverlayHandle, ref HmdVector2_t pvecMouseScale); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayMouseScale GetOverlayMouseScale; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayMouseScale(ulong ulOverlayHandle, ref HmdVector2_t pvecMouseScale); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayMouseScale SetOverlayMouseScale; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ComputeOverlayIntersection(ulong ulOverlayHandle, ref VROverlayIntersectionParams_t pParams, ref VROverlayIntersectionResults_t pResults); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ComputeOverlayIntersection ComputeOverlayIntersection; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _HandleControllerOverlayInteractionAsMouse(ulong ulOverlayHandle, uint unControllerDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HandleControllerOverlayInteractionAsMouse HandleControllerOverlayInteractionAsMouse; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsHoverTargetOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsHoverTargetOverlay IsHoverTargetOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _GetGamepadFocusOverlay(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetGamepadFocusOverlay GetGamepadFocusOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetGamepadFocusOverlay(ulong ulNewFocusOverlay); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetGamepadFocusOverlay SetGamepadFocusOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayNeighbor(EOverlayDirection eDirection, ulong ulFrom, ulong ulTo); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayNeighbor SetOverlayNeighbor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _MoveGamepadFocusToNeighbor(EOverlayDirection eDirection, ulong ulFrom); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _MoveGamepadFocusToNeighbor MoveGamepadFocusToNeighbor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTexture(ulong ulOverlayHandle, ref Texture_t pTexture); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTexture SetOverlayTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _ClearOverlayTexture(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ClearOverlayTexture ClearOverlayTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayRaw(ulong ulOverlayHandle, IntPtr pvBuffer, uint unWidth, uint unHeight, uint unDepth); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayRaw SetOverlayRaw; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayFromFile(ulong ulOverlayHandle, string pchFilePath); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayFromFile SetOverlayFromFile; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTexture(ulong ulOverlayHandle, ref IntPtr pNativeTextureHandle, IntPtr pNativeTextureRef, ref uint pWidth, ref uint pHeight, ref uint pNativeFormat, ref ETextureType pAPIType, ref EColorSpace pColorSpace, ref VRTextureBounds_t pTextureBounds); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTexture GetOverlayTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _ReleaseNativeOverlayHandle(ulong ulOverlayHandle, IntPtr pNativeTextureHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseNativeOverlayHandle ReleaseNativeOverlayHandle; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTextureSize(ulong ulOverlayHandle, ref uint pWidth, ref uint pHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTextureSize GetOverlayTextureSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _CreateDashboardOverlay(string pchOverlayKey, string pchOverlayFriendlyName, ref ulong pMainHandle, ref ulong pThumbnailHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CreateDashboardOverlay CreateDashboardOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsDashboardVisible(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsDashboardVisible IsDashboardVisible; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsActiveDashboardOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsActiveDashboardOverlay IsActiveDashboardOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetDashboardOverlaySceneProcess(ulong ulOverlayHandle, uint unProcessId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetDashboardOverlaySceneProcess SetDashboardOverlaySceneProcess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetDashboardOverlaySceneProcess(ulong ulOverlayHandle, ref uint punProcessId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDashboardOverlaySceneProcess GetDashboardOverlaySceneProcess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ShowDashboard(string pchOverlayToShow); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowDashboard ShowDashboard; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetPrimaryDashboardDevice(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetPrimaryDashboardDevice GetPrimaryDashboardDevice; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _ShowKeyboard(int eInputMode, int eLineInputMode, string pchDescription, uint unCharMax, string pchExistingText, bool bUseMinimalMode, ulong uUserValue); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowKeyboard ShowKeyboard; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _ShowKeyboardForOverlay(ulong ulOverlayHandle, int eInputMode, int eLineInputMode, string pchDescription, uint unCharMax, string pchExistingText, bool bUseMinimalMode, ulong uUserValue); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowKeyboardForOverlay ShowKeyboardForOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetKeyboardText(System.Text.StringBuilder pchText, uint cchText); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetKeyboardText GetKeyboardText; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _HideKeyboard(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HideKeyboard HideKeyboard; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetKeyboardTransformAbsolute(ETrackingUniverseOrigin eTrackingOrigin, ref HmdMatrix34_t pmatTrackingOriginToKeyboardTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetKeyboardTransformAbsolute SetKeyboardTransformAbsolute; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetKeyboardPositionForOverlay(ulong ulOverlayHandle, HmdRect2_t avoidRect); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetKeyboardPositionForOverlay SetKeyboardPositionForOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayIntersectionMask(ulong ulOverlayHandle, ref VROverlayIntersectionMaskPrimitive_t pMaskPrimitives, uint unNumMaskPrimitives, uint unPrimitiveSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayIntersectionMask SetOverlayIntersectionMask; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayFlags(ulong ulOverlayHandle, ref uint pFlags); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayFlags GetOverlayFlags; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate VRMessageOverlayResponse _ShowMessageOverlay(string pchText, string pchCaption, string pchButton0Text, string pchButton1Text, string pchButton2Text, string pchButton3Text); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowMessageOverlay ShowMessageOverlay; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRRenderModels +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRRenderModelError _LoadRenderModel_Async(string pchRenderModelName, ref IntPtr ppRenderModel); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LoadRenderModel_Async LoadRenderModel_Async; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _FreeRenderModel(IntPtr pRenderModel); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FreeRenderModel FreeRenderModel; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRRenderModelError _LoadTexture_Async(int textureId, ref IntPtr ppTexture); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LoadTexture_Async LoadTexture_Async; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _FreeTexture(IntPtr pTexture); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FreeTexture FreeTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRRenderModelError _LoadTextureD3D11_Async(int textureId, IntPtr pD3D11Device, ref IntPtr ppD3D11Texture2D); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LoadTextureD3D11_Async LoadTextureD3D11_Async; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRRenderModelError _LoadIntoTextureD3D11_Async(int textureId, IntPtr pDstTexture); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LoadIntoTextureD3D11_Async LoadIntoTextureD3D11_Async; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _FreeTextureD3D11(IntPtr pD3D11Texture2D); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FreeTextureD3D11 FreeTextureD3D11; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetRenderModelName(uint unRenderModelIndex, System.Text.StringBuilder pchRenderModelName, uint unRenderModelNameLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelName GetRenderModelName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetRenderModelCount(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelCount GetRenderModelCount; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetComponentCount(string pchRenderModelName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentCount GetComponentCount; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetComponentName(string pchRenderModelName, uint unComponentIndex, System.Text.StringBuilder pchComponentName, uint unComponentNameLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentName GetComponentName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _GetComponentButtonMask(string pchRenderModelName, string pchComponentName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentButtonMask GetComponentButtonMask; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetComponentRenderModelName(string pchRenderModelName, string pchComponentName, System.Text.StringBuilder pchComponentRenderModelName, uint unComponentRenderModelNameLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentRenderModelName GetComponentRenderModelName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetComponentState(string pchRenderModelName, string pchComponentName, ref VRControllerState_t pControllerState, ref RenderModel_ControllerMode_State_t pState, ref RenderModel_ComponentState_t pComponentState); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentState GetComponentState; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _RenderModelHasComponent(string pchRenderModelName, string pchComponentName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RenderModelHasComponent RenderModelHasComponent; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetRenderModelThumbnailURL(string pchRenderModelName, System.Text.StringBuilder pchThumbnailURL, uint unThumbnailURLLen, ref EVRRenderModelError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelThumbnailURL GetRenderModelThumbnailURL; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetRenderModelOriginalPath(string pchRenderModelName, System.Text.StringBuilder pchOriginalPath, uint unOriginalPathLen, ref EVRRenderModelError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelOriginalPath GetRenderModelOriginalPath; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetRenderModelErrorNameFromEnum(EVRRenderModelError error); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelErrorNameFromEnum GetRenderModelErrorNameFromEnum; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRNotifications +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRNotificationError _CreateNotification(ulong ulOverlayHandle, ulong ulUserValue, EVRNotificationType type, string pchText, EVRNotificationStyle style, ref NotificationBitmap_t pImage, ref uint pNotificationId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CreateNotification CreateNotification; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRNotificationError _RemoveNotification(uint notificationId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RemoveNotification RemoveNotification; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRSettings +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetSettingsErrorNameFromEnum(EVRSettingsError eError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetSettingsErrorNameFromEnum GetSettingsErrorNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _Sync(bool bForce, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _Sync Sync; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetBool(string pchSection, string pchSettingsKey, bool bValue, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetBool SetBool; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetInt32(string pchSection, string pchSettingsKey, int nValue, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetInt32 SetInt32; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetFloat(string pchSection, string pchSettingsKey, float flValue, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetFloat SetFloat; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetString(string pchSection, string pchSettingsKey, string pchValue, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetString SetString; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetBool(string pchSection, string pchSettingsKey, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetBool GetBool; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate int _GetInt32(string pchSection, string pchSettingsKey, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetInt32 GetInt32; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate float _GetFloat(string pchSection, string pchSettingsKey, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetFloat GetFloat; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetString(string pchSection, string pchSettingsKey, System.Text.StringBuilder pchValue, uint unValueLen, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetString GetString; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _RemoveSection(string pchSection, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RemoveSection RemoveSection; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _RemoveKeyInSection(string pchSection, string pchSettingsKey, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RemoveKeyInSection RemoveKeyInSection; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRScreenshots +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRScreenshotError _RequestScreenshot(ref uint pOutScreenshotHandle, EVRScreenshotType type, string pchPreviewFilename, string pchVRFilename); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RequestScreenshot RequestScreenshot; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRScreenshotError _HookScreenshot([In, Out] EVRScreenshotType[] pSupportedTypes, int numTypes); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HookScreenshot HookScreenshot; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRScreenshotType _GetScreenshotPropertyType(uint screenshotHandle, ref EVRScreenshotError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetScreenshotPropertyType GetScreenshotPropertyType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetScreenshotPropertyFilename(uint screenshotHandle, EVRScreenshotPropertyFilenames filenameType, System.Text.StringBuilder pchFilename, uint cchFilename, ref EVRScreenshotError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetScreenshotPropertyFilename GetScreenshotPropertyFilename; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRScreenshotError _UpdateScreenshotProgress(uint screenshotHandle, float flProgress); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _UpdateScreenshotProgress UpdateScreenshotProgress; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRScreenshotError _TakeStereoScreenshot(ref uint pOutScreenshotHandle, string pchPreviewFilename, string pchVRFilename); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _TakeStereoScreenshot TakeStereoScreenshot; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRScreenshotError _SubmitScreenshot(uint screenshotHandle, EVRScreenshotType type, string pchSourcePreviewFilename, string pchSourceVRFilename); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SubmitScreenshot SubmitScreenshot; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRResources +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _LoadSharedResource(string pchResourceName, string pchBuffer, uint unBufferLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LoadSharedResource LoadSharedResource; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetResourceFullPath(string pchResourceName, string pchResourceTypeDirectory, string pchPathBuffer, uint unBufferLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetResourceFullPath GetResourceFullPath; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRDriverManager +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetDriverCount(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDriverCount GetDriverCount; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetDriverName(uint nDriver, System.Text.StringBuilder pchValue, uint unBufferSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDriverName GetDriverName; + +} + + +public class CVRSystem +{ + IVRSystem FnTable; + internal CVRSystem(IntPtr pInterface) + { + FnTable = (IVRSystem)Marshal.PtrToStructure(pInterface, typeof(IVRSystem)); + } + public void GetRecommendedRenderTargetSize(ref uint pnWidth,ref uint pnHeight) + { + pnWidth = 0; + pnHeight = 0; + FnTable.GetRecommendedRenderTargetSize(ref pnWidth,ref pnHeight); + } + public HmdMatrix44_t GetProjectionMatrix(EVREye eEye,float fNearZ,float fFarZ) + { + HmdMatrix44_t result = FnTable.GetProjectionMatrix(eEye,fNearZ,fFarZ); + return result; + } + public void GetProjectionRaw(EVREye eEye,ref float pfLeft,ref float pfRight,ref float pfTop,ref float pfBottom) + { + pfLeft = 0; + pfRight = 0; + pfTop = 0; + pfBottom = 0; + FnTable.GetProjectionRaw(eEye,ref pfLeft,ref pfRight,ref pfTop,ref pfBottom); + } + public bool ComputeDistortion(EVREye eEye,float fU,float fV,ref DistortionCoordinates_t pDistortionCoordinates) + { + bool result = FnTable.ComputeDistortion(eEye,fU,fV,ref pDistortionCoordinates); + return result; + } + public HmdMatrix34_t GetEyeToHeadTransform(EVREye eEye) + { + HmdMatrix34_t result = FnTable.GetEyeToHeadTransform(eEye); + return result; + } + public bool GetTimeSinceLastVsync(ref float pfSecondsSinceLastVsync,ref ulong pulFrameCounter) + { + pfSecondsSinceLastVsync = 0; + pulFrameCounter = 0; + bool result = FnTable.GetTimeSinceLastVsync(ref pfSecondsSinceLastVsync,ref pulFrameCounter); + return result; + } + public int GetD3D9AdapterIndex() + { + int result = FnTable.GetD3D9AdapterIndex(); + return result; + } + public void GetDXGIOutputInfo(ref int pnAdapterIndex) + { + pnAdapterIndex = 0; + FnTable.GetDXGIOutputInfo(ref pnAdapterIndex); + } + public void GetOutputDevice(ref ulong pnDevice,ETextureType textureType) + { + pnDevice = 0; + FnTable.GetOutputDevice(ref pnDevice,textureType); + } + public bool IsDisplayOnDesktop() + { + bool result = FnTable.IsDisplayOnDesktop(); + return result; + } + public bool SetDisplayVisibility(bool bIsVisibleOnDesktop) + { + bool result = FnTable.SetDisplayVisibility(bIsVisibleOnDesktop); + return result; + } + public void GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin eOrigin,float fPredictedSecondsToPhotonsFromNow,TrackedDevicePose_t [] pTrackedDevicePoseArray) + { + FnTable.GetDeviceToAbsoluteTrackingPose(eOrigin,fPredictedSecondsToPhotonsFromNow,pTrackedDevicePoseArray,(uint) pTrackedDevicePoseArray.Length); + } + public void ResetSeatedZeroPose() + { + FnTable.ResetSeatedZeroPose(); + } + public HmdMatrix34_t GetSeatedZeroPoseToStandingAbsoluteTrackingPose() + { + HmdMatrix34_t result = FnTable.GetSeatedZeroPoseToStandingAbsoluteTrackingPose(); + return result; + } + public HmdMatrix34_t GetRawZeroPoseToStandingAbsoluteTrackingPose() + { + HmdMatrix34_t result = FnTable.GetRawZeroPoseToStandingAbsoluteTrackingPose(); + return result; + } + public uint GetSortedTrackedDeviceIndicesOfClass(ETrackedDeviceClass eTrackedDeviceClass,uint [] punTrackedDeviceIndexArray,uint unRelativeToTrackedDeviceIndex) + { + uint result = FnTable.GetSortedTrackedDeviceIndicesOfClass(eTrackedDeviceClass,punTrackedDeviceIndexArray,(uint) punTrackedDeviceIndexArray.Length,unRelativeToTrackedDeviceIndex); + return result; + } + public EDeviceActivityLevel GetTrackedDeviceActivityLevel(uint unDeviceId) + { + EDeviceActivityLevel result = FnTable.GetTrackedDeviceActivityLevel(unDeviceId); + return result; + } + public void ApplyTransform(ref TrackedDevicePose_t pOutputPose,ref TrackedDevicePose_t pTrackedDevicePose,ref HmdMatrix34_t pTransform) + { + FnTable.ApplyTransform(ref pOutputPose,ref pTrackedDevicePose,ref pTransform); + } + public uint GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole unDeviceType) + { + uint result = FnTable.GetTrackedDeviceIndexForControllerRole(unDeviceType); + return result; + } + public ETrackedControllerRole GetControllerRoleForTrackedDeviceIndex(uint unDeviceIndex) + { + ETrackedControllerRole result = FnTable.GetControllerRoleForTrackedDeviceIndex(unDeviceIndex); + return result; + } + public ETrackedDeviceClass GetTrackedDeviceClass(uint unDeviceIndex) + { + ETrackedDeviceClass result = FnTable.GetTrackedDeviceClass(unDeviceIndex); + return result; + } + public bool IsTrackedDeviceConnected(uint unDeviceIndex) + { + bool result = FnTable.IsTrackedDeviceConnected(unDeviceIndex); + return result; + } + public bool GetBoolTrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,ref ETrackedPropertyError pError) + { + bool result = FnTable.GetBoolTrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public float GetFloatTrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,ref ETrackedPropertyError pError) + { + float result = FnTable.GetFloatTrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public int GetInt32TrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,ref ETrackedPropertyError pError) + { + int result = FnTable.GetInt32TrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public ulong GetUint64TrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,ref ETrackedPropertyError pError) + { + ulong result = FnTable.GetUint64TrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public HmdMatrix34_t GetMatrix34TrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,ref ETrackedPropertyError pError) + { + HmdMatrix34_t result = FnTable.GetMatrix34TrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public uint GetStringTrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,System.Text.StringBuilder pchValue,uint unBufferSize,ref ETrackedPropertyError pError) + { + uint result = FnTable.GetStringTrackedDeviceProperty(unDeviceIndex,prop,pchValue,unBufferSize,ref pError); + return result; + } + public string GetPropErrorNameFromEnum(ETrackedPropertyError error) + { + IntPtr result = FnTable.GetPropErrorNameFromEnum(error); + return Marshal.PtrToStringAnsi(result); + } +// This is a terrible hack to workaround the fact that VRControllerState_t and VREvent_t were +// originally mis-compiled with the wrong packing for Linux and OSX. + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _PollNextEventPacked(ref VREvent_t_Packed pEvent,uint uncbVREvent); + [StructLayout(LayoutKind.Explicit)] + struct PollNextEventUnion + { + [FieldOffset(0)] + public IVRSystem._PollNextEvent pPollNextEvent; + [FieldOffset(0)] + public _PollNextEventPacked pPollNextEventPacked; + } + public bool PollNextEvent(ref VREvent_t pEvent,uint uncbVREvent) + { + if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || + (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) + { + PollNextEventUnion u; + VREvent_t_Packed event_packed = new VREvent_t_Packed(); + u.pPollNextEventPacked = null; + u.pPollNextEvent = FnTable.PollNextEvent; + bool packed_result = u.pPollNextEventPacked(ref event_packed,(uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VREvent_t_Packed))); + + event_packed.Unpack(ref pEvent); + return packed_result; + } + bool result = FnTable.PollNextEvent(ref pEvent,uncbVREvent); + return result; + } + public bool PollNextEventWithPose(ETrackingUniverseOrigin eOrigin,ref VREvent_t pEvent,uint uncbVREvent,ref TrackedDevicePose_t pTrackedDevicePose) + { + bool result = FnTable.PollNextEventWithPose(eOrigin,ref pEvent,uncbVREvent,ref pTrackedDevicePose); + return result; + } + public string GetEventTypeNameFromEnum(EVREventType eType) + { + IntPtr result = FnTable.GetEventTypeNameFromEnum(eType); + return Marshal.PtrToStringAnsi(result); + } + public HiddenAreaMesh_t GetHiddenAreaMesh(EVREye eEye,EHiddenAreaMeshType type) + { + HiddenAreaMesh_t result = FnTable.GetHiddenAreaMesh(eEye,type); + return result; + } +// This is a terrible hack to workaround the fact that VRControllerState_t and VREvent_t were +// originally mis-compiled with the wrong packing for Linux and OSX. + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetControllerStatePacked(uint unControllerDeviceIndex,ref VRControllerState_t_Packed pControllerState,uint unControllerStateSize); + [StructLayout(LayoutKind.Explicit)] + struct GetControllerStateUnion + { + [FieldOffset(0)] + public IVRSystem._GetControllerState pGetControllerState; + [FieldOffset(0)] + public _GetControllerStatePacked pGetControllerStatePacked; + } + public bool GetControllerState(uint unControllerDeviceIndex,ref VRControllerState_t pControllerState,uint unControllerStateSize) + { + if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || + (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) + { + GetControllerStateUnion u; + VRControllerState_t_Packed state_packed = new VRControllerState_t_Packed(pControllerState); + u.pGetControllerStatePacked = null; + u.pGetControllerState = FnTable.GetControllerState; + bool packed_result = u.pGetControllerStatePacked(unControllerDeviceIndex,ref state_packed,(uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VRControllerState_t_Packed))); + + state_packed.Unpack(ref pControllerState); + return packed_result; + } + bool result = FnTable.GetControllerState(unControllerDeviceIndex,ref pControllerState,unControllerStateSize); + return result; + } +// This is a terrible hack to workaround the fact that VRControllerState_t and VREvent_t were +// originally mis-compiled with the wrong packing for Linux and OSX. + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetControllerStateWithPosePacked(ETrackingUniverseOrigin eOrigin,uint unControllerDeviceIndex,ref VRControllerState_t_Packed pControllerState,uint unControllerStateSize,ref TrackedDevicePose_t pTrackedDevicePose); + [StructLayout(LayoutKind.Explicit)] + struct GetControllerStateWithPoseUnion + { + [FieldOffset(0)] + public IVRSystem._GetControllerStateWithPose pGetControllerStateWithPose; + [FieldOffset(0)] + public _GetControllerStateWithPosePacked pGetControllerStateWithPosePacked; + } + public bool GetControllerStateWithPose(ETrackingUniverseOrigin eOrigin,uint unControllerDeviceIndex,ref VRControllerState_t pControllerState,uint unControllerStateSize,ref TrackedDevicePose_t pTrackedDevicePose) + { + if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || + (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) + { + GetControllerStateWithPoseUnion u; + VRControllerState_t_Packed state_packed = new VRControllerState_t_Packed(pControllerState); + u.pGetControllerStateWithPosePacked = null; + u.pGetControllerStateWithPose = FnTable.GetControllerStateWithPose; + bool packed_result = u.pGetControllerStateWithPosePacked(eOrigin,unControllerDeviceIndex,ref state_packed,(uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VRControllerState_t_Packed)),ref pTrackedDevicePose); + + state_packed.Unpack(ref pControllerState); + return packed_result; + } + bool result = FnTable.GetControllerStateWithPose(eOrigin,unControllerDeviceIndex,ref pControllerState,unControllerStateSize,ref pTrackedDevicePose); + return result; + } + public void TriggerHapticPulse(uint unControllerDeviceIndex,uint unAxisId,char usDurationMicroSec) + { + FnTable.TriggerHapticPulse(unControllerDeviceIndex,unAxisId,usDurationMicroSec); + } + public string GetButtonIdNameFromEnum(EVRButtonId eButtonId) + { + IntPtr result = FnTable.GetButtonIdNameFromEnum(eButtonId); + return Marshal.PtrToStringAnsi(result); + } + public string GetControllerAxisTypeNameFromEnum(EVRControllerAxisType eAxisType) + { + IntPtr result = FnTable.GetControllerAxisTypeNameFromEnum(eAxisType); + return Marshal.PtrToStringAnsi(result); + } + public bool CaptureInputFocus() + { + bool result = FnTable.CaptureInputFocus(); + return result; + } + public void ReleaseInputFocus() + { + FnTable.ReleaseInputFocus(); + } + public bool IsInputFocusCapturedByAnotherProcess() + { + bool result = FnTable.IsInputFocusCapturedByAnotherProcess(); + return result; + } + public uint DriverDebugRequest(uint unDeviceIndex,string pchRequest,string pchResponseBuffer,uint unResponseBufferSize) + { + uint result = FnTable.DriverDebugRequest(unDeviceIndex,pchRequest,pchResponseBuffer,unResponseBufferSize); + return result; + } + public EVRFirmwareError PerformFirmwareUpdate(uint unDeviceIndex) + { + EVRFirmwareError result = FnTable.PerformFirmwareUpdate(unDeviceIndex); + return result; + } + public void AcknowledgeQuit_Exiting() + { + FnTable.AcknowledgeQuit_Exiting(); + } + public void AcknowledgeQuit_UserPrompt() + { + FnTable.AcknowledgeQuit_UserPrompt(); + } +} + + +public class CVRExtendedDisplay +{ + IVRExtendedDisplay FnTable; + internal CVRExtendedDisplay(IntPtr pInterface) + { + FnTable = (IVRExtendedDisplay)Marshal.PtrToStructure(pInterface, typeof(IVRExtendedDisplay)); + } + public void GetWindowBounds(ref int pnX,ref int pnY,ref uint pnWidth,ref uint pnHeight) + { + pnX = 0; + pnY = 0; + pnWidth = 0; + pnHeight = 0; + FnTable.GetWindowBounds(ref pnX,ref pnY,ref pnWidth,ref pnHeight); + } + public void GetEyeOutputViewport(EVREye eEye,ref uint pnX,ref uint pnY,ref uint pnWidth,ref uint pnHeight) + { + pnX = 0; + pnY = 0; + pnWidth = 0; + pnHeight = 0; + FnTable.GetEyeOutputViewport(eEye,ref pnX,ref pnY,ref pnWidth,ref pnHeight); + } + public void GetDXGIOutputInfo(ref int pnAdapterIndex,ref int pnAdapterOutputIndex) + { + pnAdapterIndex = 0; + pnAdapterOutputIndex = 0; + FnTable.GetDXGIOutputInfo(ref pnAdapterIndex,ref pnAdapterOutputIndex); + } +} + + +public class CVRTrackedCamera +{ + IVRTrackedCamera FnTable; + internal CVRTrackedCamera(IntPtr pInterface) + { + FnTable = (IVRTrackedCamera)Marshal.PtrToStructure(pInterface, typeof(IVRTrackedCamera)); + } + public string GetCameraErrorNameFromEnum(EVRTrackedCameraError eCameraError) + { + IntPtr result = FnTable.GetCameraErrorNameFromEnum(eCameraError); + return Marshal.PtrToStringAnsi(result); + } + public EVRTrackedCameraError HasCamera(uint nDeviceIndex,ref bool pHasCamera) + { + pHasCamera = false; + EVRTrackedCameraError result = FnTable.HasCamera(nDeviceIndex,ref pHasCamera); + return result; + } + public EVRTrackedCameraError GetCameraFrameSize(uint nDeviceIndex,EVRTrackedCameraFrameType eFrameType,ref uint pnWidth,ref uint pnHeight,ref uint pnFrameBufferSize) + { + pnWidth = 0; + pnHeight = 0; + pnFrameBufferSize = 0; + EVRTrackedCameraError result = FnTable.GetCameraFrameSize(nDeviceIndex,eFrameType,ref pnWidth,ref pnHeight,ref pnFrameBufferSize); + return result; + } + public EVRTrackedCameraError GetCameraIntrinsics(uint nDeviceIndex,EVRTrackedCameraFrameType eFrameType,ref HmdVector2_t pFocalLength,ref HmdVector2_t pCenter) + { + EVRTrackedCameraError result = FnTable.GetCameraIntrinsics(nDeviceIndex,eFrameType,ref pFocalLength,ref pCenter); + return result; + } + public EVRTrackedCameraError GetCameraProjection(uint nDeviceIndex,EVRTrackedCameraFrameType eFrameType,float flZNear,float flZFar,ref HmdMatrix44_t pProjection) + { + EVRTrackedCameraError result = FnTable.GetCameraProjection(nDeviceIndex,eFrameType,flZNear,flZFar,ref pProjection); + return result; + } + public EVRTrackedCameraError AcquireVideoStreamingService(uint nDeviceIndex,ref ulong pHandle) + { + pHandle = 0; + EVRTrackedCameraError result = FnTable.AcquireVideoStreamingService(nDeviceIndex,ref pHandle); + return result; + } + public EVRTrackedCameraError ReleaseVideoStreamingService(ulong hTrackedCamera) + { + EVRTrackedCameraError result = FnTable.ReleaseVideoStreamingService(hTrackedCamera); + return result; + } + public EVRTrackedCameraError GetVideoStreamFrameBuffer(ulong hTrackedCamera,EVRTrackedCameraFrameType eFrameType,IntPtr pFrameBuffer,uint nFrameBufferSize,ref CameraVideoStreamFrameHeader_t pFrameHeader,uint nFrameHeaderSize) + { + EVRTrackedCameraError result = FnTable.GetVideoStreamFrameBuffer(hTrackedCamera,eFrameType,pFrameBuffer,nFrameBufferSize,ref pFrameHeader,nFrameHeaderSize); + return result; + } + public EVRTrackedCameraError GetVideoStreamTextureSize(uint nDeviceIndex,EVRTrackedCameraFrameType eFrameType,ref VRTextureBounds_t pTextureBounds,ref uint pnWidth,ref uint pnHeight) + { + pnWidth = 0; + pnHeight = 0; + EVRTrackedCameraError result = FnTable.GetVideoStreamTextureSize(nDeviceIndex,eFrameType,ref pTextureBounds,ref pnWidth,ref pnHeight); + return result; + } + public EVRTrackedCameraError GetVideoStreamTextureD3D11(ulong hTrackedCamera,EVRTrackedCameraFrameType eFrameType,IntPtr pD3D11DeviceOrResource,ref IntPtr ppD3D11ShaderResourceView,ref CameraVideoStreamFrameHeader_t pFrameHeader,uint nFrameHeaderSize) + { + EVRTrackedCameraError result = FnTable.GetVideoStreamTextureD3D11(hTrackedCamera,eFrameType,pD3D11DeviceOrResource,ref ppD3D11ShaderResourceView,ref pFrameHeader,nFrameHeaderSize); + return result; + } + public EVRTrackedCameraError GetVideoStreamTextureGL(ulong hTrackedCamera,EVRTrackedCameraFrameType eFrameType,ref uint pglTextureId,ref CameraVideoStreamFrameHeader_t pFrameHeader,uint nFrameHeaderSize) + { + pglTextureId = 0; + EVRTrackedCameraError result = FnTable.GetVideoStreamTextureGL(hTrackedCamera,eFrameType,ref pglTextureId,ref pFrameHeader,nFrameHeaderSize); + return result; + } + public EVRTrackedCameraError ReleaseVideoStreamTextureGL(ulong hTrackedCamera,uint glTextureId) + { + EVRTrackedCameraError result = FnTable.ReleaseVideoStreamTextureGL(hTrackedCamera,glTextureId); + return result; + } +} + + +public class CVRApplications +{ + IVRApplications FnTable; + internal CVRApplications(IntPtr pInterface) + { + FnTable = (IVRApplications)Marshal.PtrToStructure(pInterface, typeof(IVRApplications)); + } + public EVRApplicationError AddApplicationManifest(string pchApplicationManifestFullPath,bool bTemporary) + { + EVRApplicationError result = FnTable.AddApplicationManifest(pchApplicationManifestFullPath,bTemporary); + return result; + } + public EVRApplicationError RemoveApplicationManifest(string pchApplicationManifestFullPath) + { + EVRApplicationError result = FnTable.RemoveApplicationManifest(pchApplicationManifestFullPath); + return result; + } + public bool IsApplicationInstalled(string pchAppKey) + { + bool result = FnTable.IsApplicationInstalled(pchAppKey); + return result; + } + public uint GetApplicationCount() + { + uint result = FnTable.GetApplicationCount(); + return result; + } + public EVRApplicationError GetApplicationKeyByIndex(uint unApplicationIndex,System.Text.StringBuilder pchAppKeyBuffer,uint unAppKeyBufferLen) + { + EVRApplicationError result = FnTable.GetApplicationKeyByIndex(unApplicationIndex,pchAppKeyBuffer,unAppKeyBufferLen); + return result; + } + public EVRApplicationError GetApplicationKeyByProcessId(uint unProcessId,string pchAppKeyBuffer,uint unAppKeyBufferLen) + { + EVRApplicationError result = FnTable.GetApplicationKeyByProcessId(unProcessId,pchAppKeyBuffer,unAppKeyBufferLen); + return result; + } + public EVRApplicationError LaunchApplication(string pchAppKey) + { + EVRApplicationError result = FnTable.LaunchApplication(pchAppKey); + return result; + } + public EVRApplicationError LaunchTemplateApplication(string pchTemplateAppKey,string pchNewAppKey,AppOverrideKeys_t [] pKeys) + { + EVRApplicationError result = FnTable.LaunchTemplateApplication(pchTemplateAppKey,pchNewAppKey,pKeys,(uint) pKeys.Length); + return result; + } + public EVRApplicationError LaunchApplicationFromMimeType(string pchMimeType,string pchArgs) + { + EVRApplicationError result = FnTable.LaunchApplicationFromMimeType(pchMimeType,pchArgs); + return result; + } + public EVRApplicationError LaunchDashboardOverlay(string pchAppKey) + { + EVRApplicationError result = FnTable.LaunchDashboardOverlay(pchAppKey); + return result; + } + public bool CancelApplicationLaunch(string pchAppKey) + { + bool result = FnTable.CancelApplicationLaunch(pchAppKey); + return result; + } + public EVRApplicationError IdentifyApplication(uint unProcessId,string pchAppKey) + { + EVRApplicationError result = FnTable.IdentifyApplication(unProcessId,pchAppKey); + return result; + } + public uint GetApplicationProcessId(string pchAppKey) + { + uint result = FnTable.GetApplicationProcessId(pchAppKey); + return result; + } + public string GetApplicationsErrorNameFromEnum(EVRApplicationError error) + { + IntPtr result = FnTable.GetApplicationsErrorNameFromEnum(error); + return Marshal.PtrToStringAnsi(result); + } + public uint GetApplicationPropertyString(string pchAppKey,EVRApplicationProperty eProperty,System.Text.StringBuilder pchPropertyValueBuffer,uint unPropertyValueBufferLen,ref EVRApplicationError peError) + { + uint result = FnTable.GetApplicationPropertyString(pchAppKey,eProperty,pchPropertyValueBuffer,unPropertyValueBufferLen,ref peError); + return result; + } + public bool GetApplicationPropertyBool(string pchAppKey,EVRApplicationProperty eProperty,ref EVRApplicationError peError) + { + bool result = FnTable.GetApplicationPropertyBool(pchAppKey,eProperty,ref peError); + return result; + } + public ulong GetApplicationPropertyUint64(string pchAppKey,EVRApplicationProperty eProperty,ref EVRApplicationError peError) + { + ulong result = FnTable.GetApplicationPropertyUint64(pchAppKey,eProperty,ref peError); + return result; + } + public EVRApplicationError SetApplicationAutoLaunch(string pchAppKey,bool bAutoLaunch) + { + EVRApplicationError result = FnTable.SetApplicationAutoLaunch(pchAppKey,bAutoLaunch); + return result; + } + public bool GetApplicationAutoLaunch(string pchAppKey) + { + bool result = FnTable.GetApplicationAutoLaunch(pchAppKey); + return result; + } + public EVRApplicationError SetDefaultApplicationForMimeType(string pchAppKey,string pchMimeType) + { + EVRApplicationError result = FnTable.SetDefaultApplicationForMimeType(pchAppKey,pchMimeType); + return result; + } + public bool GetDefaultApplicationForMimeType(string pchMimeType,string pchAppKeyBuffer,uint unAppKeyBufferLen) + { + bool result = FnTable.GetDefaultApplicationForMimeType(pchMimeType,pchAppKeyBuffer,unAppKeyBufferLen); + return result; + } + public bool GetApplicationSupportedMimeTypes(string pchAppKey,string pchMimeTypesBuffer,uint unMimeTypesBuffer) + { + bool result = FnTable.GetApplicationSupportedMimeTypes(pchAppKey,pchMimeTypesBuffer,unMimeTypesBuffer); + return result; + } + public uint GetApplicationsThatSupportMimeType(string pchMimeType,string pchAppKeysThatSupportBuffer,uint unAppKeysThatSupportBuffer) + { + uint result = FnTable.GetApplicationsThatSupportMimeType(pchMimeType,pchAppKeysThatSupportBuffer,unAppKeysThatSupportBuffer); + return result; + } + public uint GetApplicationLaunchArguments(uint unHandle,string pchArgs,uint unArgs) + { + uint result = FnTable.GetApplicationLaunchArguments(unHandle,pchArgs,unArgs); + return result; + } + public EVRApplicationError GetStartingApplication(string pchAppKeyBuffer,uint unAppKeyBufferLen) + { + EVRApplicationError result = FnTable.GetStartingApplication(pchAppKeyBuffer,unAppKeyBufferLen); + return result; + } + public EVRApplicationTransitionState GetTransitionState() + { + EVRApplicationTransitionState result = FnTable.GetTransitionState(); + return result; + } + public EVRApplicationError PerformApplicationPrelaunchCheck(string pchAppKey) + { + EVRApplicationError result = FnTable.PerformApplicationPrelaunchCheck(pchAppKey); + return result; + } + public string GetApplicationsTransitionStateNameFromEnum(EVRApplicationTransitionState state) + { + IntPtr result = FnTable.GetApplicationsTransitionStateNameFromEnum(state); + return Marshal.PtrToStringAnsi(result); + } + public bool IsQuitUserPromptRequested() + { + bool result = FnTable.IsQuitUserPromptRequested(); + return result; + } + public EVRApplicationError LaunchInternalProcess(string pchBinaryPath,string pchArguments,string pchWorkingDirectory) + { + EVRApplicationError result = FnTable.LaunchInternalProcess(pchBinaryPath,pchArguments,pchWorkingDirectory); + return result; + } + public uint GetCurrentSceneProcessId() + { + uint result = FnTable.GetCurrentSceneProcessId(); + return result; + } +} + + +public class CVRChaperone +{ + IVRChaperone FnTable; + internal CVRChaperone(IntPtr pInterface) + { + FnTable = (IVRChaperone)Marshal.PtrToStructure(pInterface, typeof(IVRChaperone)); + } + public ChaperoneCalibrationState GetCalibrationState() + { + ChaperoneCalibrationState result = FnTable.GetCalibrationState(); + return result; + } + public bool GetPlayAreaSize(ref float pSizeX,ref float pSizeZ) + { + pSizeX = 0; + pSizeZ = 0; + bool result = FnTable.GetPlayAreaSize(ref pSizeX,ref pSizeZ); + return result; + } + public bool GetPlayAreaRect(ref HmdQuad_t rect) + { + bool result = FnTable.GetPlayAreaRect(ref rect); + return result; + } + public void ReloadInfo() + { + FnTable.ReloadInfo(); + } + public void SetSceneColor(HmdColor_t color) + { + FnTable.SetSceneColor(color); + } + public void GetBoundsColor(ref HmdColor_t pOutputColorArray,int nNumOutputColors,float flCollisionBoundsFadeDistance,ref HmdColor_t pOutputCameraColor) + { + FnTable.GetBoundsColor(ref pOutputColorArray,nNumOutputColors,flCollisionBoundsFadeDistance,ref pOutputCameraColor); + } + public bool AreBoundsVisible() + { + bool result = FnTable.AreBoundsVisible(); + return result; + } + public void ForceBoundsVisible(bool bForce) + { + FnTable.ForceBoundsVisible(bForce); + } +} + + +public class CVRChaperoneSetup +{ + IVRChaperoneSetup FnTable; + internal CVRChaperoneSetup(IntPtr pInterface) + { + FnTable = (IVRChaperoneSetup)Marshal.PtrToStructure(pInterface, typeof(IVRChaperoneSetup)); + } + public bool CommitWorkingCopy(EChaperoneConfigFile configFile) + { + bool result = FnTable.CommitWorkingCopy(configFile); + return result; + } + public void RevertWorkingCopy() + { + FnTable.RevertWorkingCopy(); + } + public bool GetWorkingPlayAreaSize(ref float pSizeX,ref float pSizeZ) + { + pSizeX = 0; + pSizeZ = 0; + bool result = FnTable.GetWorkingPlayAreaSize(ref pSizeX,ref pSizeZ); + return result; + } + public bool GetWorkingPlayAreaRect(ref HmdQuad_t rect) + { + bool result = FnTable.GetWorkingPlayAreaRect(ref rect); + return result; + } + public bool GetWorkingCollisionBoundsInfo(out HmdQuad_t [] pQuadsBuffer) + { + uint punQuadsCount = 0; + bool result = FnTable.GetWorkingCollisionBoundsInfo(null,ref punQuadsCount); + pQuadsBuffer= new HmdQuad_t[punQuadsCount]; + result = FnTable.GetWorkingCollisionBoundsInfo(pQuadsBuffer,ref punQuadsCount); + return result; + } + public bool GetLiveCollisionBoundsInfo(out HmdQuad_t [] pQuadsBuffer) + { + uint punQuadsCount = 0; + bool result = FnTable.GetLiveCollisionBoundsInfo(null,ref punQuadsCount); + pQuadsBuffer= new HmdQuad_t[punQuadsCount]; + result = FnTable.GetLiveCollisionBoundsInfo(pQuadsBuffer,ref punQuadsCount); + return result; + } + public bool GetWorkingSeatedZeroPoseToRawTrackingPose(ref HmdMatrix34_t pmatSeatedZeroPoseToRawTrackingPose) + { + bool result = FnTable.GetWorkingSeatedZeroPoseToRawTrackingPose(ref pmatSeatedZeroPoseToRawTrackingPose); + return result; + } + public bool GetWorkingStandingZeroPoseToRawTrackingPose(ref HmdMatrix34_t pmatStandingZeroPoseToRawTrackingPose) + { + bool result = FnTable.GetWorkingStandingZeroPoseToRawTrackingPose(ref pmatStandingZeroPoseToRawTrackingPose); + return result; + } + public void SetWorkingPlayAreaSize(float sizeX,float sizeZ) + { + FnTable.SetWorkingPlayAreaSize(sizeX,sizeZ); + } + public void SetWorkingCollisionBoundsInfo(HmdQuad_t [] pQuadsBuffer) + { + FnTable.SetWorkingCollisionBoundsInfo(pQuadsBuffer,(uint) pQuadsBuffer.Length); + } + public void SetWorkingSeatedZeroPoseToRawTrackingPose(ref HmdMatrix34_t pMatSeatedZeroPoseToRawTrackingPose) + { + FnTable.SetWorkingSeatedZeroPoseToRawTrackingPose(ref pMatSeatedZeroPoseToRawTrackingPose); + } + public void SetWorkingStandingZeroPoseToRawTrackingPose(ref HmdMatrix34_t pMatStandingZeroPoseToRawTrackingPose) + { + FnTable.SetWorkingStandingZeroPoseToRawTrackingPose(ref pMatStandingZeroPoseToRawTrackingPose); + } + public void ReloadFromDisk(EChaperoneConfigFile configFile) + { + FnTable.ReloadFromDisk(configFile); + } + public bool GetLiveSeatedZeroPoseToRawTrackingPose(ref HmdMatrix34_t pmatSeatedZeroPoseToRawTrackingPose) + { + bool result = FnTable.GetLiveSeatedZeroPoseToRawTrackingPose(ref pmatSeatedZeroPoseToRawTrackingPose); + return result; + } + public void SetWorkingCollisionBoundsTagsInfo(byte [] pTagsBuffer) + { + FnTable.SetWorkingCollisionBoundsTagsInfo(pTagsBuffer,(uint) pTagsBuffer.Length); + } + public bool GetLiveCollisionBoundsTagsInfo(out byte [] pTagsBuffer) + { + uint punTagCount = 0; + bool result = FnTable.GetLiveCollisionBoundsTagsInfo(null,ref punTagCount); + pTagsBuffer= new byte[punTagCount]; + result = FnTable.GetLiveCollisionBoundsTagsInfo(pTagsBuffer,ref punTagCount); + return result; + } + public bool SetWorkingPhysicalBoundsInfo(HmdQuad_t [] pQuadsBuffer) + { + bool result = FnTable.SetWorkingPhysicalBoundsInfo(pQuadsBuffer,(uint) pQuadsBuffer.Length); + return result; + } + public bool GetLivePhysicalBoundsInfo(out HmdQuad_t [] pQuadsBuffer) + { + uint punQuadsCount = 0; + bool result = FnTable.GetLivePhysicalBoundsInfo(null,ref punQuadsCount); + pQuadsBuffer= new HmdQuad_t[punQuadsCount]; + result = FnTable.GetLivePhysicalBoundsInfo(pQuadsBuffer,ref punQuadsCount); + return result; + } + public bool ExportLiveToBuffer(System.Text.StringBuilder pBuffer,ref uint pnBufferLength) + { + pnBufferLength = 0; + bool result = FnTable.ExportLiveToBuffer(pBuffer,ref pnBufferLength); + return result; + } + public bool ImportFromBufferToWorking(string pBuffer,uint nImportFlags) + { + bool result = FnTable.ImportFromBufferToWorking(pBuffer,nImportFlags); + return result; + } +} + + +public class CVRCompositor +{ + IVRCompositor FnTable; + internal CVRCompositor(IntPtr pInterface) + { + FnTable = (IVRCompositor)Marshal.PtrToStructure(pInterface, typeof(IVRCompositor)); + } + public void SetTrackingSpace(ETrackingUniverseOrigin eOrigin) + { + FnTable.SetTrackingSpace(eOrigin); + } + public ETrackingUniverseOrigin GetTrackingSpace() + { + ETrackingUniverseOrigin result = FnTable.GetTrackingSpace(); + return result; + } + public EVRCompositorError WaitGetPoses(TrackedDevicePose_t [] pRenderPoseArray,TrackedDevicePose_t [] pGamePoseArray) + { + EVRCompositorError result = FnTable.WaitGetPoses(pRenderPoseArray,(uint) pRenderPoseArray.Length,pGamePoseArray,(uint) pGamePoseArray.Length); + return result; + } + public EVRCompositorError GetLastPoses(TrackedDevicePose_t [] pRenderPoseArray,TrackedDevicePose_t [] pGamePoseArray) + { + EVRCompositorError result = FnTable.GetLastPoses(pRenderPoseArray,(uint) pRenderPoseArray.Length,pGamePoseArray,(uint) pGamePoseArray.Length); + return result; + } + public EVRCompositorError GetLastPoseForTrackedDeviceIndex(uint unDeviceIndex,ref TrackedDevicePose_t pOutputPose,ref TrackedDevicePose_t pOutputGamePose) + { + EVRCompositorError result = FnTable.GetLastPoseForTrackedDeviceIndex(unDeviceIndex,ref pOutputPose,ref pOutputGamePose); + return result; + } + public EVRCompositorError Submit(EVREye eEye,ref Texture_t pTexture,ref VRTextureBounds_t pBounds,EVRSubmitFlags nSubmitFlags) + { + EVRCompositorError result = FnTable.Submit(eEye,ref pTexture,ref pBounds,nSubmitFlags); + return result; + } + public void ClearLastSubmittedFrame() + { + FnTable.ClearLastSubmittedFrame(); + } + public void PostPresentHandoff() + { + FnTable.PostPresentHandoff(); + } + public bool GetFrameTiming(ref Compositor_FrameTiming pTiming,uint unFramesAgo) + { + bool result = FnTable.GetFrameTiming(ref pTiming,unFramesAgo); + return result; + } + public uint GetFrameTimings(ref Compositor_FrameTiming pTiming,uint nFrames) + { + uint result = FnTable.GetFrameTimings(ref pTiming,nFrames); + return result; + } + public float GetFrameTimeRemaining() + { + float result = FnTable.GetFrameTimeRemaining(); + return result; + } + public void GetCumulativeStats(ref Compositor_CumulativeStats pStats,uint nStatsSizeInBytes) + { + FnTable.GetCumulativeStats(ref pStats,nStatsSizeInBytes); + } + public void FadeToColor(float fSeconds,float fRed,float fGreen,float fBlue,float fAlpha,bool bBackground) + { + FnTable.FadeToColor(fSeconds,fRed,fGreen,fBlue,fAlpha,bBackground); + } + public HmdColor_t GetCurrentFadeColor(bool bBackground) + { + HmdColor_t result = FnTable.GetCurrentFadeColor(bBackground); + return result; + } + public void FadeGrid(float fSeconds,bool bFadeIn) + { + FnTable.FadeGrid(fSeconds,bFadeIn); + } + public float GetCurrentGridAlpha() + { + float result = FnTable.GetCurrentGridAlpha(); + return result; + } + public EVRCompositorError SetSkyboxOverride(Texture_t [] pTextures) + { + EVRCompositorError result = FnTable.SetSkyboxOverride(pTextures,(uint) pTextures.Length); + return result; + } + public void ClearSkyboxOverride() + { + FnTable.ClearSkyboxOverride(); + } + public void CompositorBringToFront() + { + FnTable.CompositorBringToFront(); + } + public void CompositorGoToBack() + { + FnTable.CompositorGoToBack(); + } + public void CompositorQuit() + { + FnTable.CompositorQuit(); + } + public bool IsFullscreen() + { + bool result = FnTable.IsFullscreen(); + return result; + } + public uint GetCurrentSceneFocusProcess() + { + uint result = FnTable.GetCurrentSceneFocusProcess(); + return result; + } + public uint GetLastFrameRenderer() + { + uint result = FnTable.GetLastFrameRenderer(); + return result; + } + public bool CanRenderScene() + { + bool result = FnTable.CanRenderScene(); + return result; + } + public void ShowMirrorWindow() + { + FnTable.ShowMirrorWindow(); + } + public void HideMirrorWindow() + { + FnTable.HideMirrorWindow(); + } + public bool IsMirrorWindowVisible() + { + bool result = FnTable.IsMirrorWindowVisible(); + return result; + } + public void CompositorDumpImages() + { + FnTable.CompositorDumpImages(); + } + public bool ShouldAppRenderWithLowResources() + { + bool result = FnTable.ShouldAppRenderWithLowResources(); + return result; + } + public void ForceInterleavedReprojectionOn(bool bOverride) + { + FnTable.ForceInterleavedReprojectionOn(bOverride); + } + public void ForceReconnectProcess() + { + FnTable.ForceReconnectProcess(); + } + public void SuspendRendering(bool bSuspend) + { + FnTable.SuspendRendering(bSuspend); + } + public EVRCompositorError GetMirrorTextureD3D11(EVREye eEye,IntPtr pD3D11DeviceOrResource,ref IntPtr ppD3D11ShaderResourceView) + { + EVRCompositorError result = FnTable.GetMirrorTextureD3D11(eEye,pD3D11DeviceOrResource,ref ppD3D11ShaderResourceView); + return result; + } + public void ReleaseMirrorTextureD3D11(IntPtr pD3D11ShaderResourceView) + { + FnTable.ReleaseMirrorTextureD3D11(pD3D11ShaderResourceView); + } + public EVRCompositorError GetMirrorTextureGL(EVREye eEye,ref uint pglTextureId,IntPtr pglSharedTextureHandle) + { + pglTextureId = 0; + EVRCompositorError result = FnTable.GetMirrorTextureGL(eEye,ref pglTextureId,pglSharedTextureHandle); + return result; + } + public bool ReleaseSharedGLTexture(uint glTextureId,IntPtr glSharedTextureHandle) + { + bool result = FnTable.ReleaseSharedGLTexture(glTextureId,glSharedTextureHandle); + return result; + } + public void LockGLSharedTextureForAccess(IntPtr glSharedTextureHandle) + { + FnTable.LockGLSharedTextureForAccess(glSharedTextureHandle); + } + public void UnlockGLSharedTextureForAccess(IntPtr glSharedTextureHandle) + { + FnTable.UnlockGLSharedTextureForAccess(glSharedTextureHandle); + } + public uint GetVulkanInstanceExtensionsRequired(System.Text.StringBuilder pchValue,uint unBufferSize) + { + uint result = FnTable.GetVulkanInstanceExtensionsRequired(pchValue,unBufferSize); + return result; + } + public uint GetVulkanDeviceExtensionsRequired(IntPtr pPhysicalDevice,System.Text.StringBuilder pchValue,uint unBufferSize) + { + uint result = FnTable.GetVulkanDeviceExtensionsRequired(pPhysicalDevice,pchValue,unBufferSize); + return result; + } +} + + +public class CVROverlay +{ + IVROverlay FnTable; + internal CVROverlay(IntPtr pInterface) + { + FnTable = (IVROverlay)Marshal.PtrToStructure(pInterface, typeof(IVROverlay)); + } + public EVROverlayError FindOverlay(string pchOverlayKey,ref ulong pOverlayHandle) + { + pOverlayHandle = 0; + EVROverlayError result = FnTable.FindOverlay(pchOverlayKey,ref pOverlayHandle); + return result; + } + public EVROverlayError CreateOverlay(string pchOverlayKey,string pchOverlayName,ref ulong pOverlayHandle) + { + pOverlayHandle = 0; + EVROverlayError result = FnTable.CreateOverlay(pchOverlayKey,pchOverlayName,ref pOverlayHandle); + return result; + } + public EVROverlayError DestroyOverlay(ulong ulOverlayHandle) + { + EVROverlayError result = FnTable.DestroyOverlay(ulOverlayHandle); + return result; + } + public EVROverlayError SetHighQualityOverlay(ulong ulOverlayHandle) + { + EVROverlayError result = FnTable.SetHighQualityOverlay(ulOverlayHandle); + return result; + } + public ulong GetHighQualityOverlay() + { + ulong result = FnTable.GetHighQualityOverlay(); + return result; + } + public uint GetOverlayKey(ulong ulOverlayHandle,System.Text.StringBuilder pchValue,uint unBufferSize,ref EVROverlayError pError) + { + uint result = FnTable.GetOverlayKey(ulOverlayHandle,pchValue,unBufferSize,ref pError); + return result; + } + public uint GetOverlayName(ulong ulOverlayHandle,System.Text.StringBuilder pchValue,uint unBufferSize,ref EVROverlayError pError) + { + uint result = FnTable.GetOverlayName(ulOverlayHandle,pchValue,unBufferSize,ref pError); + return result; + } + public EVROverlayError SetOverlayName(ulong ulOverlayHandle,string pchName) + { + EVROverlayError result = FnTable.SetOverlayName(ulOverlayHandle,pchName); + return result; + } + public EVROverlayError GetOverlayImageData(ulong ulOverlayHandle,IntPtr pvBuffer,uint unBufferSize,ref uint punWidth,ref uint punHeight) + { + punWidth = 0; + punHeight = 0; + EVROverlayError result = FnTable.GetOverlayImageData(ulOverlayHandle,pvBuffer,unBufferSize,ref punWidth,ref punHeight); + return result; + } + public string GetOverlayErrorNameFromEnum(EVROverlayError error) + { + IntPtr result = FnTable.GetOverlayErrorNameFromEnum(error); + return Marshal.PtrToStringAnsi(result); + } + public EVROverlayError SetOverlayRenderingPid(ulong ulOverlayHandle,uint unPID) + { + EVROverlayError result = FnTable.SetOverlayRenderingPid(ulOverlayHandle,unPID); + return result; + } + public uint GetOverlayRenderingPid(ulong ulOverlayHandle) + { + uint result = FnTable.GetOverlayRenderingPid(ulOverlayHandle); + return result; + } + public EVROverlayError SetOverlayFlag(ulong ulOverlayHandle,VROverlayFlags eOverlayFlag,bool bEnabled) + { + EVROverlayError result = FnTable.SetOverlayFlag(ulOverlayHandle,eOverlayFlag,bEnabled); + return result; + } + public EVROverlayError GetOverlayFlag(ulong ulOverlayHandle,VROverlayFlags eOverlayFlag,ref bool pbEnabled) + { + pbEnabled = false; + EVROverlayError result = FnTable.GetOverlayFlag(ulOverlayHandle,eOverlayFlag,ref pbEnabled); + return result; + } + public EVROverlayError SetOverlayColor(ulong ulOverlayHandle,float fRed,float fGreen,float fBlue) + { + EVROverlayError result = FnTable.SetOverlayColor(ulOverlayHandle,fRed,fGreen,fBlue); + return result; + } + public EVROverlayError GetOverlayColor(ulong ulOverlayHandle,ref float pfRed,ref float pfGreen,ref float pfBlue) + { + pfRed = 0; + pfGreen = 0; + pfBlue = 0; + EVROverlayError result = FnTable.GetOverlayColor(ulOverlayHandle,ref pfRed,ref pfGreen,ref pfBlue); + return result; + } + public EVROverlayError SetOverlayAlpha(ulong ulOverlayHandle,float fAlpha) + { + EVROverlayError result = FnTable.SetOverlayAlpha(ulOverlayHandle,fAlpha); + return result; + } + public EVROverlayError GetOverlayAlpha(ulong ulOverlayHandle,ref float pfAlpha) + { + pfAlpha = 0; + EVROverlayError result = FnTable.GetOverlayAlpha(ulOverlayHandle,ref pfAlpha); + return result; + } + public EVROverlayError SetOverlayTexelAspect(ulong ulOverlayHandle,float fTexelAspect) + { + EVROverlayError result = FnTable.SetOverlayTexelAspect(ulOverlayHandle,fTexelAspect); + return result; + } + public EVROverlayError GetOverlayTexelAspect(ulong ulOverlayHandle,ref float pfTexelAspect) + { + pfTexelAspect = 0; + EVROverlayError result = FnTable.GetOverlayTexelAspect(ulOverlayHandle,ref pfTexelAspect); + return result; + } + public EVROverlayError SetOverlaySortOrder(ulong ulOverlayHandle,uint unSortOrder) + { + EVROverlayError result = FnTable.SetOverlaySortOrder(ulOverlayHandle,unSortOrder); + return result; + } + public EVROverlayError GetOverlaySortOrder(ulong ulOverlayHandle,ref uint punSortOrder) + { + punSortOrder = 0; + EVROverlayError result = FnTable.GetOverlaySortOrder(ulOverlayHandle,ref punSortOrder); + return result; + } + public EVROverlayError SetOverlayWidthInMeters(ulong ulOverlayHandle,float fWidthInMeters) + { + EVROverlayError result = FnTable.SetOverlayWidthInMeters(ulOverlayHandle,fWidthInMeters); + return result; + } + public EVROverlayError GetOverlayWidthInMeters(ulong ulOverlayHandle,ref float pfWidthInMeters) + { + pfWidthInMeters = 0; + EVROverlayError result = FnTable.GetOverlayWidthInMeters(ulOverlayHandle,ref pfWidthInMeters); + return result; + } + public EVROverlayError SetOverlayAutoCurveDistanceRangeInMeters(ulong ulOverlayHandle,float fMinDistanceInMeters,float fMaxDistanceInMeters) + { + EVROverlayError result = FnTable.SetOverlayAutoCurveDistanceRangeInMeters(ulOverlayHandle,fMinDistanceInMeters,fMaxDistanceInMeters); + return result; + } + public EVROverlayError GetOverlayAutoCurveDistanceRangeInMeters(ulong ulOverlayHandle,ref float pfMinDistanceInMeters,ref float pfMaxDistanceInMeters) + { + pfMinDistanceInMeters = 0; + pfMaxDistanceInMeters = 0; + EVROverlayError result = FnTable.GetOverlayAutoCurveDistanceRangeInMeters(ulOverlayHandle,ref pfMinDistanceInMeters,ref pfMaxDistanceInMeters); + return result; + } + public EVROverlayError SetOverlayTextureColorSpace(ulong ulOverlayHandle,EColorSpace eTextureColorSpace) + { + EVROverlayError result = FnTable.SetOverlayTextureColorSpace(ulOverlayHandle,eTextureColorSpace); + return result; + } + public EVROverlayError GetOverlayTextureColorSpace(ulong ulOverlayHandle,ref EColorSpace peTextureColorSpace) + { + EVROverlayError result = FnTable.GetOverlayTextureColorSpace(ulOverlayHandle,ref peTextureColorSpace); + return result; + } + public EVROverlayError SetOverlayTextureBounds(ulong ulOverlayHandle,ref VRTextureBounds_t pOverlayTextureBounds) + { + EVROverlayError result = FnTable.SetOverlayTextureBounds(ulOverlayHandle,ref pOverlayTextureBounds); + return result; + } + public EVROverlayError GetOverlayTextureBounds(ulong ulOverlayHandle,ref VRTextureBounds_t pOverlayTextureBounds) + { + EVROverlayError result = FnTable.GetOverlayTextureBounds(ulOverlayHandle,ref pOverlayTextureBounds); + return result; + } + public uint GetOverlayRenderModel(ulong ulOverlayHandle,string pchValue,uint unBufferSize,ref HmdColor_t pColor,ref EVROverlayError pError) + { + uint result = FnTable.GetOverlayRenderModel(ulOverlayHandle,pchValue,unBufferSize,ref pColor,ref pError); + return result; + } + public EVROverlayError SetOverlayRenderModel(ulong ulOverlayHandle,string pchRenderModel,ref HmdColor_t pColor) + { + EVROverlayError result = FnTable.SetOverlayRenderModel(ulOverlayHandle,pchRenderModel,ref pColor); + return result; + } + public EVROverlayError GetOverlayTransformType(ulong ulOverlayHandle,ref VROverlayTransformType peTransformType) + { + EVROverlayError result = FnTable.GetOverlayTransformType(ulOverlayHandle,ref peTransformType); + return result; + } + public EVROverlayError SetOverlayTransformAbsolute(ulong ulOverlayHandle,ETrackingUniverseOrigin eTrackingOrigin,ref HmdMatrix34_t pmatTrackingOriginToOverlayTransform) + { + EVROverlayError result = FnTable.SetOverlayTransformAbsolute(ulOverlayHandle,eTrackingOrigin,ref pmatTrackingOriginToOverlayTransform); + return result; + } + public EVROverlayError GetOverlayTransformAbsolute(ulong ulOverlayHandle,ref ETrackingUniverseOrigin peTrackingOrigin,ref HmdMatrix34_t pmatTrackingOriginToOverlayTransform) + { + EVROverlayError result = FnTable.GetOverlayTransformAbsolute(ulOverlayHandle,ref peTrackingOrigin,ref pmatTrackingOriginToOverlayTransform); + return result; + } + public EVROverlayError SetOverlayTransformTrackedDeviceRelative(ulong ulOverlayHandle,uint unTrackedDevice,ref HmdMatrix34_t pmatTrackedDeviceToOverlayTransform) + { + EVROverlayError result = FnTable.SetOverlayTransformTrackedDeviceRelative(ulOverlayHandle,unTrackedDevice,ref pmatTrackedDeviceToOverlayTransform); + return result; + } + public EVROverlayError GetOverlayTransformTrackedDeviceRelative(ulong ulOverlayHandle,ref uint punTrackedDevice,ref HmdMatrix34_t pmatTrackedDeviceToOverlayTransform) + { + punTrackedDevice = 0; + EVROverlayError result = FnTable.GetOverlayTransformTrackedDeviceRelative(ulOverlayHandle,ref punTrackedDevice,ref pmatTrackedDeviceToOverlayTransform); + return result; + } + public EVROverlayError SetOverlayTransformTrackedDeviceComponent(ulong ulOverlayHandle,uint unDeviceIndex,string pchComponentName) + { + EVROverlayError result = FnTable.SetOverlayTransformTrackedDeviceComponent(ulOverlayHandle,unDeviceIndex,pchComponentName); + return result; + } + public EVROverlayError GetOverlayTransformTrackedDeviceComponent(ulong ulOverlayHandle,ref uint punDeviceIndex,string pchComponentName,uint unComponentNameSize) + { + punDeviceIndex = 0; + EVROverlayError result = FnTable.GetOverlayTransformTrackedDeviceComponent(ulOverlayHandle,ref punDeviceIndex,pchComponentName,unComponentNameSize); + return result; + } + public EVROverlayError GetOverlayTransformOverlayRelative(ulong ulOverlayHandle,ref ulong ulOverlayHandleParent,ref HmdMatrix34_t pmatParentOverlayToOverlayTransform) + { + ulOverlayHandleParent = 0; + EVROverlayError result = FnTable.GetOverlayTransformOverlayRelative(ulOverlayHandle,ref ulOverlayHandleParent,ref pmatParentOverlayToOverlayTransform); + return result; + } + public EVROverlayError SetOverlayTransformOverlayRelative(ulong ulOverlayHandle,ulong ulOverlayHandleParent,ref HmdMatrix34_t pmatParentOverlayToOverlayTransform) + { + EVROverlayError result = FnTable.SetOverlayTransformOverlayRelative(ulOverlayHandle,ulOverlayHandleParent,ref pmatParentOverlayToOverlayTransform); + return result; + } + public EVROverlayError ShowOverlay(ulong ulOverlayHandle) + { + EVROverlayError result = FnTable.ShowOverlay(ulOverlayHandle); + return result; + } + public EVROverlayError HideOverlay(ulong ulOverlayHandle) + { + EVROverlayError result = FnTable.HideOverlay(ulOverlayHandle); + return result; + } + public bool IsOverlayVisible(ulong ulOverlayHandle) + { + bool result = FnTable.IsOverlayVisible(ulOverlayHandle); + return result; + } + public EVROverlayError GetTransformForOverlayCoordinates(ulong ulOverlayHandle,ETrackingUniverseOrigin eTrackingOrigin,HmdVector2_t coordinatesInOverlay,ref HmdMatrix34_t pmatTransform) + { + EVROverlayError result = FnTable.GetTransformForOverlayCoordinates(ulOverlayHandle,eTrackingOrigin,coordinatesInOverlay,ref pmatTransform); + return result; + } +// This is a terrible hack to workaround the fact that VRControllerState_t and VREvent_t were +// originally mis-compiled with the wrong packing for Linux and OSX. + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _PollNextOverlayEventPacked(ulong ulOverlayHandle,ref VREvent_t_Packed pEvent,uint uncbVREvent); + [StructLayout(LayoutKind.Explicit)] + struct PollNextOverlayEventUnion + { + [FieldOffset(0)] + public IVROverlay._PollNextOverlayEvent pPollNextOverlayEvent; + [FieldOffset(0)] + public _PollNextOverlayEventPacked pPollNextOverlayEventPacked; + } + public bool PollNextOverlayEvent(ulong ulOverlayHandle,ref VREvent_t pEvent,uint uncbVREvent) + { + if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || + (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) + { + PollNextOverlayEventUnion u; + VREvent_t_Packed event_packed = new VREvent_t_Packed(); + u.pPollNextOverlayEventPacked = null; + u.pPollNextOverlayEvent = FnTable.PollNextOverlayEvent; + bool packed_result = u.pPollNextOverlayEventPacked(ulOverlayHandle,ref event_packed,(uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VREvent_t_Packed))); + + event_packed.Unpack(ref pEvent); + return packed_result; + } + bool result = FnTable.PollNextOverlayEvent(ulOverlayHandle,ref pEvent,uncbVREvent); + return result; + } + public EVROverlayError GetOverlayInputMethod(ulong ulOverlayHandle,ref VROverlayInputMethod peInputMethod) + { + EVROverlayError result = FnTable.GetOverlayInputMethod(ulOverlayHandle,ref peInputMethod); + return result; + } + public EVROverlayError SetOverlayInputMethod(ulong ulOverlayHandle,VROverlayInputMethod eInputMethod) + { + EVROverlayError result = FnTable.SetOverlayInputMethod(ulOverlayHandle,eInputMethod); + return result; + } + public EVROverlayError GetOverlayMouseScale(ulong ulOverlayHandle,ref HmdVector2_t pvecMouseScale) + { + EVROverlayError result = FnTable.GetOverlayMouseScale(ulOverlayHandle,ref pvecMouseScale); + return result; + } + public EVROverlayError SetOverlayMouseScale(ulong ulOverlayHandle,ref HmdVector2_t pvecMouseScale) + { + EVROverlayError result = FnTable.SetOverlayMouseScale(ulOverlayHandle,ref pvecMouseScale); + return result; + } + public bool ComputeOverlayIntersection(ulong ulOverlayHandle,ref VROverlayIntersectionParams_t pParams,ref VROverlayIntersectionResults_t pResults) + { + bool result = FnTable.ComputeOverlayIntersection(ulOverlayHandle,ref pParams,ref pResults); + return result; + } + public bool HandleControllerOverlayInteractionAsMouse(ulong ulOverlayHandle,uint unControllerDeviceIndex) + { + bool result = FnTable.HandleControllerOverlayInteractionAsMouse(ulOverlayHandle,unControllerDeviceIndex); + return result; + } + public bool IsHoverTargetOverlay(ulong ulOverlayHandle) + { + bool result = FnTable.IsHoverTargetOverlay(ulOverlayHandle); + return result; + } + public ulong GetGamepadFocusOverlay() + { + ulong result = FnTable.GetGamepadFocusOverlay(); + return result; + } + public EVROverlayError SetGamepadFocusOverlay(ulong ulNewFocusOverlay) + { + EVROverlayError result = FnTable.SetGamepadFocusOverlay(ulNewFocusOverlay); + return result; + } + public EVROverlayError SetOverlayNeighbor(EOverlayDirection eDirection,ulong ulFrom,ulong ulTo) + { + EVROverlayError result = FnTable.SetOverlayNeighbor(eDirection,ulFrom,ulTo); + return result; + } + public EVROverlayError MoveGamepadFocusToNeighbor(EOverlayDirection eDirection,ulong ulFrom) + { + EVROverlayError result = FnTable.MoveGamepadFocusToNeighbor(eDirection,ulFrom); + return result; + } + public EVROverlayError SetOverlayTexture(ulong ulOverlayHandle,ref Texture_t pTexture) + { + EVROverlayError result = FnTable.SetOverlayTexture(ulOverlayHandle,ref pTexture); + return result; + } + public EVROverlayError ClearOverlayTexture(ulong ulOverlayHandle) + { + EVROverlayError result = FnTable.ClearOverlayTexture(ulOverlayHandle); + return result; + } + public EVROverlayError SetOverlayRaw(ulong ulOverlayHandle,IntPtr pvBuffer,uint unWidth,uint unHeight,uint unDepth) + { + EVROverlayError result = FnTable.SetOverlayRaw(ulOverlayHandle,pvBuffer,unWidth,unHeight,unDepth); + return result; + } + public EVROverlayError SetOverlayFromFile(ulong ulOverlayHandle,string pchFilePath) + { + EVROverlayError result = FnTable.SetOverlayFromFile(ulOverlayHandle,pchFilePath); + return result; + } + public EVROverlayError GetOverlayTexture(ulong ulOverlayHandle,ref IntPtr pNativeTextureHandle,IntPtr pNativeTextureRef,ref uint pWidth,ref uint pHeight,ref uint pNativeFormat,ref ETextureType pAPIType,ref EColorSpace pColorSpace,ref VRTextureBounds_t pTextureBounds) + { + pWidth = 0; + pHeight = 0; + pNativeFormat = 0; + EVROverlayError result = FnTable.GetOverlayTexture(ulOverlayHandle,ref pNativeTextureHandle,pNativeTextureRef,ref pWidth,ref pHeight,ref pNativeFormat,ref pAPIType,ref pColorSpace,ref pTextureBounds); + return result; + } + public EVROverlayError ReleaseNativeOverlayHandle(ulong ulOverlayHandle,IntPtr pNativeTextureHandle) + { + EVROverlayError result = FnTable.ReleaseNativeOverlayHandle(ulOverlayHandle,pNativeTextureHandle); + return result; + } + public EVROverlayError GetOverlayTextureSize(ulong ulOverlayHandle,ref uint pWidth,ref uint pHeight) + { + pWidth = 0; + pHeight = 0; + EVROverlayError result = FnTable.GetOverlayTextureSize(ulOverlayHandle,ref pWidth,ref pHeight); + return result; + } + public EVROverlayError CreateDashboardOverlay(string pchOverlayKey,string pchOverlayFriendlyName,ref ulong pMainHandle,ref ulong pThumbnailHandle) + { + pMainHandle = 0; + pThumbnailHandle = 0; + EVROverlayError result = FnTable.CreateDashboardOverlay(pchOverlayKey,pchOverlayFriendlyName,ref pMainHandle,ref pThumbnailHandle); + return result; + } + public bool IsDashboardVisible() + { + bool result = FnTable.IsDashboardVisible(); + return result; + } + public bool IsActiveDashboardOverlay(ulong ulOverlayHandle) + { + bool result = FnTable.IsActiveDashboardOverlay(ulOverlayHandle); + return result; + } + public EVROverlayError SetDashboardOverlaySceneProcess(ulong ulOverlayHandle,uint unProcessId) + { + EVROverlayError result = FnTable.SetDashboardOverlaySceneProcess(ulOverlayHandle,unProcessId); + return result; + } + public EVROverlayError GetDashboardOverlaySceneProcess(ulong ulOverlayHandle,ref uint punProcessId) + { + punProcessId = 0; + EVROverlayError result = FnTable.GetDashboardOverlaySceneProcess(ulOverlayHandle,ref punProcessId); + return result; + } + public void ShowDashboard(string pchOverlayToShow) + { + FnTable.ShowDashboard(pchOverlayToShow); + } + public uint GetPrimaryDashboardDevice() + { + uint result = FnTable.GetPrimaryDashboardDevice(); + return result; + } + public EVROverlayError ShowKeyboard(int eInputMode,int eLineInputMode,string pchDescription,uint unCharMax,string pchExistingText,bool bUseMinimalMode,ulong uUserValue) + { + EVROverlayError result = FnTable.ShowKeyboard(eInputMode,eLineInputMode,pchDescription,unCharMax,pchExistingText,bUseMinimalMode,uUserValue); + return result; + } + public EVROverlayError ShowKeyboardForOverlay(ulong ulOverlayHandle,int eInputMode,int eLineInputMode,string pchDescription,uint unCharMax,string pchExistingText,bool bUseMinimalMode,ulong uUserValue) + { + EVROverlayError result = FnTable.ShowKeyboardForOverlay(ulOverlayHandle,eInputMode,eLineInputMode,pchDescription,unCharMax,pchExistingText,bUseMinimalMode,uUserValue); + return result; + } + public uint GetKeyboardText(System.Text.StringBuilder pchText,uint cchText) + { + uint result = FnTable.GetKeyboardText(pchText,cchText); + return result; + } + public void HideKeyboard() + { + FnTable.HideKeyboard(); + } + public void SetKeyboardTransformAbsolute(ETrackingUniverseOrigin eTrackingOrigin,ref HmdMatrix34_t pmatTrackingOriginToKeyboardTransform) + { + FnTable.SetKeyboardTransformAbsolute(eTrackingOrigin,ref pmatTrackingOriginToKeyboardTransform); + } + public void SetKeyboardPositionForOverlay(ulong ulOverlayHandle,HmdRect2_t avoidRect) + { + FnTable.SetKeyboardPositionForOverlay(ulOverlayHandle,avoidRect); + } + public EVROverlayError SetOverlayIntersectionMask(ulong ulOverlayHandle,ref VROverlayIntersectionMaskPrimitive_t pMaskPrimitives,uint unNumMaskPrimitives,uint unPrimitiveSize) + { + EVROverlayError result = FnTable.SetOverlayIntersectionMask(ulOverlayHandle,ref pMaskPrimitives,unNumMaskPrimitives,unPrimitiveSize); + return result; + } + public EVROverlayError GetOverlayFlags(ulong ulOverlayHandle,ref uint pFlags) + { + pFlags = 0; + EVROverlayError result = FnTable.GetOverlayFlags(ulOverlayHandle,ref pFlags); + return result; + } + public VRMessageOverlayResponse ShowMessageOverlay(string pchText,string pchCaption,string pchButton0Text,string pchButton1Text,string pchButton2Text,string pchButton3Text) + { + VRMessageOverlayResponse result = FnTable.ShowMessageOverlay(pchText,pchCaption,pchButton0Text,pchButton1Text,pchButton2Text,pchButton3Text); + return result; + } +} + + +public class CVRRenderModels +{ + IVRRenderModels FnTable; + internal CVRRenderModels(IntPtr pInterface) + { + FnTable = (IVRRenderModels)Marshal.PtrToStructure(pInterface, typeof(IVRRenderModels)); + } + public EVRRenderModelError LoadRenderModel_Async(string pchRenderModelName,ref IntPtr ppRenderModel) + { + EVRRenderModelError result = FnTable.LoadRenderModel_Async(pchRenderModelName,ref ppRenderModel); + return result; + } + public void FreeRenderModel(IntPtr pRenderModel) + { + FnTable.FreeRenderModel(pRenderModel); + } + public EVRRenderModelError LoadTexture_Async(int textureId,ref IntPtr ppTexture) + { + EVRRenderModelError result = FnTable.LoadTexture_Async(textureId,ref ppTexture); + return result; + } + public void FreeTexture(IntPtr pTexture) + { + FnTable.FreeTexture(pTexture); + } + public EVRRenderModelError LoadTextureD3D11_Async(int textureId,IntPtr pD3D11Device,ref IntPtr ppD3D11Texture2D) + { + EVRRenderModelError result = FnTable.LoadTextureD3D11_Async(textureId,pD3D11Device,ref ppD3D11Texture2D); + return result; + } + public EVRRenderModelError LoadIntoTextureD3D11_Async(int textureId,IntPtr pDstTexture) + { + EVRRenderModelError result = FnTable.LoadIntoTextureD3D11_Async(textureId,pDstTexture); + return result; + } + public void FreeTextureD3D11(IntPtr pD3D11Texture2D) + { + FnTable.FreeTextureD3D11(pD3D11Texture2D); + } + public uint GetRenderModelName(uint unRenderModelIndex,System.Text.StringBuilder pchRenderModelName,uint unRenderModelNameLen) + { + uint result = FnTable.GetRenderModelName(unRenderModelIndex,pchRenderModelName,unRenderModelNameLen); + return result; + } + public uint GetRenderModelCount() + { + uint result = FnTable.GetRenderModelCount(); + return result; + } + public uint GetComponentCount(string pchRenderModelName) + { + uint result = FnTable.GetComponentCount(pchRenderModelName); + return result; + } + public uint GetComponentName(string pchRenderModelName,uint unComponentIndex,System.Text.StringBuilder pchComponentName,uint unComponentNameLen) + { + uint result = FnTable.GetComponentName(pchRenderModelName,unComponentIndex,pchComponentName,unComponentNameLen); + return result; + } + public ulong GetComponentButtonMask(string pchRenderModelName,string pchComponentName) + { + ulong result = FnTable.GetComponentButtonMask(pchRenderModelName,pchComponentName); + return result; + } + public uint GetComponentRenderModelName(string pchRenderModelName,string pchComponentName,System.Text.StringBuilder pchComponentRenderModelName,uint unComponentRenderModelNameLen) + { + uint result = FnTable.GetComponentRenderModelName(pchRenderModelName,pchComponentName,pchComponentRenderModelName,unComponentRenderModelNameLen); + return result; + } +// This is a terrible hack to workaround the fact that VRControllerState_t and VREvent_t were +// originally mis-compiled with the wrong packing for Linux and OSX. + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetComponentStatePacked(string pchRenderModelName,string pchComponentName,ref VRControllerState_t_Packed pControllerState,ref RenderModel_ControllerMode_State_t pState,ref RenderModel_ComponentState_t pComponentState); + [StructLayout(LayoutKind.Explicit)] + struct GetComponentStateUnion + { + [FieldOffset(0)] + public IVRRenderModels._GetComponentState pGetComponentState; + [FieldOffset(0)] + public _GetComponentStatePacked pGetComponentStatePacked; + } + public bool GetComponentState(string pchRenderModelName,string pchComponentName,ref VRControllerState_t pControllerState,ref RenderModel_ControllerMode_State_t pState,ref RenderModel_ComponentState_t pComponentState) + { + if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || + (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) + { + GetComponentStateUnion u; + VRControllerState_t_Packed state_packed = new VRControllerState_t_Packed(pControllerState); + u.pGetComponentStatePacked = null; + u.pGetComponentState = FnTable.GetComponentState; + bool packed_result = u.pGetComponentStatePacked(pchRenderModelName,pchComponentName,ref state_packed,ref pState,ref pComponentState); + + state_packed.Unpack(ref pControllerState); + return packed_result; + } + bool result = FnTable.GetComponentState(pchRenderModelName,pchComponentName,ref pControllerState,ref pState,ref pComponentState); + return result; + } + public bool RenderModelHasComponent(string pchRenderModelName,string pchComponentName) + { + bool result = FnTable.RenderModelHasComponent(pchRenderModelName,pchComponentName); + return result; + } + public uint GetRenderModelThumbnailURL(string pchRenderModelName,System.Text.StringBuilder pchThumbnailURL,uint unThumbnailURLLen,ref EVRRenderModelError peError) + { + uint result = FnTable.GetRenderModelThumbnailURL(pchRenderModelName,pchThumbnailURL,unThumbnailURLLen,ref peError); + return result; + } + public uint GetRenderModelOriginalPath(string pchRenderModelName,System.Text.StringBuilder pchOriginalPath,uint unOriginalPathLen,ref EVRRenderModelError peError) + { + uint result = FnTable.GetRenderModelOriginalPath(pchRenderModelName,pchOriginalPath,unOriginalPathLen,ref peError); + return result; + } + public string GetRenderModelErrorNameFromEnum(EVRRenderModelError error) + { + IntPtr result = FnTable.GetRenderModelErrorNameFromEnum(error); + return Marshal.PtrToStringAnsi(result); + } +} + + +public class CVRNotifications +{ + IVRNotifications FnTable; + internal CVRNotifications(IntPtr pInterface) + { + FnTable = (IVRNotifications)Marshal.PtrToStructure(pInterface, typeof(IVRNotifications)); + } + public EVRNotificationError CreateNotification(ulong ulOverlayHandle,ulong ulUserValue,EVRNotificationType type,string pchText,EVRNotificationStyle style,ref NotificationBitmap_t pImage,ref uint pNotificationId) + { + pNotificationId = 0; + EVRNotificationError result = FnTable.CreateNotification(ulOverlayHandle,ulUserValue,type,pchText,style,ref pImage,ref pNotificationId); + return result; + } + public EVRNotificationError RemoveNotification(uint notificationId) + { + EVRNotificationError result = FnTable.RemoveNotification(notificationId); + return result; + } +} + + +public class CVRSettings +{ + IVRSettings FnTable; + internal CVRSettings(IntPtr pInterface) + { + FnTable = (IVRSettings)Marshal.PtrToStructure(pInterface, typeof(IVRSettings)); + } + public string GetSettingsErrorNameFromEnum(EVRSettingsError eError) + { + IntPtr result = FnTable.GetSettingsErrorNameFromEnum(eError); + return Marshal.PtrToStringAnsi(result); + } + public bool Sync(bool bForce,ref EVRSettingsError peError) + { + bool result = FnTable.Sync(bForce,ref peError); + return result; + } + public void SetBool(string pchSection,string pchSettingsKey,bool bValue,ref EVRSettingsError peError) + { + FnTable.SetBool(pchSection,pchSettingsKey,bValue,ref peError); + } + public void SetInt32(string pchSection,string pchSettingsKey,int nValue,ref EVRSettingsError peError) + { + FnTable.SetInt32(pchSection,pchSettingsKey,nValue,ref peError); + } + public void SetFloat(string pchSection,string pchSettingsKey,float flValue,ref EVRSettingsError peError) + { + FnTable.SetFloat(pchSection,pchSettingsKey,flValue,ref peError); + } + public void SetString(string pchSection,string pchSettingsKey,string pchValue,ref EVRSettingsError peError) + { + FnTable.SetString(pchSection,pchSettingsKey,pchValue,ref peError); + } + public bool GetBool(string pchSection,string pchSettingsKey,ref EVRSettingsError peError) + { + bool result = FnTable.GetBool(pchSection,pchSettingsKey,ref peError); + return result; + } + public int GetInt32(string pchSection,string pchSettingsKey,ref EVRSettingsError peError) + { + int result = FnTable.GetInt32(pchSection,pchSettingsKey,ref peError); + return result; + } + public float GetFloat(string pchSection,string pchSettingsKey,ref EVRSettingsError peError) + { + float result = FnTable.GetFloat(pchSection,pchSettingsKey,ref peError); + return result; + } + public void GetString(string pchSection,string pchSettingsKey,System.Text.StringBuilder pchValue,uint unValueLen,ref EVRSettingsError peError) + { + FnTable.GetString(pchSection,pchSettingsKey,pchValue,unValueLen,ref peError); + } + public void RemoveSection(string pchSection,ref EVRSettingsError peError) + { + FnTable.RemoveSection(pchSection,ref peError); + } + public void RemoveKeyInSection(string pchSection,string pchSettingsKey,ref EVRSettingsError peError) + { + FnTable.RemoveKeyInSection(pchSection,pchSettingsKey,ref peError); + } +} + + +public class CVRScreenshots +{ + IVRScreenshots FnTable; + internal CVRScreenshots(IntPtr pInterface) + { + FnTable = (IVRScreenshots)Marshal.PtrToStructure(pInterface, typeof(IVRScreenshots)); + } + public EVRScreenshotError RequestScreenshot(ref uint pOutScreenshotHandle,EVRScreenshotType type,string pchPreviewFilename,string pchVRFilename) + { + pOutScreenshotHandle = 0; + EVRScreenshotError result = FnTable.RequestScreenshot(ref pOutScreenshotHandle,type,pchPreviewFilename,pchVRFilename); + return result; + } + public EVRScreenshotError HookScreenshot(EVRScreenshotType [] pSupportedTypes) + { + EVRScreenshotError result = FnTable.HookScreenshot(pSupportedTypes,(int) pSupportedTypes.Length); + return result; + } + public EVRScreenshotType GetScreenshotPropertyType(uint screenshotHandle,ref EVRScreenshotError pError) + { + EVRScreenshotType result = FnTable.GetScreenshotPropertyType(screenshotHandle,ref pError); + return result; + } + public uint GetScreenshotPropertyFilename(uint screenshotHandle,EVRScreenshotPropertyFilenames filenameType,System.Text.StringBuilder pchFilename,uint cchFilename,ref EVRScreenshotError pError) + { + uint result = FnTable.GetScreenshotPropertyFilename(screenshotHandle,filenameType,pchFilename,cchFilename,ref pError); + return result; + } + public EVRScreenshotError UpdateScreenshotProgress(uint screenshotHandle,float flProgress) + { + EVRScreenshotError result = FnTable.UpdateScreenshotProgress(screenshotHandle,flProgress); + return result; + } + public EVRScreenshotError TakeStereoScreenshot(ref uint pOutScreenshotHandle,string pchPreviewFilename,string pchVRFilename) + { + pOutScreenshotHandle = 0; + EVRScreenshotError result = FnTable.TakeStereoScreenshot(ref pOutScreenshotHandle,pchPreviewFilename,pchVRFilename); + return result; + } + public EVRScreenshotError SubmitScreenshot(uint screenshotHandle,EVRScreenshotType type,string pchSourcePreviewFilename,string pchSourceVRFilename) + { + EVRScreenshotError result = FnTable.SubmitScreenshot(screenshotHandle,type,pchSourcePreviewFilename,pchSourceVRFilename); + return result; + } +} + + +public class CVRResources +{ + IVRResources FnTable; + internal CVRResources(IntPtr pInterface) + { + FnTable = (IVRResources)Marshal.PtrToStructure(pInterface, typeof(IVRResources)); + } + public uint LoadSharedResource(string pchResourceName,string pchBuffer,uint unBufferLen) + { + uint result = FnTable.LoadSharedResource(pchResourceName,pchBuffer,unBufferLen); + return result; + } + public uint GetResourceFullPath(string pchResourceName,string pchResourceTypeDirectory,string pchPathBuffer,uint unBufferLen) + { + uint result = FnTable.GetResourceFullPath(pchResourceName,pchResourceTypeDirectory,pchPathBuffer,unBufferLen); + return result; + } +} + + +public class CVRDriverManager +{ + IVRDriverManager FnTable; + internal CVRDriverManager(IntPtr pInterface) + { + FnTable = (IVRDriverManager)Marshal.PtrToStructure(pInterface, typeof(IVRDriverManager)); + } + public uint GetDriverCount() + { + uint result = FnTable.GetDriverCount(); + return result; + } + public uint GetDriverName(uint nDriver,System.Text.StringBuilder pchValue,uint unBufferSize) + { + uint result = FnTable.GetDriverName(nDriver,pchValue,unBufferSize); + return result; + } +} + + +public class OpenVRInterop +{ + [DllImportAttribute("openvr_api", EntryPoint = "VR_InitInternal", CallingConvention = CallingConvention.Cdecl)] + internal static extern uint InitInternal(ref EVRInitError peError, EVRApplicationType eApplicationType); + [DllImportAttribute("openvr_api", EntryPoint = "VR_ShutdownInternal", CallingConvention = CallingConvention.Cdecl)] + internal static extern void ShutdownInternal(); + [DllImportAttribute("openvr_api", EntryPoint = "VR_IsHmdPresent", CallingConvention = CallingConvention.Cdecl)] + internal static extern bool IsHmdPresent(); + [DllImportAttribute("openvr_api", EntryPoint = "VR_IsRuntimeInstalled", CallingConvention = CallingConvention.Cdecl)] + internal static extern bool IsRuntimeInstalled(); + [DllImportAttribute("openvr_api", EntryPoint = "VR_GetStringForHmdError", CallingConvention = CallingConvention.Cdecl)] + internal static extern IntPtr GetStringForHmdError(EVRInitError error); + [DllImportAttribute("openvr_api", EntryPoint = "VR_GetGenericInterface", CallingConvention = CallingConvention.Cdecl)] + internal static extern IntPtr GetGenericInterface([In, MarshalAs(UnmanagedType.LPStr)] string pchInterfaceVersion, ref EVRInitError peError); + [DllImportAttribute("openvr_api", EntryPoint = "VR_IsInterfaceVersionValid", CallingConvention = CallingConvention.Cdecl)] + internal static extern bool IsInterfaceVersionValid([In, MarshalAs(UnmanagedType.LPStr)] string pchInterfaceVersion); + [DllImportAttribute("openvr_api", EntryPoint = "VR_GetInitToken", CallingConvention = CallingConvention.Cdecl)] + internal static extern uint GetInitToken(); +} + + +public enum EVREye +{ + Eye_Left = 0, + Eye_Right = 1, +} +public enum ETextureType +{ + DirectX = 0, + OpenGL = 1, + Vulkan = 2, + IOSurface = 3, + DirectX12 = 4, +} +public enum EColorSpace +{ + Auto = 0, + Gamma = 1, + Linear = 2, +} +public enum ETrackingResult +{ + Uninitialized = 1, + Calibrating_InProgress = 100, + Calibrating_OutOfRange = 101, + Running_OK = 200, + Running_OutOfRange = 201, +} +public enum ETrackedDeviceClass +{ + Invalid = 0, + HMD = 1, + Controller = 2, + GenericTracker = 3, + TrackingReference = 4, + DisplayRedirect = 5, +} +public enum ETrackedControllerRole +{ + Invalid = 0, + LeftHand = 1, + RightHand = 2, +} +public enum ETrackingUniverseOrigin +{ + TrackingUniverseSeated = 0, + TrackingUniverseStanding = 1, + TrackingUniverseRawAndUncalibrated = 2, +} +public enum ETrackedDeviceProperty +{ + Prop_Invalid = 0, + Prop_TrackingSystemName_String = 1000, + Prop_ModelNumber_String = 1001, + Prop_SerialNumber_String = 1002, + Prop_RenderModelName_String = 1003, + Prop_WillDriftInYaw_Bool = 1004, + Prop_ManufacturerName_String = 1005, + Prop_TrackingFirmwareVersion_String = 1006, + Prop_HardwareRevision_String = 1007, + Prop_AllWirelessDongleDescriptions_String = 1008, + Prop_ConnectedWirelessDongle_String = 1009, + Prop_DeviceIsWireless_Bool = 1010, + Prop_DeviceIsCharging_Bool = 1011, + Prop_DeviceBatteryPercentage_Float = 1012, + Prop_StatusDisplayTransform_Matrix34 = 1013, + Prop_Firmware_UpdateAvailable_Bool = 1014, + Prop_Firmware_ManualUpdate_Bool = 1015, + Prop_Firmware_ManualUpdateURL_String = 1016, + Prop_HardwareRevision_Uint64 = 1017, + Prop_FirmwareVersion_Uint64 = 1018, + Prop_FPGAVersion_Uint64 = 1019, + Prop_VRCVersion_Uint64 = 1020, + Prop_RadioVersion_Uint64 = 1021, + Prop_DongleVersion_Uint64 = 1022, + Prop_BlockServerShutdown_Bool = 1023, + Prop_CanUnifyCoordinateSystemWithHmd_Bool = 1024, + Prop_ContainsProximitySensor_Bool = 1025, + Prop_DeviceProvidesBatteryStatus_Bool = 1026, + Prop_DeviceCanPowerOff_Bool = 1027, + Prop_Firmware_ProgrammingTarget_String = 1028, + Prop_DeviceClass_Int32 = 1029, + Prop_HasCamera_Bool = 1030, + Prop_DriverVersion_String = 1031, + Prop_Firmware_ForceUpdateRequired_Bool = 1032, + Prop_ViveSystemButtonFixRequired_Bool = 1033, + Prop_ParentDriver_Uint64 = 1034, + Prop_ResourceRoot_String = 1035, + Prop_ReportsTimeSinceVSync_Bool = 2000, + Prop_SecondsFromVsyncToPhotons_Float = 2001, + Prop_DisplayFrequency_Float = 2002, + Prop_UserIpdMeters_Float = 2003, + Prop_CurrentUniverseId_Uint64 = 2004, + Prop_PreviousUniverseId_Uint64 = 2005, + Prop_DisplayFirmwareVersion_Uint64 = 2006, + Prop_IsOnDesktop_Bool = 2007, + Prop_DisplayMCType_Int32 = 2008, + Prop_DisplayMCOffset_Float = 2009, + Prop_DisplayMCScale_Float = 2010, + Prop_EdidVendorID_Int32 = 2011, + Prop_DisplayMCImageLeft_String = 2012, + Prop_DisplayMCImageRight_String = 2013, + Prop_DisplayGCBlackClamp_Float = 2014, + Prop_EdidProductID_Int32 = 2015, + Prop_CameraToHeadTransform_Matrix34 = 2016, + Prop_DisplayGCType_Int32 = 2017, + Prop_DisplayGCOffset_Float = 2018, + Prop_DisplayGCScale_Float = 2019, + Prop_DisplayGCPrescale_Float = 2020, + Prop_DisplayGCImage_String = 2021, + Prop_LensCenterLeftU_Float = 2022, + Prop_LensCenterLeftV_Float = 2023, + Prop_LensCenterRightU_Float = 2024, + Prop_LensCenterRightV_Float = 2025, + Prop_UserHeadToEyeDepthMeters_Float = 2026, + Prop_CameraFirmwareVersion_Uint64 = 2027, + Prop_CameraFirmwareDescription_String = 2028, + Prop_DisplayFPGAVersion_Uint64 = 2029, + Prop_DisplayBootloaderVersion_Uint64 = 2030, + Prop_DisplayHardwareVersion_Uint64 = 2031, + Prop_AudioFirmwareVersion_Uint64 = 2032, + Prop_CameraCompatibilityMode_Int32 = 2033, + Prop_ScreenshotHorizontalFieldOfViewDegrees_Float = 2034, + Prop_ScreenshotVerticalFieldOfViewDegrees_Float = 2035, + Prop_DisplaySuppressed_Bool = 2036, + Prop_DisplayAllowNightMode_Bool = 2037, + Prop_DisplayMCImageWidth_Int32 = 2038, + Prop_DisplayMCImageHeight_Int32 = 2039, + Prop_DisplayMCImageNumChannels_Int32 = 2040, + Prop_DisplayMCImageData_Binary = 2041, + Prop_SecondsFromPhotonsToVblank_Float = 2042, + Prop_DriverDirectModeSendsVsyncEvents_Bool = 2043, + Prop_DisplayDebugMode_Bool = 2044, + Prop_GraphicsAdapterLuid_Uint64 = 2045, + Prop_AttachedDeviceId_String = 3000, + Prop_SupportedButtons_Uint64 = 3001, + Prop_Axis0Type_Int32 = 3002, + Prop_Axis1Type_Int32 = 3003, + Prop_Axis2Type_Int32 = 3004, + Prop_Axis3Type_Int32 = 3005, + Prop_Axis4Type_Int32 = 3006, + Prop_ControllerRoleHint_Int32 = 3007, + Prop_FieldOfViewLeftDegrees_Float = 4000, + Prop_FieldOfViewRightDegrees_Float = 4001, + Prop_FieldOfViewTopDegrees_Float = 4002, + Prop_FieldOfViewBottomDegrees_Float = 4003, + Prop_TrackingRangeMinimumMeters_Float = 4004, + Prop_TrackingRangeMaximumMeters_Float = 4005, + Prop_ModeLabel_String = 4006, + Prop_IconPathName_String = 5000, + Prop_NamedIconPathDeviceOff_String = 5001, + Prop_NamedIconPathDeviceSearching_String = 5002, + Prop_NamedIconPathDeviceSearchingAlert_String = 5003, + Prop_NamedIconPathDeviceReady_String = 5004, + Prop_NamedIconPathDeviceReadyAlert_String = 5005, + Prop_NamedIconPathDeviceNotReady_String = 5006, + Prop_NamedIconPathDeviceStandby_String = 5007, + Prop_NamedIconPathDeviceAlertLow_String = 5008, + Prop_DisplayHiddenArea_Binary_Start = 5100, + Prop_DisplayHiddenArea_Binary_End = 5150, + Prop_UserConfigPath_String = 6000, + Prop_InstallPath_String = 6001, + Prop_HasDisplayComponent_Bool = 6002, + Prop_HasControllerComponent_Bool = 6003, + Prop_HasCameraComponent_Bool = 6004, + Prop_HasDriverDirectModeComponent_Bool = 6005, + Prop_HasVirtualDisplayComponent_Bool = 6006, + Prop_VendorSpecific_Reserved_Start = 10000, + Prop_VendorSpecific_Reserved_End = 10999, +} +public enum ETrackedPropertyError +{ + TrackedProp_Success = 0, + TrackedProp_WrongDataType = 1, + TrackedProp_WrongDeviceClass = 2, + TrackedProp_BufferTooSmall = 3, + TrackedProp_UnknownProperty = 4, + TrackedProp_InvalidDevice = 5, + TrackedProp_CouldNotContactServer = 6, + TrackedProp_ValueNotProvidedByDevice = 7, + TrackedProp_StringExceedsMaximumLength = 8, + TrackedProp_NotYetAvailable = 9, + TrackedProp_PermissionDenied = 10, + TrackedProp_InvalidOperation = 11, +} +public enum EVRSubmitFlags +{ + Submit_Default = 0, + Submit_LensDistortionAlreadyApplied = 1, + Submit_GlRenderBuffer = 2, + Submit_Reserved = 4, +} +public enum EVRState +{ + Undefined = -1, + Off = 0, + Searching = 1, + Searching_Alert = 2, + Ready = 3, + Ready_Alert = 4, + NotReady = 5, + Standby = 6, + Ready_Alert_Low = 7, +} +public enum EVREventType +{ + VREvent_None = 0, + VREvent_TrackedDeviceActivated = 100, + VREvent_TrackedDeviceDeactivated = 101, + VREvent_TrackedDeviceUpdated = 102, + VREvent_TrackedDeviceUserInteractionStarted = 103, + VREvent_TrackedDeviceUserInteractionEnded = 104, + VREvent_IpdChanged = 105, + VREvent_EnterStandbyMode = 106, + VREvent_LeaveStandbyMode = 107, + VREvent_TrackedDeviceRoleChanged = 108, + VREvent_WatchdogWakeUpRequested = 109, + VREvent_LensDistortionChanged = 110, + VREvent_PropertyChanged = 111, + VREvent_ButtonPress = 200, + VREvent_ButtonUnpress = 201, + VREvent_ButtonTouch = 202, + VREvent_ButtonUntouch = 203, + VREvent_MouseMove = 300, + VREvent_MouseButtonDown = 301, + VREvent_MouseButtonUp = 302, + VREvent_FocusEnter = 303, + VREvent_FocusLeave = 304, + VREvent_Scroll = 305, + VREvent_TouchPadMove = 306, + VREvent_OverlayFocusChanged = 307, + VREvent_InputFocusCaptured = 400, + VREvent_InputFocusReleased = 401, + VREvent_SceneFocusLost = 402, + VREvent_SceneFocusGained = 403, + VREvent_SceneApplicationChanged = 404, + VREvent_SceneFocusChanged = 405, + VREvent_InputFocusChanged = 406, + VREvent_SceneApplicationSecondaryRenderingStarted = 407, + VREvent_HideRenderModels = 410, + VREvent_ShowRenderModels = 411, + VREvent_OverlayShown = 500, + VREvent_OverlayHidden = 501, + VREvent_DashboardActivated = 502, + VREvent_DashboardDeactivated = 503, + VREvent_DashboardThumbSelected = 504, + VREvent_DashboardRequested = 505, + VREvent_ResetDashboard = 506, + VREvent_RenderToast = 507, + VREvent_ImageLoaded = 508, + VREvent_ShowKeyboard = 509, + VREvent_HideKeyboard = 510, + VREvent_OverlayGamepadFocusGained = 511, + VREvent_OverlayGamepadFocusLost = 512, + VREvent_OverlaySharedTextureChanged = 513, + VREvent_DashboardGuideButtonDown = 514, + VREvent_DashboardGuideButtonUp = 515, + VREvent_ScreenshotTriggered = 516, + VREvent_ImageFailed = 517, + VREvent_DashboardOverlayCreated = 518, + VREvent_RequestScreenshot = 520, + VREvent_ScreenshotTaken = 521, + VREvent_ScreenshotFailed = 522, + VREvent_SubmitScreenshotToDashboard = 523, + VREvent_ScreenshotProgressToDashboard = 524, + VREvent_PrimaryDashboardDeviceChanged = 525, + VREvent_Notification_Shown = 600, + VREvent_Notification_Hidden = 601, + VREvent_Notification_BeginInteraction = 602, + VREvent_Notification_Destroyed = 603, + VREvent_Quit = 700, + VREvent_ProcessQuit = 701, + VREvent_QuitAborted_UserPrompt = 702, + VREvent_QuitAcknowledged = 703, + VREvent_DriverRequestedQuit = 704, + VREvent_ChaperoneDataHasChanged = 800, + VREvent_ChaperoneUniverseHasChanged = 801, + VREvent_ChaperoneTempDataHasChanged = 802, + VREvent_ChaperoneSettingsHaveChanged = 803, + VREvent_SeatedZeroPoseReset = 804, + VREvent_AudioSettingsHaveChanged = 820, + VREvent_BackgroundSettingHasChanged = 850, + VREvent_CameraSettingsHaveChanged = 851, + VREvent_ReprojectionSettingHasChanged = 852, + VREvent_ModelSkinSettingsHaveChanged = 853, + VREvent_EnvironmentSettingsHaveChanged = 854, + VREvent_PowerSettingsHaveChanged = 855, + VREvent_EnableHomeAppSettingsHaveChanged = 856, + VREvent_StatusUpdate = 900, + VREvent_MCImageUpdated = 1000, + VREvent_FirmwareUpdateStarted = 1100, + VREvent_FirmwareUpdateFinished = 1101, + VREvent_KeyboardClosed = 1200, + VREvent_KeyboardCharInput = 1201, + VREvent_KeyboardDone = 1202, + VREvent_ApplicationTransitionStarted = 1300, + VREvent_ApplicationTransitionAborted = 1301, + VREvent_ApplicationTransitionNewAppStarted = 1302, + VREvent_ApplicationListUpdated = 1303, + VREvent_ApplicationMimeTypeLoad = 1304, + VREvent_ApplicationTransitionNewAppLaunchComplete = 1305, + VREvent_ProcessConnected = 1306, + VREvent_ProcessDisconnected = 1307, + VREvent_Compositor_MirrorWindowShown = 1400, + VREvent_Compositor_MirrorWindowHidden = 1401, + VREvent_Compositor_ChaperoneBoundsShown = 1410, + VREvent_Compositor_ChaperoneBoundsHidden = 1411, + VREvent_TrackedCamera_StartVideoStream = 1500, + VREvent_TrackedCamera_StopVideoStream = 1501, + VREvent_TrackedCamera_PauseVideoStream = 1502, + VREvent_TrackedCamera_ResumeVideoStream = 1503, + VREvent_TrackedCamera_EditingSurface = 1550, + VREvent_PerformanceTest_EnableCapture = 1600, + VREvent_PerformanceTest_DisableCapture = 1601, + VREvent_PerformanceTest_FidelityLevel = 1602, + VREvent_MessageOverlay_Closed = 1650, + VREvent_VendorSpecific_Reserved_Start = 10000, + VREvent_VendorSpecific_Reserved_End = 19999, +} +public enum EDeviceActivityLevel +{ + k_EDeviceActivityLevel_Unknown = -1, + k_EDeviceActivityLevel_Idle = 0, + k_EDeviceActivityLevel_UserInteraction = 1, + k_EDeviceActivityLevel_UserInteraction_Timeout = 2, + k_EDeviceActivityLevel_Standby = 3, +} +public enum EVRButtonId +{ + k_EButton_System = 0, + k_EButton_ApplicationMenu = 1, + k_EButton_Grip = 2, + k_EButton_DPad_Left = 3, + k_EButton_DPad_Up = 4, + k_EButton_DPad_Right = 5, + k_EButton_DPad_Down = 6, + k_EButton_A = 7, + k_EButton_ProximitySensor = 31, + k_EButton_Axis0 = 32, + k_EButton_Axis1 = 33, + k_EButton_Axis2 = 34, + k_EButton_Axis3 = 35, + k_EButton_Axis4 = 36, + k_EButton_SteamVR_Touchpad = 32, + k_EButton_SteamVR_Trigger = 33, + k_EButton_Dashboard_Back = 2, + k_EButton_Max = 64, +} +public enum EVRMouseButton +{ + Left = 1, + Right = 2, + Middle = 4, +} +public enum EHiddenAreaMeshType +{ + k_eHiddenAreaMesh_Standard = 0, + k_eHiddenAreaMesh_Inverse = 1, + k_eHiddenAreaMesh_LineLoop = 2, + k_eHiddenAreaMesh_Max = 3, +} +public enum EVRControllerAxisType +{ + k_eControllerAxis_None = 0, + k_eControllerAxis_TrackPad = 1, + k_eControllerAxis_Joystick = 2, + k_eControllerAxis_Trigger = 3, +} +public enum EVRControllerEventOutputType +{ + ControllerEventOutput_OSEvents = 0, + ControllerEventOutput_VREvents = 1, +} +public enum ECollisionBoundsStyle +{ + COLLISION_BOUNDS_STYLE_BEGINNER = 0, + COLLISION_BOUNDS_STYLE_INTERMEDIATE = 1, + COLLISION_BOUNDS_STYLE_SQUARES = 2, + COLLISION_BOUNDS_STYLE_ADVANCED = 3, + COLLISION_BOUNDS_STYLE_NONE = 4, + COLLISION_BOUNDS_STYLE_COUNT = 5, +} +public enum EVROverlayError +{ + None = 0, + UnknownOverlay = 10, + InvalidHandle = 11, + PermissionDenied = 12, + OverlayLimitExceeded = 13, + WrongVisibilityType = 14, + KeyTooLong = 15, + NameTooLong = 16, + KeyInUse = 17, + WrongTransformType = 18, + InvalidTrackedDevice = 19, + InvalidParameter = 20, + ThumbnailCantBeDestroyed = 21, + ArrayTooSmall = 22, + RequestFailed = 23, + InvalidTexture = 24, + UnableToLoadFile = 25, + KeyboardAlreadyInUse = 26, + NoNeighbor = 27, + TooManyMaskPrimitives = 29, + BadMaskPrimitive = 30, +} +public enum EVRApplicationType +{ + VRApplication_Other = 0, + VRApplication_Scene = 1, + VRApplication_Overlay = 2, + VRApplication_Background = 3, + VRApplication_Utility = 4, + VRApplication_VRMonitor = 5, + VRApplication_SteamWatchdog = 6, + VRApplication_Bootstrapper = 7, + VRApplication_Max = 8, +} +public enum EVRFirmwareError +{ + None = 0, + Success = 1, + Fail = 2, +} +public enum EVRNotificationError +{ + OK = 0, + InvalidNotificationId = 100, + NotificationQueueFull = 101, + InvalidOverlayHandle = 102, + SystemWithUserValueAlreadyExists = 103, +} +public enum EVRInitError +{ + None = 0, + Unknown = 1, + Init_InstallationNotFound = 100, + Init_InstallationCorrupt = 101, + Init_VRClientDLLNotFound = 102, + Init_FileNotFound = 103, + Init_FactoryNotFound = 104, + Init_InterfaceNotFound = 105, + Init_InvalidInterface = 106, + Init_UserConfigDirectoryInvalid = 107, + Init_HmdNotFound = 108, + Init_NotInitialized = 109, + Init_PathRegistryNotFound = 110, + Init_NoConfigPath = 111, + Init_NoLogPath = 112, + Init_PathRegistryNotWritable = 113, + Init_AppInfoInitFailed = 114, + Init_Retry = 115, + Init_InitCanceledByUser = 116, + Init_AnotherAppLaunching = 117, + Init_SettingsInitFailed = 118, + Init_ShuttingDown = 119, + Init_TooManyObjects = 120, + Init_NoServerForBackgroundApp = 121, + Init_NotSupportedWithCompositor = 122, + Init_NotAvailableToUtilityApps = 123, + Init_Internal = 124, + Init_HmdDriverIdIsNone = 125, + Init_HmdNotFoundPresenceFailed = 126, + Init_VRMonitorNotFound = 127, + Init_VRMonitorStartupFailed = 128, + Init_LowPowerWatchdogNotSupported = 129, + Init_InvalidApplicationType = 130, + Init_NotAvailableToWatchdogApps = 131, + Init_WatchdogDisabledInSettings = 132, + Init_VRDashboardNotFound = 133, + Init_VRDashboardStartupFailed = 134, + Init_VRHomeNotFound = 135, + Init_VRHomeStartupFailed = 136, + Driver_Failed = 200, + Driver_Unknown = 201, + Driver_HmdUnknown = 202, + Driver_NotLoaded = 203, + Driver_RuntimeOutOfDate = 204, + Driver_HmdInUse = 205, + Driver_NotCalibrated = 206, + Driver_CalibrationInvalid = 207, + Driver_HmdDisplayNotFound = 208, + Driver_TrackedDeviceInterfaceUnknown = 209, + Driver_HmdDriverIdOutOfBounds = 211, + Driver_HmdDisplayMirrored = 212, + IPC_ServerInitFailed = 300, + IPC_ConnectFailed = 301, + IPC_SharedStateInitFailed = 302, + IPC_CompositorInitFailed = 303, + IPC_MutexInitFailed = 304, + IPC_Failed = 305, + IPC_CompositorConnectFailed = 306, + IPC_CompositorInvalidConnectResponse = 307, + IPC_ConnectFailedAfterMultipleAttempts = 308, + Compositor_Failed = 400, + Compositor_D3D11HardwareRequired = 401, + Compositor_FirmwareRequiresUpdate = 402, + Compositor_OverlayInitFailed = 403, + Compositor_ScreenshotsInitFailed = 404, + Compositor_UnableToCreateDevice = 405, + VendorSpecific_UnableToConnectToOculusRuntime = 1000, + VendorSpecific_HmdFound_CantOpenDevice = 1101, + VendorSpecific_HmdFound_UnableToRequestConfigStart = 1102, + VendorSpecific_HmdFound_NoStoredConfig = 1103, + VendorSpecific_HmdFound_ConfigTooBig = 1104, + VendorSpecific_HmdFound_ConfigTooSmall = 1105, + VendorSpecific_HmdFound_UnableToInitZLib = 1106, + VendorSpecific_HmdFound_CantReadFirmwareVersion = 1107, + VendorSpecific_HmdFound_UnableToSendUserDataStart = 1108, + VendorSpecific_HmdFound_UnableToGetUserDataStart = 1109, + VendorSpecific_HmdFound_UnableToGetUserDataNext = 1110, + VendorSpecific_HmdFound_UserDataAddressRange = 1111, + VendorSpecific_HmdFound_UserDataError = 1112, + VendorSpecific_HmdFound_ConfigFailedSanityCheck = 1113, + Steam_SteamInstallationNotFound = 2000, +} +public enum EVRScreenshotType +{ + None = 0, + Mono = 1, + Stereo = 2, + Cubemap = 3, + MonoPanorama = 4, + StereoPanorama = 5, +} +public enum EVRScreenshotPropertyFilenames +{ + Preview = 0, + VR = 1, +} +public enum EVRTrackedCameraError +{ + None = 0, + OperationFailed = 100, + InvalidHandle = 101, + InvalidFrameHeaderVersion = 102, + OutOfHandles = 103, + IPCFailure = 104, + NotSupportedForThisDevice = 105, + SharedMemoryFailure = 106, + FrameBufferingFailure = 107, + StreamSetupFailure = 108, + InvalidGLTextureId = 109, + InvalidSharedTextureHandle = 110, + FailedToGetGLTextureId = 111, + SharedTextureFailure = 112, + NoFrameAvailable = 113, + InvalidArgument = 114, + InvalidFrameBufferSize = 115, +} +public enum EVRTrackedCameraFrameType +{ + Distorted = 0, + Undistorted = 1, + MaximumUndistorted = 2, + MAX_CAMERA_FRAME_TYPES = 3, +} +public enum EVRApplicationError +{ + None = 0, + AppKeyAlreadyExists = 100, + NoManifest = 101, + NoApplication = 102, + InvalidIndex = 103, + UnknownApplication = 104, + IPCFailed = 105, + ApplicationAlreadyRunning = 106, + InvalidManifest = 107, + InvalidApplication = 108, + LaunchFailed = 109, + ApplicationAlreadyStarting = 110, + LaunchInProgress = 111, + OldApplicationQuitting = 112, + TransitionAborted = 113, + IsTemplate = 114, + BufferTooSmall = 200, + PropertyNotSet = 201, + UnknownProperty = 202, + InvalidParameter = 203, +} +public enum EVRApplicationProperty +{ + Name_String = 0, + LaunchType_String = 11, + WorkingDirectory_String = 12, + BinaryPath_String = 13, + Arguments_String = 14, + URL_String = 15, + Description_String = 50, + NewsURL_String = 51, + ImagePath_String = 52, + Source_String = 53, + IsDashboardOverlay_Bool = 60, + IsTemplate_Bool = 61, + IsInstanced_Bool = 62, + IsInternal_Bool = 63, + LastLaunchTime_Uint64 = 70, +} +public enum EVRApplicationTransitionState +{ + VRApplicationTransition_None = 0, + VRApplicationTransition_OldAppQuitSent = 10, + VRApplicationTransition_WaitingForExternalLaunch = 11, + VRApplicationTransition_NewAppLaunched = 20, +} +public enum ChaperoneCalibrationState +{ + OK = 1, + Warning = 100, + Warning_BaseStationMayHaveMoved = 101, + Warning_BaseStationRemoved = 102, + Warning_SeatedBoundsInvalid = 103, + Error = 200, + Error_BaseStationUninitialized = 201, + Error_BaseStationConflict = 202, + Error_PlayAreaInvalid = 203, + Error_CollisionBoundsInvalid = 204, +} +public enum EChaperoneConfigFile +{ + Live = 1, + Temp = 2, +} +public enum EChaperoneImportFlags +{ + EChaperoneImport_BoundsOnly = 1, +} +public enum EVRCompositorError +{ + None = 0, + RequestFailed = 1, + IncompatibleVersion = 100, + DoNotHaveFocus = 101, + InvalidTexture = 102, + IsNotSceneApplication = 103, + TextureIsOnWrongDevice = 104, + TextureUsesUnsupportedFormat = 105, + SharedTexturesNotSupported = 106, + IndexOutOfRange = 107, + AlreadySubmitted = 108, +} +public enum VROverlayInputMethod +{ + None = 0, + Mouse = 1, +} +public enum VROverlayTransformType +{ + VROverlayTransform_Absolute = 0, + VROverlayTransform_TrackedDeviceRelative = 1, + VROverlayTransform_SystemOverlay = 2, + VROverlayTransform_TrackedComponent = 3, +} +public enum VROverlayFlags +{ + None = 0, + Curved = 1, + RGSS4X = 2, + NoDashboardTab = 3, + AcceptsGamepadEvents = 4, + ShowGamepadFocus = 5, + SendVRScrollEvents = 6, + SendVRTouchpadEvents = 7, + ShowTouchPadScrollWheel = 8, + TransferOwnershipToInternalProcess = 9, + SideBySide_Parallel = 10, + SideBySide_Crossed = 11, + Panorama = 12, + StereoPanorama = 13, + SortWithNonSceneOverlays = 14, + VisibleInDashboard = 15, +} +public enum VRMessageOverlayResponse +{ + ButtonPress_0 = 0, + ButtonPress_1 = 1, + ButtonPress_2 = 2, + ButtonPress_3 = 3, + CouldntFindSystemOverlay = 4, + CouldntFindOrCreateClientOverlay = 5, + ApplicationQuit = 6, +} +public enum EGamepadTextInputMode +{ + k_EGamepadTextInputModeNormal = 0, + k_EGamepadTextInputModePassword = 1, + k_EGamepadTextInputModeSubmit = 2, +} +public enum EGamepadTextInputLineMode +{ + k_EGamepadTextInputLineModeSingleLine = 0, + k_EGamepadTextInputLineModeMultipleLines = 1, +} +public enum EOverlayDirection +{ + Up = 0, + Down = 1, + Left = 2, + Right = 3, + Count = 4, +} +public enum EVROverlayIntersectionMaskPrimitiveType +{ + OverlayIntersectionPrimitiveType_Rectangle = 0, + OverlayIntersectionPrimitiveType_Circle = 1, +} +public enum EVRRenderModelError +{ + None = 0, + Loading = 100, + NotSupported = 200, + InvalidArg = 300, + InvalidModel = 301, + NoShapes = 302, + MultipleShapes = 303, + TooManyVertices = 304, + MultipleTextures = 305, + BufferTooSmall = 306, + NotEnoughNormals = 307, + NotEnoughTexCoords = 308, + InvalidTexture = 400, +} +public enum EVRComponentProperty +{ + IsStatic = 1, + IsVisible = 2, + IsTouched = 4, + IsPressed = 8, + IsScrolled = 16, +} +public enum EVRNotificationType +{ + Transient = 0, + Persistent = 1, + Transient_SystemWithUserValue = 2, +} +public enum EVRNotificationStyle +{ + None = 0, + Application = 100, + Contact_Disabled = 200, + Contact_Enabled = 201, + Contact_Active = 202, +} +public enum EVRSettingsError +{ + None = 0, + IPCFailed = 1, + WriteFailed = 2, + ReadFailed = 3, + JsonParseFailed = 4, + UnsetSettingHasNoDefault = 5, +} +public enum EVRScreenshotError +{ + None = 0, + RequestFailed = 1, + IncompatibleVersion = 100, + NotFound = 101, + BufferTooSmall = 102, + ScreenshotAlreadyInProgress = 108, +} + +[StructLayout(LayoutKind.Explicit)] public struct VREvent_Data_t +{ + [FieldOffset(0)] public VREvent_Reserved_t reserved; + [FieldOffset(0)] public VREvent_Controller_t controller; + [FieldOffset(0)] public VREvent_Mouse_t mouse; + [FieldOffset(0)] public VREvent_Scroll_t scroll; + [FieldOffset(0)] public VREvent_Process_t process; + [FieldOffset(0)] public VREvent_Notification_t notification; + [FieldOffset(0)] public VREvent_Overlay_t overlay; + [FieldOffset(0)] public VREvent_Status_t status; + [FieldOffset(0)] public VREvent_Ipd_t ipd; + [FieldOffset(0)] public VREvent_Chaperone_t chaperone; + [FieldOffset(0)] public VREvent_PerformanceTest_t performanceTest; + [FieldOffset(0)] public VREvent_TouchPadMove_t touchPadMove; + [FieldOffset(0)] public VREvent_SeatedZeroPoseReset_t seatedZeroPoseReset; + [FieldOffset(0)] public VREvent_Screenshot_t screenshot; + [FieldOffset(0)] public VREvent_ScreenshotProgress_t screenshotProgress; + [FieldOffset(0)] public VREvent_ApplicationLaunch_t applicationLaunch; + [FieldOffset(0)] public VREvent_EditingCameraSurface_t cameraSurface; + [FieldOffset(0)] public VREvent_MessageOverlay_t messageOverlay; + [FieldOffset(0)] public VREvent_Keyboard_t keyboard; // This has to be at the end due to a mono bug +} + + +[StructLayout(LayoutKind.Explicit)] public struct VROverlayIntersectionMaskPrimitive_Data_t +{ + [FieldOffset(0)] public IntersectionMaskRectangle_t m_Rectangle; + [FieldOffset(0)] public IntersectionMaskCircle_t m_Circle; +} + +[StructLayout(LayoutKind.Sequential)] public struct HmdMatrix34_t +{ + public float m0; //float[3][4] + public float m1; + public float m2; + public float m3; + public float m4; + public float m5; + public float m6; + public float m7; + public float m8; + public float m9; + public float m10; + public float m11; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdMatrix44_t +{ + public float m0; //float[4][4] + public float m1; + public float m2; + public float m3; + public float m4; + public float m5; + public float m6; + public float m7; + public float m8; + public float m9; + public float m10; + public float m11; + public float m12; + public float m13; + public float m14; + public float m15; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdVector3_t +{ + public float v0; //float[3] + public float v1; + public float v2; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdVector4_t +{ + public float v0; //float[4] + public float v1; + public float v2; + public float v3; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdVector3d_t +{ + public double v0; //double[3] + public double v1; + public double v2; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdVector2_t +{ + public float v0; //float[2] + public float v1; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdQuaternion_t +{ + public double w; + public double x; + public double y; + public double z; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdColor_t +{ + public float r; + public float g; + public float b; + public float a; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdQuad_t +{ + public HmdVector3_t vCorners0; //HmdVector3_t[4] + public HmdVector3_t vCorners1; + public HmdVector3_t vCorners2; + public HmdVector3_t vCorners3; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdRect2_t +{ + public HmdVector2_t vTopLeft; + public HmdVector2_t vBottomRight; +} +[StructLayout(LayoutKind.Sequential)] public struct DistortionCoordinates_t +{ + public float rfRed0; //float[2] + public float rfRed1; + public float rfGreen0; //float[2] + public float rfGreen1; + public float rfBlue0; //float[2] + public float rfBlue1; +} +[StructLayout(LayoutKind.Sequential)] public struct Texture_t +{ + public IntPtr handle; // void * + public ETextureType eType; + public EColorSpace eColorSpace; +} +[StructLayout(LayoutKind.Sequential)] public struct TrackedDevicePose_t +{ + public HmdMatrix34_t mDeviceToAbsoluteTracking; + public HmdVector3_t vVelocity; + public HmdVector3_t vAngularVelocity; + public ETrackingResult eTrackingResult; + [MarshalAs(UnmanagedType.I1)] + public bool bPoseIsValid; + [MarshalAs(UnmanagedType.I1)] + public bool bDeviceIsConnected; +} +[StructLayout(LayoutKind.Sequential)] public struct VRTextureBounds_t +{ + public float uMin; + public float vMin; + public float uMax; + public float vMax; +} +[StructLayout(LayoutKind.Sequential)] public struct VRVulkanTextureData_t +{ + public ulong m_nImage; + public IntPtr m_pDevice; // struct VkDevice_T * + public IntPtr m_pPhysicalDevice; // struct VkPhysicalDevice_T * + public IntPtr m_pInstance; // struct VkInstance_T * + public IntPtr m_pQueue; // struct VkQueue_T * + public uint m_nQueueFamilyIndex; + public uint m_nWidth; + public uint m_nHeight; + public uint m_nFormat; + public uint m_nSampleCount; +} +[StructLayout(LayoutKind.Sequential)] public struct D3D12TextureData_t +{ + public IntPtr m_pResource; // struct ID3D12Resource * + public IntPtr m_pCommandQueue; // struct ID3D12CommandQueue * + public uint m_nNodeMask; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Controller_t +{ + public uint button; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Mouse_t +{ + public float x; + public float y; + public uint button; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Scroll_t +{ + public float xdelta; + public float ydelta; + public uint repeatCount; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_TouchPadMove_t +{ + [MarshalAs(UnmanagedType.I1)] + public bool bFingerDown; + public float flSecondsFingerDown; + public float fValueXFirst; + public float fValueYFirst; + public float fValueXRaw; + public float fValueYRaw; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Notification_t +{ + public ulong ulUserValue; + public uint notificationId; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Process_t +{ + public uint pid; + public uint oldPid; + [MarshalAs(UnmanagedType.I1)] + public bool bForced; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Overlay_t +{ + public ulong overlayHandle; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Status_t +{ + public uint statusState; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Keyboard_t +{ + public byte cNewInput0,cNewInput1,cNewInput2,cNewInput3,cNewInput4,cNewInput5,cNewInput6,cNewInput7; + public ulong uUserValue; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Ipd_t +{ + public float ipdMeters; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Chaperone_t +{ + public ulong m_nPreviousUniverse; + public ulong m_nCurrentUniverse; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Reserved_t +{ + public ulong reserved0; + public ulong reserved1; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_PerformanceTest_t +{ + public uint m_nFidelityLevel; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_SeatedZeroPoseReset_t +{ + [MarshalAs(UnmanagedType.I1)] + public bool bResetBySystemMenu; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Screenshot_t +{ + public uint handle; + public uint type; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_ScreenshotProgress_t +{ + public float progress; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_ApplicationLaunch_t +{ + public uint pid; + public uint unArgsHandle; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_EditingCameraSurface_t +{ + public ulong overlayHandle; + public uint nVisualMode; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_MessageOverlay_t +{ + public uint unVRMessageOverlayResponse; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Property_t +{ + public ulong container; + public ETrackedDeviceProperty prop; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_t +{ + public uint eventType; + public uint trackedDeviceIndex; + public float eventAgeSeconds; + public VREvent_Data_t data; +} +// This structure is for backwards binary compatibility on Linux and OSX only +[StructLayout(LayoutKind.Sequential, Pack = 4)] public struct VREvent_t_Packed +{ + public uint eventType; + public uint trackedDeviceIndex; + public float eventAgeSeconds; + public VREvent_Data_t data; + public VREvent_t_Packed(VREvent_t unpacked) + { + this.eventType = unpacked.eventType; + this.trackedDeviceIndex = unpacked.trackedDeviceIndex; + this.eventAgeSeconds = unpacked.eventAgeSeconds; + this.data = unpacked.data; + } + public void Unpack(ref VREvent_t unpacked) + { + unpacked.eventType = this.eventType; + unpacked.trackedDeviceIndex = this.trackedDeviceIndex; + unpacked.eventAgeSeconds = this.eventAgeSeconds; + unpacked.data = this.data; + } +} +[StructLayout(LayoutKind.Sequential)] public struct HiddenAreaMesh_t +{ + public IntPtr pVertexData; // const struct vr::HmdVector2_t * + public uint unTriangleCount; +} +[StructLayout(LayoutKind.Sequential)] public struct VRControllerAxis_t +{ + public float x; + public float y; +} +[StructLayout(LayoutKind.Sequential)] public struct VRControllerState_t +{ + public uint unPacketNum; + public ulong ulButtonPressed; + public ulong ulButtonTouched; + public VRControllerAxis_t rAxis0; //VRControllerAxis_t[5] + public VRControllerAxis_t rAxis1; + public VRControllerAxis_t rAxis2; + public VRControllerAxis_t rAxis3; + public VRControllerAxis_t rAxis4; +} +// This structure is for backwards binary compatibility on Linux and OSX only +[StructLayout(LayoutKind.Sequential, Pack = 4)] public struct VRControllerState_t_Packed +{ + public uint unPacketNum; + public ulong ulButtonPressed; + public ulong ulButtonTouched; + public VRControllerAxis_t rAxis0; //VRControllerAxis_t[5] + public VRControllerAxis_t rAxis1; + public VRControllerAxis_t rAxis2; + public VRControllerAxis_t rAxis3; + public VRControllerAxis_t rAxis4; + public VRControllerState_t_Packed(VRControllerState_t unpacked) + { + this.unPacketNum = unpacked.unPacketNum; + this.ulButtonPressed = unpacked.ulButtonPressed; + this.ulButtonTouched = unpacked.ulButtonTouched; + this.rAxis0 = unpacked.rAxis0; + this.rAxis1 = unpacked.rAxis1; + this.rAxis2 = unpacked.rAxis2; + this.rAxis3 = unpacked.rAxis3; + this.rAxis4 = unpacked.rAxis4; + } + public void Unpack(ref VRControllerState_t unpacked) + { + unpacked.unPacketNum = this.unPacketNum; + unpacked.ulButtonPressed = this.ulButtonPressed; + unpacked.ulButtonTouched = this.ulButtonTouched; + unpacked.rAxis0 = this.rAxis0; + unpacked.rAxis1 = this.rAxis1; + unpacked.rAxis2 = this.rAxis2; + unpacked.rAxis3 = this.rAxis3; + unpacked.rAxis4 = this.rAxis4; + } +} +[StructLayout(LayoutKind.Sequential)] public struct Compositor_OverlaySettings +{ + public uint size; + [MarshalAs(UnmanagedType.I1)] + public bool curved; + [MarshalAs(UnmanagedType.I1)] + public bool antialias; + public float scale; + public float distance; + public float alpha; + public float uOffset; + public float vOffset; + public float uScale; + public float vScale; + public float gridDivs; + public float gridWidth; + public float gridScale; + public HmdMatrix44_t transform; +} +[StructLayout(LayoutKind.Sequential)] public struct CameraVideoStreamFrameHeader_t +{ + public EVRTrackedCameraFrameType eFrameType; + public uint nWidth; + public uint nHeight; + public uint nBytesPerPixel; + public uint nFrameSequence; + public TrackedDevicePose_t standingTrackedDevicePose; +} +[StructLayout(LayoutKind.Sequential)] public struct AppOverrideKeys_t +{ + public IntPtr pchKey; // const char * + public IntPtr pchValue; // const char * +} +[StructLayout(LayoutKind.Sequential)] public struct Compositor_FrameTiming +{ + public uint m_nSize; + public uint m_nFrameIndex; + public uint m_nNumFramePresents; + public uint m_nNumMisPresented; + public uint m_nNumDroppedFrames; + public uint m_nReprojectionFlags; + public double m_flSystemTimeInSeconds; + public float m_flPreSubmitGpuMs; + public float m_flPostSubmitGpuMs; + public float m_flTotalRenderGpuMs; + public float m_flCompositorRenderGpuMs; + public float m_flCompositorRenderCpuMs; + public float m_flCompositorIdleCpuMs; + public float m_flClientFrameIntervalMs; + public float m_flPresentCallCpuMs; + public float m_flWaitForPresentCpuMs; + public float m_flSubmitFrameMs; + public float m_flWaitGetPosesCalledMs; + public float m_flNewPosesReadyMs; + public float m_flNewFrameReadyMs; + public float m_flCompositorUpdateStartMs; + public float m_flCompositorUpdateEndMs; + public float m_flCompositorRenderStartMs; + public TrackedDevicePose_t m_HmdPose; +} +[StructLayout(LayoutKind.Sequential)] public struct Compositor_CumulativeStats +{ + public uint m_nPid; + public uint m_nNumFramePresents; + public uint m_nNumDroppedFrames; + public uint m_nNumReprojectedFrames; + public uint m_nNumFramePresentsOnStartup; + public uint m_nNumDroppedFramesOnStartup; + public uint m_nNumReprojectedFramesOnStartup; + public uint m_nNumLoading; + public uint m_nNumFramePresentsLoading; + public uint m_nNumDroppedFramesLoading; + public uint m_nNumReprojectedFramesLoading; + public uint m_nNumTimedOut; + public uint m_nNumFramePresentsTimedOut; + public uint m_nNumDroppedFramesTimedOut; + public uint m_nNumReprojectedFramesTimedOut; +} +[StructLayout(LayoutKind.Sequential)] public struct VROverlayIntersectionParams_t +{ + public HmdVector3_t vSource; + public HmdVector3_t vDirection; + public ETrackingUniverseOrigin eOrigin; +} +[StructLayout(LayoutKind.Sequential)] public struct VROverlayIntersectionResults_t +{ + public HmdVector3_t vPoint; + public HmdVector3_t vNormal; + public HmdVector2_t vUVs; + public float fDistance; +} +[StructLayout(LayoutKind.Sequential)] public struct IntersectionMaskRectangle_t +{ + public float m_flTopLeftX; + public float m_flTopLeftY; + public float m_flWidth; + public float m_flHeight; +} +[StructLayout(LayoutKind.Sequential)] public struct IntersectionMaskCircle_t +{ + public float m_flCenterX; + public float m_flCenterY; + public float m_flRadius; +} +[StructLayout(LayoutKind.Sequential)] public struct VROverlayIntersectionMaskPrimitive_t +{ + public EVROverlayIntersectionMaskPrimitiveType m_nPrimitiveType; + public VROverlayIntersectionMaskPrimitive_Data_t m_Primitive; +} +[StructLayout(LayoutKind.Sequential)] public struct RenderModel_ComponentState_t +{ + public HmdMatrix34_t mTrackingToComponentRenderModel; + public HmdMatrix34_t mTrackingToComponentLocal; + public uint uProperties; +} +[StructLayout(LayoutKind.Sequential)] public struct RenderModel_Vertex_t +{ + public HmdVector3_t vPosition; + public HmdVector3_t vNormal; + public float rfTextureCoord0; //float[2] + public float rfTextureCoord1; +} +[StructLayout(LayoutKind.Sequential)] public struct RenderModel_TextureMap_t +{ + public char unWidth; + public char unHeight; + public IntPtr rubTextureMapData; // const uint8_t * +} +// This structure is for backwards binary compatibility on Linux and OSX only +[StructLayout(LayoutKind.Sequential, Pack = 4)] public struct RenderModel_TextureMap_t_Packed +{ + public char unWidth; + public char unHeight; + public IntPtr rubTextureMapData; // const uint8_t * + public RenderModel_TextureMap_t_Packed(RenderModel_TextureMap_t unpacked) + { + this.unWidth = unpacked.unWidth; + this.unHeight = unpacked.unHeight; + this.rubTextureMapData = unpacked.rubTextureMapData; + } + public void Unpack(ref RenderModel_TextureMap_t unpacked) + { + unpacked.unWidth = this.unWidth; + unpacked.unHeight = this.unHeight; + unpacked.rubTextureMapData = this.rubTextureMapData; + } +} +[StructLayout(LayoutKind.Sequential)] public struct RenderModel_t +{ + public IntPtr rVertexData; // const struct vr::RenderModel_Vertex_t * + public uint unVertexCount; + public IntPtr rIndexData; // const uint16_t * + public uint unTriangleCount; + public int diffuseTextureId; +} +// This structure is for backwards binary compatibility on Linux and OSX only +[StructLayout(LayoutKind.Sequential, Pack = 4)] public struct RenderModel_t_Packed +{ + public IntPtr rVertexData; // const struct vr::RenderModel_Vertex_t * + public uint unVertexCount; + public IntPtr rIndexData; // const uint16_t * + public uint unTriangleCount; + public int diffuseTextureId; + public RenderModel_t_Packed(RenderModel_t unpacked) + { + this.rVertexData = unpacked.rVertexData; + this.unVertexCount = unpacked.unVertexCount; + this.rIndexData = unpacked.rIndexData; + this.unTriangleCount = unpacked.unTriangleCount; + this.diffuseTextureId = unpacked.diffuseTextureId; + } + public void Unpack(ref RenderModel_t unpacked) + { + unpacked.rVertexData = this.rVertexData; + unpacked.unVertexCount = this.unVertexCount; + unpacked.rIndexData = this.rIndexData; + unpacked.unTriangleCount = this.unTriangleCount; + unpacked.diffuseTextureId = this.diffuseTextureId; + } +} +[StructLayout(LayoutKind.Sequential)] public struct RenderModel_ControllerMode_State_t +{ + [MarshalAs(UnmanagedType.I1)] + public bool bScrollWheelVisible; +} +[StructLayout(LayoutKind.Sequential)] public struct NotificationBitmap_t +{ + public IntPtr m_pImageData; // void * + public int m_nWidth; + public int m_nHeight; + public int m_nBytesPerPixel; +} +[StructLayout(LayoutKind.Sequential)] public struct COpenVRContext +{ + public IntPtr m_pVRSystem; // class vr::IVRSystem * + public IntPtr m_pVRChaperone; // class vr::IVRChaperone * + public IntPtr m_pVRChaperoneSetup; // class vr::IVRChaperoneSetup * + public IntPtr m_pVRCompositor; // class vr::IVRCompositor * + public IntPtr m_pVROverlay; // class vr::IVROverlay * + public IntPtr m_pVRResources; // class vr::IVRResources * + public IntPtr m_pVRRenderModels; // class vr::IVRRenderModels * + public IntPtr m_pVRExtendedDisplay; // class vr::IVRExtendedDisplay * + public IntPtr m_pVRSettings; // class vr::IVRSettings * + public IntPtr m_pVRApplications; // class vr::IVRApplications * + public IntPtr m_pVRTrackedCamera; // class vr::IVRTrackedCamera * + public IntPtr m_pVRScreenshots; // class vr::IVRScreenshots * + public IntPtr m_pVRDriverManager; // class vr::IVRDriverManager * +} + +public class OpenVR +{ + + public static uint InitInternal(ref EVRInitError peError, EVRApplicationType eApplicationType) + { + return OpenVRInterop.InitInternal(ref peError, eApplicationType); + } + + public static void ShutdownInternal() + { + OpenVRInterop.ShutdownInternal(); + } + + public static bool IsHmdPresent() + { + return OpenVRInterop.IsHmdPresent(); + } + + public static bool IsRuntimeInstalled() + { + return OpenVRInterop.IsRuntimeInstalled(); + } + + public static string GetStringForHmdError(EVRInitError error) + { + return Marshal.PtrToStringAnsi(OpenVRInterop.GetStringForHmdError(error)); + } + + public static IntPtr GetGenericInterface(string pchInterfaceVersion, ref EVRInitError peError) + { + return OpenVRInterop.GetGenericInterface(pchInterfaceVersion, ref peError); + } + + public static bool IsInterfaceVersionValid(string pchInterfaceVersion) + { + return OpenVRInterop.IsInterfaceVersionValid(pchInterfaceVersion); + } + + public static uint GetInitToken() + { + return OpenVRInterop.GetInitToken(); + } + + public const uint k_nDriverNone = 4294967295; + public const uint k_unMaxDriverDebugResponseSize = 32768; + public const uint k_unTrackedDeviceIndex_Hmd = 0; + public const uint k_unMaxTrackedDeviceCount = 16; + public const uint k_unTrackedDeviceIndexOther = 4294967294; + public const uint k_unTrackedDeviceIndexInvalid = 4294967295; + public const ulong k_ulInvalidPropertyContainer = 0; + public const uint k_unInvalidPropertyTag = 0; + public const uint k_unFloatPropertyTag = 1; + public const uint k_unInt32PropertyTag = 2; + public const uint k_unUint64PropertyTag = 3; + public const uint k_unBoolPropertyTag = 4; + public const uint k_unStringPropertyTag = 5; + public const uint k_unHmdMatrix34PropertyTag = 20; + public const uint k_unHmdMatrix44PropertyTag = 21; + public const uint k_unHmdVector3PropertyTag = 22; + public const uint k_unHmdVector4PropertyTag = 23; + public const uint k_unHiddenAreaPropertyTag = 30; + public const uint k_unOpenVRInternalReserved_Start = 1000; + public const uint k_unOpenVRInternalReserved_End = 10000; + public const uint k_unMaxPropertyStringSize = 32768; + public const uint k_unControllerStateAxisCount = 5; + public const ulong k_ulOverlayHandleInvalid = 0; + public const uint k_unScreenshotHandleInvalid = 0; + public const string IVRSystem_Version = "IVRSystem_016"; + public const string IVRExtendedDisplay_Version = "IVRExtendedDisplay_001"; + public const string IVRTrackedCamera_Version = "IVRTrackedCamera_003"; + public const uint k_unMaxApplicationKeyLength = 128; + public const string k_pch_MimeType_HomeApp = "vr/home"; + public const string k_pch_MimeType_GameTheater = "vr/game_theater"; + public const string IVRApplications_Version = "IVRApplications_006"; + public const string IVRChaperone_Version = "IVRChaperone_003"; + public const string IVRChaperoneSetup_Version = "IVRChaperoneSetup_005"; + public const string IVRCompositor_Version = "IVRCompositor_020"; + public const uint k_unVROverlayMaxKeyLength = 128; + public const uint k_unVROverlayMaxNameLength = 128; + public const uint k_unMaxOverlayCount = 64; + public const uint k_unMaxOverlayIntersectionMaskPrimitivesCount = 32; + public const string IVROverlay_Version = "IVROverlay_016"; + public const string k_pch_Controller_Component_GDC2015 = "gdc2015"; + public const string k_pch_Controller_Component_Base = "base"; + public const string k_pch_Controller_Component_Tip = "tip"; + public const string k_pch_Controller_Component_HandGrip = "handgrip"; + public const string k_pch_Controller_Component_Status = "status"; + public const string IVRRenderModels_Version = "IVRRenderModels_005"; + public const uint k_unNotificationTextMaxSize = 256; + public const string IVRNotifications_Version = "IVRNotifications_002"; + public const uint k_unMaxSettingsKeyLength = 128; + public const string IVRSettings_Version = "IVRSettings_002"; + public const string k_pch_SteamVR_Section = "steamvr"; + public const string k_pch_SteamVR_RequireHmd_String = "requireHmd"; + public const string k_pch_SteamVR_ForcedDriverKey_String = "forcedDriver"; + public const string k_pch_SteamVR_ForcedHmdKey_String = "forcedHmd"; + public const string k_pch_SteamVR_DisplayDebug_Bool = "displayDebug"; + public const string k_pch_SteamVR_DebugProcessPipe_String = "debugProcessPipe"; + public const string k_pch_SteamVR_DisplayDebugX_Int32 = "displayDebugX"; + public const string k_pch_SteamVR_DisplayDebugY_Int32 = "displayDebugY"; + public const string k_pch_SteamVR_SendSystemButtonToAllApps_Bool = "sendSystemButtonToAllApps"; + public const string k_pch_SteamVR_LogLevel_Int32 = "loglevel"; + public const string k_pch_SteamVR_IPD_Float = "ipd"; + public const string k_pch_SteamVR_Background_String = "background"; + public const string k_pch_SteamVR_BackgroundUseDomeProjection_Bool = "backgroundUseDomeProjection"; + public const string k_pch_SteamVR_BackgroundCameraHeight_Float = "backgroundCameraHeight"; + public const string k_pch_SteamVR_BackgroundDomeRadius_Float = "backgroundDomeRadius"; + public const string k_pch_SteamVR_GridColor_String = "gridColor"; + public const string k_pch_SteamVR_PlayAreaColor_String = "playAreaColor"; + public const string k_pch_SteamVR_ShowStage_Bool = "showStage"; + public const string k_pch_SteamVR_ActivateMultipleDrivers_Bool = "activateMultipleDrivers"; + public const string k_pch_SteamVR_DirectMode_Bool = "directMode"; + public const string k_pch_SteamVR_DirectModeEdidVid_Int32 = "directModeEdidVid"; + public const string k_pch_SteamVR_DirectModeEdidPid_Int32 = "directModeEdidPid"; + public const string k_pch_SteamVR_UsingSpeakers_Bool = "usingSpeakers"; + public const string k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float = "speakersForwardYawOffsetDegrees"; + public const string k_pch_SteamVR_BaseStationPowerManagement_Bool = "basestationPowerManagement"; + public const string k_pch_SteamVR_NeverKillProcesses_Bool = "neverKillProcesses"; + public const string k_pch_SteamVR_SupersampleScale_Float = "supersampleScale"; + public const string k_pch_SteamVR_AllowAsyncReprojection_Bool = "allowAsyncReprojection"; + public const string k_pch_SteamVR_AllowReprojection_Bool = "allowInterleavedReprojection"; + public const string k_pch_SteamVR_ForceReprojection_Bool = "forceReprojection"; + public const string k_pch_SteamVR_ForceFadeOnBadTracking_Bool = "forceFadeOnBadTracking"; + public const string k_pch_SteamVR_DefaultMirrorView_Int32 = "defaultMirrorView"; + public const string k_pch_SteamVR_ShowMirrorView_Bool = "showMirrorView"; + public const string k_pch_SteamVR_MirrorViewGeometry_String = "mirrorViewGeometry"; + public const string k_pch_SteamVR_StartMonitorFromAppLaunch = "startMonitorFromAppLaunch"; + public const string k_pch_SteamVR_StartCompositorFromAppLaunch_Bool = "startCompositorFromAppLaunch"; + public const string k_pch_SteamVR_StartDashboardFromAppLaunch_Bool = "startDashboardFromAppLaunch"; + public const string k_pch_SteamVR_StartOverlayAppsFromDashboard_Bool = "startOverlayAppsFromDashboard"; + public const string k_pch_SteamVR_EnableHomeApp = "enableHomeApp"; + public const string k_pch_SteamVR_CycleBackgroundImageTimeSec_Int32 = "CycleBackgroundImageTimeSec"; + public const string k_pch_SteamVR_RetailDemo_Bool = "retailDemo"; + public const string k_pch_SteamVR_IpdOffset_Float = "ipdOffset"; + public const string k_pch_SteamVR_AllowSupersampleFiltering_Bool = "allowSupersampleFiltering"; + public const string k_pch_Lighthouse_Section = "driver_lighthouse"; + public const string k_pch_Lighthouse_DisableIMU_Bool = "disableimu"; + public const string k_pch_Lighthouse_UseDisambiguation_String = "usedisambiguation"; + public const string k_pch_Lighthouse_DisambiguationDebug_Int32 = "disambiguationdebug"; + public const string k_pch_Lighthouse_PrimaryBasestation_Int32 = "primarybasestation"; + public const string k_pch_Lighthouse_DBHistory_Bool = "dbhistory"; + public const string k_pch_Null_Section = "driver_null"; + public const string k_pch_Null_SerialNumber_String = "serialNumber"; + public const string k_pch_Null_ModelNumber_String = "modelNumber"; + public const string k_pch_Null_WindowX_Int32 = "windowX"; + public const string k_pch_Null_WindowY_Int32 = "windowY"; + public const string k_pch_Null_WindowWidth_Int32 = "windowWidth"; + public const string k_pch_Null_WindowHeight_Int32 = "windowHeight"; + public const string k_pch_Null_RenderWidth_Int32 = "renderWidth"; + public const string k_pch_Null_RenderHeight_Int32 = "renderHeight"; + public const string k_pch_Null_SecondsFromVsyncToPhotons_Float = "secondsFromVsyncToPhotons"; + public const string k_pch_Null_DisplayFrequency_Float = "displayFrequency"; + public const string k_pch_UserInterface_Section = "userinterface"; + public const string k_pch_UserInterface_StatusAlwaysOnTop_Bool = "StatusAlwaysOnTop"; + public const string k_pch_UserInterface_MinimizeToTray_Bool = "MinimizeToTray"; + public const string k_pch_UserInterface_Screenshots_Bool = "screenshots"; + public const string k_pch_UserInterface_ScreenshotType_Int = "screenshotType"; + public const string k_pch_Notifications_Section = "notifications"; + public const string k_pch_Notifications_DoNotDisturb_Bool = "DoNotDisturb"; + public const string k_pch_Keyboard_Section = "keyboard"; + public const string k_pch_Keyboard_TutorialCompletions = "TutorialCompletions"; + public const string k_pch_Keyboard_ScaleX = "ScaleX"; + public const string k_pch_Keyboard_ScaleY = "ScaleY"; + public const string k_pch_Keyboard_OffsetLeftX = "OffsetLeftX"; + public const string k_pch_Keyboard_OffsetRightX = "OffsetRightX"; + public const string k_pch_Keyboard_OffsetY = "OffsetY"; + public const string k_pch_Keyboard_Smoothing = "Smoothing"; + public const string k_pch_Perf_Section = "perfcheck"; + public const string k_pch_Perf_HeuristicActive_Bool = "heuristicActive"; + public const string k_pch_Perf_NotifyInHMD_Bool = "warnInHMD"; + public const string k_pch_Perf_NotifyOnlyOnce_Bool = "warnOnlyOnce"; + public const string k_pch_Perf_AllowTimingStore_Bool = "allowTimingStore"; + public const string k_pch_Perf_SaveTimingsOnExit_Bool = "saveTimingsOnExit"; + public const string k_pch_Perf_TestData_Float = "perfTestData"; + public const string k_pch_Perf_LinuxGPUProfiling_Bool = "linuxGPUProfiling"; + public const string k_pch_CollisionBounds_Section = "collisionBounds"; + public const string k_pch_CollisionBounds_Style_Int32 = "CollisionBoundsStyle"; + public const string k_pch_CollisionBounds_GroundPerimeterOn_Bool = "CollisionBoundsGroundPerimeterOn"; + public const string k_pch_CollisionBounds_CenterMarkerOn_Bool = "CollisionBoundsCenterMarkerOn"; + public const string k_pch_CollisionBounds_PlaySpaceOn_Bool = "CollisionBoundsPlaySpaceOn"; + public const string k_pch_CollisionBounds_FadeDistance_Float = "CollisionBoundsFadeDistance"; + public const string k_pch_CollisionBounds_ColorGammaR_Int32 = "CollisionBoundsColorGammaR"; + public const string k_pch_CollisionBounds_ColorGammaG_Int32 = "CollisionBoundsColorGammaG"; + public const string k_pch_CollisionBounds_ColorGammaB_Int32 = "CollisionBoundsColorGammaB"; + public const string k_pch_CollisionBounds_ColorGammaA_Int32 = "CollisionBoundsColorGammaA"; + public const string k_pch_Camera_Section = "camera"; + public const string k_pch_Camera_EnableCamera_Bool = "enableCamera"; + public const string k_pch_Camera_EnableCameraInDashboard_Bool = "enableCameraInDashboard"; + public const string k_pch_Camera_EnableCameraForCollisionBounds_Bool = "enableCameraForCollisionBounds"; + public const string k_pch_Camera_EnableCameraForRoomView_Bool = "enableCameraForRoomView"; + public const string k_pch_Camera_BoundsColorGammaR_Int32 = "cameraBoundsColorGammaR"; + public const string k_pch_Camera_BoundsColorGammaG_Int32 = "cameraBoundsColorGammaG"; + public const string k_pch_Camera_BoundsColorGammaB_Int32 = "cameraBoundsColorGammaB"; + public const string k_pch_Camera_BoundsColorGammaA_Int32 = "cameraBoundsColorGammaA"; + public const string k_pch_Camera_BoundsStrength_Int32 = "cameraBoundsStrength"; + public const string k_pch_audio_Section = "audio"; + public const string k_pch_audio_OnPlaybackDevice_String = "onPlaybackDevice"; + public const string k_pch_audio_OnRecordDevice_String = "onRecordDevice"; + public const string k_pch_audio_OnPlaybackMirrorDevice_String = "onPlaybackMirrorDevice"; + public const string k_pch_audio_OffPlaybackDevice_String = "offPlaybackDevice"; + public const string k_pch_audio_OffRecordDevice_String = "offRecordDevice"; + public const string k_pch_audio_VIVEHDMIGain = "viveHDMIGain"; + public const string k_pch_Power_Section = "power"; + public const string k_pch_Power_PowerOffOnExit_Bool = "powerOffOnExit"; + public const string k_pch_Power_TurnOffScreensTimeout_Float = "turnOffScreensTimeout"; + public const string k_pch_Power_TurnOffControllersTimeout_Float = "turnOffControllersTimeout"; + public const string k_pch_Power_ReturnToWatchdogTimeout_Float = "returnToWatchdogTimeout"; + public const string k_pch_Power_AutoLaunchSteamVROnButtonPress = "autoLaunchSteamVROnButtonPress"; + public const string k_pch_Dashboard_Section = "dashboard"; + public const string k_pch_Dashboard_EnableDashboard_Bool = "enableDashboard"; + public const string k_pch_Dashboard_ArcadeMode_Bool = "arcadeMode"; + public const string k_pch_modelskin_Section = "modelskins"; + public const string k_pch_Driver_Enable_Bool = "enable"; + public const string IVRScreenshots_Version = "IVRScreenshots_001"; + public const string IVRResources_Version = "IVRResources_001"; + public const string IVRDriverManager_Version = "IVRDriverManager_001"; + + static uint VRToken { get; set; } + + const string FnTable_Prefix = "FnTable:"; + + class COpenVRContext + { + public COpenVRContext() { Clear(); } + + public void Clear() + { + m_pVRSystem = null; + m_pVRChaperone = null; + m_pVRChaperoneSetup = null; + m_pVRCompositor = null; + m_pVROverlay = null; + m_pVRRenderModels = null; + m_pVRExtendedDisplay = null; + m_pVRSettings = null; + m_pVRApplications = null; + m_pVRScreenshots = null; + m_pVRTrackedCamera = null; + } + + void CheckClear() + { + if (VRToken != GetInitToken()) + { + Clear(); + VRToken = GetInitToken(); + } + } + + public CVRSystem VRSystem() + { + CheckClear(); + if (m_pVRSystem == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRSystem_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRSystem = new CVRSystem(pInterface); + } + return m_pVRSystem; + } + + public CVRChaperone VRChaperone() + { + CheckClear(); + if (m_pVRChaperone == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRChaperone_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRChaperone = new CVRChaperone(pInterface); + } + return m_pVRChaperone; + } + + public CVRChaperoneSetup VRChaperoneSetup() + { + CheckClear(); + if (m_pVRChaperoneSetup == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRChaperoneSetup_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRChaperoneSetup = new CVRChaperoneSetup(pInterface); + } + return m_pVRChaperoneSetup; + } + + public CVRCompositor VRCompositor() + { + CheckClear(); + if (m_pVRCompositor == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRCompositor_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRCompositor = new CVRCompositor(pInterface); + } + return m_pVRCompositor; + } + + public CVROverlay VROverlay() + { + CheckClear(); + if (m_pVROverlay == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVROverlay_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVROverlay = new CVROverlay(pInterface); + } + return m_pVROverlay; + } + + public CVRRenderModels VRRenderModels() + { + CheckClear(); + if (m_pVRRenderModels == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRRenderModels_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRRenderModels = new CVRRenderModels(pInterface); + } + return m_pVRRenderModels; + } + + public CVRExtendedDisplay VRExtendedDisplay() + { + CheckClear(); + if (m_pVRExtendedDisplay == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRExtendedDisplay_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRExtendedDisplay = new CVRExtendedDisplay(pInterface); + } + return m_pVRExtendedDisplay; + } + + public CVRSettings VRSettings() + { + CheckClear(); + if (m_pVRSettings == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRSettings_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRSettings = new CVRSettings(pInterface); + } + return m_pVRSettings; + } + + public CVRApplications VRApplications() + { + CheckClear(); + if (m_pVRApplications == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRApplications_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRApplications = new CVRApplications(pInterface); + } + return m_pVRApplications; + } + + public CVRScreenshots VRScreenshots() + { + CheckClear(); + if (m_pVRScreenshots == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRScreenshots_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRScreenshots = new CVRScreenshots(pInterface); + } + return m_pVRScreenshots; + } + + public CVRTrackedCamera VRTrackedCamera() + { + CheckClear(); + if (m_pVRTrackedCamera == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRTrackedCamera_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRTrackedCamera = new CVRTrackedCamera(pInterface); + } + return m_pVRTrackedCamera; + } + + private CVRSystem m_pVRSystem; + private CVRChaperone m_pVRChaperone; + private CVRChaperoneSetup m_pVRChaperoneSetup; + private CVRCompositor m_pVRCompositor; + private CVROverlay m_pVROverlay; + private CVRRenderModels m_pVRRenderModels; + private CVRExtendedDisplay m_pVRExtendedDisplay; + private CVRSettings m_pVRSettings; + private CVRApplications m_pVRApplications; + private CVRScreenshots m_pVRScreenshots; + private CVRTrackedCamera m_pVRTrackedCamera; + }; + + private static COpenVRContext _OpenVRInternal_ModuleContext = null; + static COpenVRContext OpenVRInternal_ModuleContext + { + get + { + if (_OpenVRInternal_ModuleContext == null) + _OpenVRInternal_ModuleContext = new COpenVRContext(); + return _OpenVRInternal_ModuleContext; + } + } + + public static CVRSystem System { get { return OpenVRInternal_ModuleContext.VRSystem(); } } + public static CVRChaperone Chaperone { get { return OpenVRInternal_ModuleContext.VRChaperone(); } } + public static CVRChaperoneSetup ChaperoneSetup { get { return OpenVRInternal_ModuleContext.VRChaperoneSetup(); } } + public static CVRCompositor Compositor { get { return OpenVRInternal_ModuleContext.VRCompositor(); } } + public static CVROverlay Overlay { get { return OpenVRInternal_ModuleContext.VROverlay(); } } + public static CVRRenderModels RenderModels { get { return OpenVRInternal_ModuleContext.VRRenderModels(); } } + public static CVRExtendedDisplay ExtendedDisplay { get { return OpenVRInternal_ModuleContext.VRExtendedDisplay(); } } + public static CVRSettings Settings { get { return OpenVRInternal_ModuleContext.VRSettings(); } } + public static CVRApplications Applications { get { return OpenVRInternal_ModuleContext.VRApplications(); } } + public static CVRScreenshots Screenshots { get { return OpenVRInternal_ModuleContext.VRScreenshots(); } } + public static CVRTrackedCamera TrackedCamera { get { return OpenVRInternal_ModuleContext.VRTrackedCamera(); } } + + /** Finds the active installation of vrclient.dll and initializes it */ + public static CVRSystem Init(ref EVRInitError peError, EVRApplicationType eApplicationType = EVRApplicationType.VRApplication_Scene) + { + VRToken = InitInternal(ref peError, eApplicationType); + OpenVRInternal_ModuleContext.Clear(); + + if (peError != EVRInitError.None) + return null; + + bool bInterfaceValid = IsInterfaceVersionValid(IVRSystem_Version); + if (!bInterfaceValid) + { + ShutdownInternal(); + peError = EVRInitError.Init_InterfaceNotFound; + return null; + } + + return OpenVR.System; + } + + /** unloads vrclient.dll. Any interface pointers from the interface are + * invalid after this point */ + public static void Shutdown() + { + ShutdownInternal(); + } + +} + + + +} + diff --git a/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_api.json b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_api.json new file mode 100644 index 000000000..bd76ded9f --- /dev/null +++ b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_api.json @@ -0,0 +1,3887 @@ +{"typedefs":[{"typedef": "vr::glSharedTextureHandle_t","type": "void *"} +,{"typedef": "vr::glInt_t","type": "int32_t"} +,{"typedef": "vr::glUInt_t","type": "uint32_t"} +,{"typedef": "vr::SharedTextureHandle_t","type": "uint64_t"} +,{"typedef": "vr::DriverId_t","type": "uint32_t"} +,{"typedef": "vr::TrackedDeviceIndex_t","type": "uint32_t"} +,{"typedef": "vr::PropertyContainerHandle_t","type": "uint64_t"} +,{"typedef": "vr::PropertyTypeTag_t","type": "uint32_t"} +,{"typedef": "vr::VREvent_Data_t","type": "union VREvent_Data_t"} +,{"typedef": "vr::VRControllerState_t","type": "struct vr::VRControllerState001_t"} +,{"typedef": "vr::VROverlayHandle_t","type": "uint64_t"} +,{"typedef": "vr::TrackedCameraHandle_t","type": "uint64_t"} +,{"typedef": "vr::ScreenshotHandle_t","type": "uint32_t"} +,{"typedef": "vr::VROverlayIntersectionMaskPrimitive_Data_t","type": "union VROverlayIntersectionMaskPrimitive_Data_t"} +,{"typedef": "vr::VRComponentProperties","type": "uint32_t"} +,{"typedef": "vr::TextureID_t","type": "int32_t"} +,{"typedef": "vr::VRNotificationId","type": "uint32_t"} +,{"typedef": "vr::HmdError","type": "enum vr::EVRInitError"} +,{"typedef": "vr::Hmd_Eye","type": "enum vr::EVREye"} +,{"typedef": "vr::ColorSpace","type": "enum vr::EColorSpace"} +,{"typedef": "vr::HmdTrackingResult","type": "enum vr::ETrackingResult"} +,{"typedef": "vr::TrackedDeviceClass","type": "enum vr::ETrackedDeviceClass"} +,{"typedef": "vr::TrackingUniverseOrigin","type": "enum vr::ETrackingUniverseOrigin"} +,{"typedef": "vr::TrackedDeviceProperty","type": "enum vr::ETrackedDeviceProperty"} +,{"typedef": "vr::TrackedPropertyError","type": "enum vr::ETrackedPropertyError"} +,{"typedef": "vr::VRSubmitFlags_t","type": "enum vr::EVRSubmitFlags"} +,{"typedef": "vr::VRState_t","type": "enum vr::EVRState"} +,{"typedef": "vr::CollisionBoundsStyle_t","type": "enum vr::ECollisionBoundsStyle"} +,{"typedef": "vr::VROverlayError","type": "enum vr::EVROverlayError"} +,{"typedef": "vr::VRFirmwareError","type": "enum vr::EVRFirmwareError"} +,{"typedef": "vr::VRCompositorError","type": "enum vr::EVRCompositorError"} +,{"typedef": "vr::VRScreenshotsError","type": "enum vr::EVRScreenshotError"} +], +"enums":[ + {"enumname": "vr::EVREye","values": [ + {"name": "Eye_Left","value": "0"} + ,{"name": "Eye_Right","value": "1"} +]} +, {"enumname": "vr::ETextureType","values": [ + {"name": "TextureType_DirectX","value": "0"} + ,{"name": "TextureType_OpenGL","value": "1"} + ,{"name": "TextureType_Vulkan","value": "2"} + ,{"name": "TextureType_IOSurface","value": "3"} + ,{"name": "TextureType_DirectX12","value": "4"} +]} +, {"enumname": "vr::EColorSpace","values": [ + {"name": "ColorSpace_Auto","value": "0"} + ,{"name": "ColorSpace_Gamma","value": "1"} + ,{"name": "ColorSpace_Linear","value": "2"} +]} +, {"enumname": "vr::ETrackingResult","values": [ + {"name": "TrackingResult_Uninitialized","value": "1"} + ,{"name": "TrackingResult_Calibrating_InProgress","value": "100"} + ,{"name": "TrackingResult_Calibrating_OutOfRange","value": "101"} + ,{"name": "TrackingResult_Running_OK","value": "200"} + ,{"name": "TrackingResult_Running_OutOfRange","value": "201"} +]} +, {"enumname": "vr::ETrackedDeviceClass","values": [ + {"name": "TrackedDeviceClass_Invalid","value": "0"} + ,{"name": "TrackedDeviceClass_HMD","value": "1"} + ,{"name": "TrackedDeviceClass_Controller","value": "2"} + ,{"name": "TrackedDeviceClass_GenericTracker","value": "3"} + ,{"name": "TrackedDeviceClass_TrackingReference","value": "4"} + ,{"name": "TrackedDeviceClass_DisplayRedirect","value": "5"} +]} +, {"enumname": "vr::ETrackedControllerRole","values": [ + {"name": "TrackedControllerRole_Invalid","value": "0"} + ,{"name": "TrackedControllerRole_LeftHand","value": "1"} + ,{"name": "TrackedControllerRole_RightHand","value": "2"} +]} +, {"enumname": "vr::ETrackingUniverseOrigin","values": [ + {"name": "TrackingUniverseSeated","value": "0"} + ,{"name": "TrackingUniverseStanding","value": "1"} + ,{"name": "TrackingUniverseRawAndUncalibrated","value": "2"} +]} +, {"enumname": "vr::ETrackedDeviceProperty","values": [ + {"name": "Prop_Invalid","value": "0"} + ,{"name": "Prop_TrackingSystemName_String","value": "1000"} + ,{"name": "Prop_ModelNumber_String","value": "1001"} + ,{"name": "Prop_SerialNumber_String","value": "1002"} + ,{"name": "Prop_RenderModelName_String","value": "1003"} + ,{"name": "Prop_WillDriftInYaw_Bool","value": "1004"} + ,{"name": "Prop_ManufacturerName_String","value": "1005"} + ,{"name": "Prop_TrackingFirmwareVersion_String","value": "1006"} + ,{"name": "Prop_HardwareRevision_String","value": "1007"} + ,{"name": "Prop_AllWirelessDongleDescriptions_String","value": "1008"} + ,{"name": "Prop_ConnectedWirelessDongle_String","value": "1009"} + ,{"name": "Prop_DeviceIsWireless_Bool","value": "1010"} + ,{"name": "Prop_DeviceIsCharging_Bool","value": "1011"} + ,{"name": "Prop_DeviceBatteryPercentage_Float","value": "1012"} + ,{"name": "Prop_StatusDisplayTransform_Matrix34","value": "1013"} + ,{"name": "Prop_Firmware_UpdateAvailable_Bool","value": "1014"} + ,{"name": "Prop_Firmware_ManualUpdate_Bool","value": "1015"} + ,{"name": "Prop_Firmware_ManualUpdateURL_String","value": "1016"} + ,{"name": "Prop_HardwareRevision_Uint64","value": "1017"} + ,{"name": "Prop_FirmwareVersion_Uint64","value": "1018"} + ,{"name": "Prop_FPGAVersion_Uint64","value": "1019"} + ,{"name": "Prop_VRCVersion_Uint64","value": "1020"} + ,{"name": "Prop_RadioVersion_Uint64","value": "1021"} + ,{"name": "Prop_DongleVersion_Uint64","value": "1022"} + ,{"name": "Prop_BlockServerShutdown_Bool","value": "1023"} + ,{"name": "Prop_CanUnifyCoordinateSystemWithHmd_Bool","value": "1024"} + ,{"name": "Prop_ContainsProximitySensor_Bool","value": "1025"} + ,{"name": "Prop_DeviceProvidesBatteryStatus_Bool","value": "1026"} + ,{"name": "Prop_DeviceCanPowerOff_Bool","value": "1027"} + ,{"name": "Prop_Firmware_ProgrammingTarget_String","value": "1028"} + ,{"name": "Prop_DeviceClass_Int32","value": "1029"} + ,{"name": "Prop_HasCamera_Bool","value": "1030"} + ,{"name": "Prop_DriverVersion_String","value": "1031"} + ,{"name": "Prop_Firmware_ForceUpdateRequired_Bool","value": "1032"} + ,{"name": "Prop_ViveSystemButtonFixRequired_Bool","value": "1033"} + ,{"name": "Prop_ParentDriver_Uint64","value": "1034"} + ,{"name": "Prop_ResourceRoot_String","value": "1035"} + ,{"name": "Prop_ReportsTimeSinceVSync_Bool","value": "2000"} + ,{"name": "Prop_SecondsFromVsyncToPhotons_Float","value": "2001"} + ,{"name": "Prop_DisplayFrequency_Float","value": "2002"} + ,{"name": "Prop_UserIpdMeters_Float","value": "2003"} + ,{"name": "Prop_CurrentUniverseId_Uint64","value": "2004"} + ,{"name": "Prop_PreviousUniverseId_Uint64","value": "2005"} + ,{"name": "Prop_DisplayFirmwareVersion_Uint64","value": "2006"} + ,{"name": "Prop_IsOnDesktop_Bool","value": "2007"} + ,{"name": "Prop_DisplayMCType_Int32","value": "2008"} + ,{"name": "Prop_DisplayMCOffset_Float","value": "2009"} + ,{"name": "Prop_DisplayMCScale_Float","value": "2010"} + ,{"name": "Prop_EdidVendorID_Int32","value": "2011"} + ,{"name": "Prop_DisplayMCImageLeft_String","value": "2012"} + ,{"name": "Prop_DisplayMCImageRight_String","value": "2013"} + ,{"name": "Prop_DisplayGCBlackClamp_Float","value": "2014"} + ,{"name": "Prop_EdidProductID_Int32","value": "2015"} + ,{"name": "Prop_CameraToHeadTransform_Matrix34","value": "2016"} + ,{"name": "Prop_DisplayGCType_Int32","value": "2017"} + ,{"name": "Prop_DisplayGCOffset_Float","value": "2018"} + ,{"name": "Prop_DisplayGCScale_Float","value": "2019"} + ,{"name": "Prop_DisplayGCPrescale_Float","value": "2020"} + ,{"name": "Prop_DisplayGCImage_String","value": "2021"} + ,{"name": "Prop_LensCenterLeftU_Float","value": "2022"} + ,{"name": "Prop_LensCenterLeftV_Float","value": "2023"} + ,{"name": "Prop_LensCenterRightU_Float","value": "2024"} + ,{"name": "Prop_LensCenterRightV_Float","value": "2025"} + ,{"name": "Prop_UserHeadToEyeDepthMeters_Float","value": "2026"} + ,{"name": "Prop_CameraFirmwareVersion_Uint64","value": "2027"} + ,{"name": "Prop_CameraFirmwareDescription_String","value": "2028"} + ,{"name": "Prop_DisplayFPGAVersion_Uint64","value": "2029"} + ,{"name": "Prop_DisplayBootloaderVersion_Uint64","value": "2030"} + ,{"name": "Prop_DisplayHardwareVersion_Uint64","value": "2031"} + ,{"name": "Prop_AudioFirmwareVersion_Uint64","value": "2032"} + ,{"name": "Prop_CameraCompatibilityMode_Int32","value": "2033"} + ,{"name": "Prop_ScreenshotHorizontalFieldOfViewDegrees_Float","value": "2034"} + ,{"name": "Prop_ScreenshotVerticalFieldOfViewDegrees_Float","value": "2035"} + ,{"name": "Prop_DisplaySuppressed_Bool","value": "2036"} + ,{"name": "Prop_DisplayAllowNightMode_Bool","value": "2037"} + ,{"name": "Prop_DisplayMCImageWidth_Int32","value": "2038"} + ,{"name": "Prop_DisplayMCImageHeight_Int32","value": "2039"} + ,{"name": "Prop_DisplayMCImageNumChannels_Int32","value": "2040"} + ,{"name": "Prop_DisplayMCImageData_Binary","value": "2041"} + ,{"name": "Prop_SecondsFromPhotonsToVblank_Float","value": "2042"} + ,{"name": "Prop_DriverDirectModeSendsVsyncEvents_Bool","value": "2043"} + ,{"name": "Prop_DisplayDebugMode_Bool","value": "2044"} + ,{"name": "Prop_GraphicsAdapterLuid_Uint64","value": "2045"} + ,{"name": "Prop_AttachedDeviceId_String","value": "3000"} + ,{"name": "Prop_SupportedButtons_Uint64","value": "3001"} + ,{"name": "Prop_Axis0Type_Int32","value": "3002"} + ,{"name": "Prop_Axis1Type_Int32","value": "3003"} + ,{"name": "Prop_Axis2Type_Int32","value": "3004"} + ,{"name": "Prop_Axis3Type_Int32","value": "3005"} + ,{"name": "Prop_Axis4Type_Int32","value": "3006"} + ,{"name": "Prop_ControllerRoleHint_Int32","value": "3007"} + ,{"name": "Prop_FieldOfViewLeftDegrees_Float","value": "4000"} + ,{"name": "Prop_FieldOfViewRightDegrees_Float","value": "4001"} + ,{"name": "Prop_FieldOfViewTopDegrees_Float","value": "4002"} + ,{"name": "Prop_FieldOfViewBottomDegrees_Float","value": "4003"} + ,{"name": "Prop_TrackingRangeMinimumMeters_Float","value": "4004"} + ,{"name": "Prop_TrackingRangeMaximumMeters_Float","value": "4005"} + ,{"name": "Prop_ModeLabel_String","value": "4006"} + ,{"name": "Prop_IconPathName_String","value": "5000"} + ,{"name": "Prop_NamedIconPathDeviceOff_String","value": "5001"} + ,{"name": "Prop_NamedIconPathDeviceSearching_String","value": "5002"} + ,{"name": "Prop_NamedIconPathDeviceSearchingAlert_String","value": "5003"} + ,{"name": "Prop_NamedIconPathDeviceReady_String","value": "5004"} + ,{"name": "Prop_NamedIconPathDeviceReadyAlert_String","value": "5005"} + ,{"name": "Prop_NamedIconPathDeviceNotReady_String","value": "5006"} + ,{"name": "Prop_NamedIconPathDeviceStandby_String","value": "5007"} + ,{"name": "Prop_NamedIconPathDeviceAlertLow_String","value": "5008"} + ,{"name": "Prop_DisplayHiddenArea_Binary_Start","value": "5100"} + ,{"name": "Prop_DisplayHiddenArea_Binary_End","value": "5150"} + ,{"name": "Prop_UserConfigPath_String","value": "6000"} + ,{"name": "Prop_InstallPath_String","value": "6001"} + ,{"name": "Prop_HasDisplayComponent_Bool","value": "6002"} + ,{"name": "Prop_HasControllerComponent_Bool","value": "6003"} + ,{"name": "Prop_HasCameraComponent_Bool","value": "6004"} + ,{"name": "Prop_HasDriverDirectModeComponent_Bool","value": "6005"} + ,{"name": "Prop_HasVirtualDisplayComponent_Bool","value": "6006"} + ,{"name": "Prop_VendorSpecific_Reserved_Start","value": "10000"} + ,{"name": "Prop_VendorSpecific_Reserved_End","value": "10999"} +]} +, {"enumname": "vr::ETrackedPropertyError","values": [ + {"name": "TrackedProp_Success","value": "0"} + ,{"name": "TrackedProp_WrongDataType","value": "1"} + ,{"name": "TrackedProp_WrongDeviceClass","value": "2"} + ,{"name": "TrackedProp_BufferTooSmall","value": "3"} + ,{"name": "TrackedProp_UnknownProperty","value": "4"} + ,{"name": "TrackedProp_InvalidDevice","value": "5"} + ,{"name": "TrackedProp_CouldNotContactServer","value": "6"} + ,{"name": "TrackedProp_ValueNotProvidedByDevice","value": "7"} + ,{"name": "TrackedProp_StringExceedsMaximumLength","value": "8"} + ,{"name": "TrackedProp_NotYetAvailable","value": "9"} + ,{"name": "TrackedProp_PermissionDenied","value": "10"} + ,{"name": "TrackedProp_InvalidOperation","value": "11"} +]} +, {"enumname": "vr::EVRSubmitFlags","values": [ + {"name": "Submit_Default","value": "0"} + ,{"name": "Submit_LensDistortionAlreadyApplied","value": "1"} + ,{"name": "Submit_GlRenderBuffer","value": "2"} + ,{"name": "Submit_Reserved","value": "4"} +]} +, {"enumname": "vr::EVRState","values": [ + {"name": "VRState_Undefined","value": "-1"} + ,{"name": "VRState_Off","value": "0"} + ,{"name": "VRState_Searching","value": "1"} + ,{"name": "VRState_Searching_Alert","value": "2"} + ,{"name": "VRState_Ready","value": "3"} + ,{"name": "VRState_Ready_Alert","value": "4"} + ,{"name": "VRState_NotReady","value": "5"} + ,{"name": "VRState_Standby","value": "6"} + ,{"name": "VRState_Ready_Alert_Low","value": "7"} +]} +, {"enumname": "vr::EVREventType","values": [ + {"name": "VREvent_None","value": "0"} + ,{"name": "VREvent_TrackedDeviceActivated","value": "100"} + ,{"name": "VREvent_TrackedDeviceDeactivated","value": "101"} + ,{"name": "VREvent_TrackedDeviceUpdated","value": "102"} + ,{"name": "VREvent_TrackedDeviceUserInteractionStarted","value": "103"} + ,{"name": "VREvent_TrackedDeviceUserInteractionEnded","value": "104"} + ,{"name": "VREvent_IpdChanged","value": "105"} + ,{"name": "VREvent_EnterStandbyMode","value": "106"} + ,{"name": "VREvent_LeaveStandbyMode","value": "107"} + ,{"name": "VREvent_TrackedDeviceRoleChanged","value": "108"} + ,{"name": "VREvent_WatchdogWakeUpRequested","value": "109"} + ,{"name": "VREvent_LensDistortionChanged","value": "110"} + ,{"name": "VREvent_PropertyChanged","value": "111"} + ,{"name": "VREvent_ButtonPress","value": "200"} + ,{"name": "VREvent_ButtonUnpress","value": "201"} + ,{"name": "VREvent_ButtonTouch","value": "202"} + ,{"name": "VREvent_ButtonUntouch","value": "203"} + ,{"name": "VREvent_MouseMove","value": "300"} + ,{"name": "VREvent_MouseButtonDown","value": "301"} + ,{"name": "VREvent_MouseButtonUp","value": "302"} + ,{"name": "VREvent_FocusEnter","value": "303"} + ,{"name": "VREvent_FocusLeave","value": "304"} + ,{"name": "VREvent_Scroll","value": "305"} + ,{"name": "VREvent_TouchPadMove","value": "306"} + ,{"name": "VREvent_OverlayFocusChanged","value": "307"} + ,{"name": "VREvent_InputFocusCaptured","value": "400"} + ,{"name": "VREvent_InputFocusReleased","value": "401"} + ,{"name": "VREvent_SceneFocusLost","value": "402"} + ,{"name": "VREvent_SceneFocusGained","value": "403"} + ,{"name": "VREvent_SceneApplicationChanged","value": "404"} + ,{"name": "VREvent_SceneFocusChanged","value": "405"} + ,{"name": "VREvent_InputFocusChanged","value": "406"} + ,{"name": "VREvent_SceneApplicationSecondaryRenderingStarted","value": "407"} + ,{"name": "VREvent_HideRenderModels","value": "410"} + ,{"name": "VREvent_ShowRenderModels","value": "411"} + ,{"name": "VREvent_OverlayShown","value": "500"} + ,{"name": "VREvent_OverlayHidden","value": "501"} + ,{"name": "VREvent_DashboardActivated","value": "502"} + ,{"name": "VREvent_DashboardDeactivated","value": "503"} + ,{"name": "VREvent_DashboardThumbSelected","value": "504"} + ,{"name": "VREvent_DashboardRequested","value": "505"} + ,{"name": "VREvent_ResetDashboard","value": "506"} + ,{"name": "VREvent_RenderToast","value": "507"} + ,{"name": "VREvent_ImageLoaded","value": "508"} + ,{"name": "VREvent_ShowKeyboard","value": "509"} + ,{"name": "VREvent_HideKeyboard","value": "510"} + ,{"name": "VREvent_OverlayGamepadFocusGained","value": "511"} + ,{"name": "VREvent_OverlayGamepadFocusLost","value": "512"} + ,{"name": "VREvent_OverlaySharedTextureChanged","value": "513"} + ,{"name": "VREvent_DashboardGuideButtonDown","value": "514"} + ,{"name": "VREvent_DashboardGuideButtonUp","value": "515"} + ,{"name": "VREvent_ScreenshotTriggered","value": "516"} + ,{"name": "VREvent_ImageFailed","value": "517"} + ,{"name": "VREvent_DashboardOverlayCreated","value": "518"} + ,{"name": "VREvent_RequestScreenshot","value": "520"} + ,{"name": "VREvent_ScreenshotTaken","value": "521"} + ,{"name": "VREvent_ScreenshotFailed","value": "522"} + ,{"name": "VREvent_SubmitScreenshotToDashboard","value": "523"} + ,{"name": "VREvent_ScreenshotProgressToDashboard","value": "524"} + ,{"name": "VREvent_PrimaryDashboardDeviceChanged","value": "525"} + ,{"name": "VREvent_Notification_Shown","value": "600"} + ,{"name": "VREvent_Notification_Hidden","value": "601"} + ,{"name": "VREvent_Notification_BeginInteraction","value": "602"} + ,{"name": "VREvent_Notification_Destroyed","value": "603"} + ,{"name": "VREvent_Quit","value": "700"} + ,{"name": "VREvent_ProcessQuit","value": "701"} + ,{"name": "VREvent_QuitAborted_UserPrompt","value": "702"} + ,{"name": "VREvent_QuitAcknowledged","value": "703"} + ,{"name": "VREvent_DriverRequestedQuit","value": "704"} + ,{"name": "VREvent_ChaperoneDataHasChanged","value": "800"} + ,{"name": "VREvent_ChaperoneUniverseHasChanged","value": "801"} + ,{"name": "VREvent_ChaperoneTempDataHasChanged","value": "802"} + ,{"name": "VREvent_ChaperoneSettingsHaveChanged","value": "803"} + ,{"name": "VREvent_SeatedZeroPoseReset","value": "804"} + ,{"name": "VREvent_AudioSettingsHaveChanged","value": "820"} + ,{"name": "VREvent_BackgroundSettingHasChanged","value": "850"} + ,{"name": "VREvent_CameraSettingsHaveChanged","value": "851"} + ,{"name": "VREvent_ReprojectionSettingHasChanged","value": "852"} + ,{"name": "VREvent_ModelSkinSettingsHaveChanged","value": "853"} + ,{"name": "VREvent_EnvironmentSettingsHaveChanged","value": "854"} + ,{"name": "VREvent_PowerSettingsHaveChanged","value": "855"} + ,{"name": "VREvent_EnableHomeAppSettingsHaveChanged","value": "856"} + ,{"name": "VREvent_StatusUpdate","value": "900"} + ,{"name": "VREvent_MCImageUpdated","value": "1000"} + ,{"name": "VREvent_FirmwareUpdateStarted","value": "1100"} + ,{"name": "VREvent_FirmwareUpdateFinished","value": "1101"} + ,{"name": "VREvent_KeyboardClosed","value": "1200"} + ,{"name": "VREvent_KeyboardCharInput","value": "1201"} + ,{"name": "VREvent_KeyboardDone","value": "1202"} + ,{"name": "VREvent_ApplicationTransitionStarted","value": "1300"} + ,{"name": "VREvent_ApplicationTransitionAborted","value": "1301"} + ,{"name": "VREvent_ApplicationTransitionNewAppStarted","value": "1302"} + ,{"name": "VREvent_ApplicationListUpdated","value": "1303"} + ,{"name": "VREvent_ApplicationMimeTypeLoad","value": "1304"} + ,{"name": "VREvent_ApplicationTransitionNewAppLaunchComplete","value": "1305"} + ,{"name": "VREvent_ProcessConnected","value": "1306"} + ,{"name": "VREvent_ProcessDisconnected","value": "1307"} + ,{"name": "VREvent_Compositor_MirrorWindowShown","value": "1400"} + ,{"name": "VREvent_Compositor_MirrorWindowHidden","value": "1401"} + ,{"name": "VREvent_Compositor_ChaperoneBoundsShown","value": "1410"} + ,{"name": "VREvent_Compositor_ChaperoneBoundsHidden","value": "1411"} + ,{"name": "VREvent_TrackedCamera_StartVideoStream","value": "1500"} + ,{"name": "VREvent_TrackedCamera_StopVideoStream","value": "1501"} + ,{"name": "VREvent_TrackedCamera_PauseVideoStream","value": "1502"} + ,{"name": "VREvent_TrackedCamera_ResumeVideoStream","value": "1503"} + ,{"name": "VREvent_TrackedCamera_EditingSurface","value": "1550"} + ,{"name": "VREvent_PerformanceTest_EnableCapture","value": "1600"} + ,{"name": "VREvent_PerformanceTest_DisableCapture","value": "1601"} + ,{"name": "VREvent_PerformanceTest_FidelityLevel","value": "1602"} + ,{"name": "VREvent_MessageOverlay_Closed","value": "1650"} + ,{"name": "VREvent_VendorSpecific_Reserved_Start","value": "10000"} + ,{"name": "VREvent_VendorSpecific_Reserved_End","value": "19999"} +]} +, {"enumname": "vr::EDeviceActivityLevel","values": [ + {"name": "k_EDeviceActivityLevel_Unknown","value": "-1"} + ,{"name": "k_EDeviceActivityLevel_Idle","value": "0"} + ,{"name": "k_EDeviceActivityLevel_UserInteraction","value": "1"} + ,{"name": "k_EDeviceActivityLevel_UserInteraction_Timeout","value": "2"} + ,{"name": "k_EDeviceActivityLevel_Standby","value": "3"} +]} +, {"enumname": "vr::EVRButtonId","values": [ + {"name": "k_EButton_System","value": "0"} + ,{"name": "k_EButton_ApplicationMenu","value": "1"} + ,{"name": "k_EButton_Grip","value": "2"} + ,{"name": "k_EButton_DPad_Left","value": "3"} + ,{"name": "k_EButton_DPad_Up","value": "4"} + ,{"name": "k_EButton_DPad_Right","value": "5"} + ,{"name": "k_EButton_DPad_Down","value": "6"} + ,{"name": "k_EButton_A","value": "7"} + ,{"name": "k_EButton_ProximitySensor","value": "31"} + ,{"name": "k_EButton_Axis0","value": "32"} + ,{"name": "k_EButton_Axis1","value": "33"} + ,{"name": "k_EButton_Axis2","value": "34"} + ,{"name": "k_EButton_Axis3","value": "35"} + ,{"name": "k_EButton_Axis4","value": "36"} + ,{"name": "k_EButton_SteamVR_Touchpad","value": "32"} + ,{"name": "k_EButton_SteamVR_Trigger","value": "33"} + ,{"name": "k_EButton_Dashboard_Back","value": "2"} + ,{"name": "k_EButton_Max","value": "64"} +]} +, {"enumname": "vr::EVRMouseButton","values": [ + {"name": "VRMouseButton_Left","value": "1"} + ,{"name": "VRMouseButton_Right","value": "2"} + ,{"name": "VRMouseButton_Middle","value": "4"} +]} +, {"enumname": "vr::EHiddenAreaMeshType","values": [ + {"name": "k_eHiddenAreaMesh_Standard","value": "0"} + ,{"name": "k_eHiddenAreaMesh_Inverse","value": "1"} + ,{"name": "k_eHiddenAreaMesh_LineLoop","value": "2"} + ,{"name": "k_eHiddenAreaMesh_Max","value": "3"} +]} +, {"enumname": "vr::EVRControllerAxisType","values": [ + {"name": "k_eControllerAxis_None","value": "0"} + ,{"name": "k_eControllerAxis_TrackPad","value": "1"} + ,{"name": "k_eControllerAxis_Joystick","value": "2"} + ,{"name": "k_eControllerAxis_Trigger","value": "3"} +]} +, {"enumname": "vr::EVRControllerEventOutputType","values": [ + {"name": "ControllerEventOutput_OSEvents","value": "0"} + ,{"name": "ControllerEventOutput_VREvents","value": "1"} +]} +, {"enumname": "vr::ECollisionBoundsStyle","values": [ + {"name": "COLLISION_BOUNDS_STYLE_BEGINNER","value": "0"} + ,{"name": "COLLISION_BOUNDS_STYLE_INTERMEDIATE","value": "1"} + ,{"name": "COLLISION_BOUNDS_STYLE_SQUARES","value": "2"} + ,{"name": "COLLISION_BOUNDS_STYLE_ADVANCED","value": "3"} + ,{"name": "COLLISION_BOUNDS_STYLE_NONE","value": "4"} + ,{"name": "COLLISION_BOUNDS_STYLE_COUNT","value": "5"} +]} +, {"enumname": "vr::EVROverlayError","values": [ + {"name": "VROverlayError_None","value": "0"} + ,{"name": "VROverlayError_UnknownOverlay","value": "10"} + ,{"name": "VROverlayError_InvalidHandle","value": "11"} + ,{"name": "VROverlayError_PermissionDenied","value": "12"} + ,{"name": "VROverlayError_OverlayLimitExceeded","value": "13"} + ,{"name": "VROverlayError_WrongVisibilityType","value": "14"} + ,{"name": "VROverlayError_KeyTooLong","value": "15"} + ,{"name": "VROverlayError_NameTooLong","value": "16"} + ,{"name": "VROverlayError_KeyInUse","value": "17"} + ,{"name": "VROverlayError_WrongTransformType","value": "18"} + ,{"name": "VROverlayError_InvalidTrackedDevice","value": "19"} + ,{"name": "VROverlayError_InvalidParameter","value": "20"} + ,{"name": "VROverlayError_ThumbnailCantBeDestroyed","value": "21"} + ,{"name": "VROverlayError_ArrayTooSmall","value": "22"} + ,{"name": "VROverlayError_RequestFailed","value": "23"} + ,{"name": "VROverlayError_InvalidTexture","value": "24"} + ,{"name": "VROverlayError_UnableToLoadFile","value": "25"} + ,{"name": "VROverlayError_KeyboardAlreadyInUse","value": "26"} + ,{"name": "VROverlayError_NoNeighbor","value": "27"} + ,{"name": "VROverlayError_TooManyMaskPrimitives","value": "29"} + ,{"name": "VROverlayError_BadMaskPrimitive","value": "30"} +]} +, {"enumname": "vr::EVRApplicationType","values": [ + {"name": "VRApplication_Other","value": "0"} + ,{"name": "VRApplication_Scene","value": "1"} + ,{"name": "VRApplication_Overlay","value": "2"} + ,{"name": "VRApplication_Background","value": "3"} + ,{"name": "VRApplication_Utility","value": "4"} + ,{"name": "VRApplication_VRMonitor","value": "5"} + ,{"name": "VRApplication_SteamWatchdog","value": "6"} + ,{"name": "VRApplication_Bootstrapper","value": "7"} + ,{"name": "VRApplication_Max","value": "8"} +]} +, {"enumname": "vr::EVRFirmwareError","values": [ + {"name": "VRFirmwareError_None","value": "0"} + ,{"name": "VRFirmwareError_Success","value": "1"} + ,{"name": "VRFirmwareError_Fail","value": "2"} +]} +, {"enumname": "vr::EVRNotificationError","values": [ + {"name": "VRNotificationError_OK","value": "0"} + ,{"name": "VRNotificationError_InvalidNotificationId","value": "100"} + ,{"name": "VRNotificationError_NotificationQueueFull","value": "101"} + ,{"name": "VRNotificationError_InvalidOverlayHandle","value": "102"} + ,{"name": "VRNotificationError_SystemWithUserValueAlreadyExists","value": "103"} +]} +, {"enumname": "vr::EVRInitError","values": [ + {"name": "VRInitError_None","value": "0"} + ,{"name": "VRInitError_Unknown","value": "1"} + ,{"name": "VRInitError_Init_InstallationNotFound","value": "100"} + ,{"name": "VRInitError_Init_InstallationCorrupt","value": "101"} + ,{"name": "VRInitError_Init_VRClientDLLNotFound","value": "102"} + ,{"name": "VRInitError_Init_FileNotFound","value": "103"} + ,{"name": "VRInitError_Init_FactoryNotFound","value": "104"} + ,{"name": "VRInitError_Init_InterfaceNotFound","value": "105"} + ,{"name": "VRInitError_Init_InvalidInterface","value": "106"} + ,{"name": "VRInitError_Init_UserConfigDirectoryInvalid","value": "107"} + ,{"name": "VRInitError_Init_HmdNotFound","value": "108"} + ,{"name": "VRInitError_Init_NotInitialized","value": "109"} + ,{"name": "VRInitError_Init_PathRegistryNotFound","value": "110"} + ,{"name": "VRInitError_Init_NoConfigPath","value": "111"} + ,{"name": "VRInitError_Init_NoLogPath","value": "112"} + ,{"name": "VRInitError_Init_PathRegistryNotWritable","value": "113"} + ,{"name": "VRInitError_Init_AppInfoInitFailed","value": "114"} + ,{"name": "VRInitError_Init_Retry","value": "115"} + ,{"name": "VRInitError_Init_InitCanceledByUser","value": "116"} + ,{"name": "VRInitError_Init_AnotherAppLaunching","value": "117"} + ,{"name": "VRInitError_Init_SettingsInitFailed","value": "118"} + ,{"name": "VRInitError_Init_ShuttingDown","value": "119"} + ,{"name": "VRInitError_Init_TooManyObjects","value": "120"} + ,{"name": "VRInitError_Init_NoServerForBackgroundApp","value": "121"} + ,{"name": "VRInitError_Init_NotSupportedWithCompositor","value": "122"} + ,{"name": "VRInitError_Init_NotAvailableToUtilityApps","value": "123"} + ,{"name": "VRInitError_Init_Internal","value": "124"} + ,{"name": "VRInitError_Init_HmdDriverIdIsNone","value": "125"} + ,{"name": "VRInitError_Init_HmdNotFoundPresenceFailed","value": "126"} + ,{"name": "VRInitError_Init_VRMonitorNotFound","value": "127"} + ,{"name": "VRInitError_Init_VRMonitorStartupFailed","value": "128"} + ,{"name": "VRInitError_Init_LowPowerWatchdogNotSupported","value": "129"} + ,{"name": "VRInitError_Init_InvalidApplicationType","value": "130"} + ,{"name": "VRInitError_Init_NotAvailableToWatchdogApps","value": "131"} + ,{"name": "VRInitError_Init_WatchdogDisabledInSettings","value": "132"} + ,{"name": "VRInitError_Init_VRDashboardNotFound","value": "133"} + ,{"name": "VRInitError_Init_VRDashboardStartupFailed","value": "134"} + ,{"name": "VRInitError_Init_VRHomeNotFound","value": "135"} + ,{"name": "VRInitError_Init_VRHomeStartupFailed","value": "136"} + ,{"name": "VRInitError_Driver_Failed","value": "200"} + ,{"name": "VRInitError_Driver_Unknown","value": "201"} + ,{"name": "VRInitError_Driver_HmdUnknown","value": "202"} + ,{"name": "VRInitError_Driver_NotLoaded","value": "203"} + ,{"name": "VRInitError_Driver_RuntimeOutOfDate","value": "204"} + ,{"name": "VRInitError_Driver_HmdInUse","value": "205"} + ,{"name": "VRInitError_Driver_NotCalibrated","value": "206"} + ,{"name": "VRInitError_Driver_CalibrationInvalid","value": "207"} + ,{"name": "VRInitError_Driver_HmdDisplayNotFound","value": "208"} + ,{"name": "VRInitError_Driver_TrackedDeviceInterfaceUnknown","value": "209"} + ,{"name": "VRInitError_Driver_HmdDriverIdOutOfBounds","value": "211"} + ,{"name": "VRInitError_Driver_HmdDisplayMirrored","value": "212"} + ,{"name": "VRInitError_IPC_ServerInitFailed","value": "300"} + ,{"name": "VRInitError_IPC_ConnectFailed","value": "301"} + ,{"name": "VRInitError_IPC_SharedStateInitFailed","value": "302"} + ,{"name": "VRInitError_IPC_CompositorInitFailed","value": "303"} + ,{"name": "VRInitError_IPC_MutexInitFailed","value": "304"} + ,{"name": "VRInitError_IPC_Failed","value": "305"} + ,{"name": "VRInitError_IPC_CompositorConnectFailed","value": "306"} + ,{"name": "VRInitError_IPC_CompositorInvalidConnectResponse","value": "307"} + ,{"name": "VRInitError_IPC_ConnectFailedAfterMultipleAttempts","value": "308"} + ,{"name": "VRInitError_Compositor_Failed","value": "400"} + ,{"name": "VRInitError_Compositor_D3D11HardwareRequired","value": "401"} + ,{"name": "VRInitError_Compositor_FirmwareRequiresUpdate","value": "402"} + ,{"name": "VRInitError_Compositor_OverlayInitFailed","value": "403"} + ,{"name": "VRInitError_Compositor_ScreenshotsInitFailed","value": "404"} + ,{"name": "VRInitError_Compositor_UnableToCreateDevice","value": "405"} + ,{"name": "VRInitError_VendorSpecific_UnableToConnectToOculusRuntime","value": "1000"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_CantOpenDevice","value": "1101"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_UnableToRequestConfigStart","value": "1102"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_NoStoredConfig","value": "1103"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_ConfigTooBig","value": "1104"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_ConfigTooSmall","value": "1105"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_UnableToInitZLib","value": "1106"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_CantReadFirmwareVersion","value": "1107"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_UnableToSendUserDataStart","value": "1108"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataStart","value": "1109"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataNext","value": "1110"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_UserDataAddressRange","value": "1111"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_UserDataError","value": "1112"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_ConfigFailedSanityCheck","value": "1113"} + ,{"name": "VRInitError_Steam_SteamInstallationNotFound","value": "2000"} +]} +, {"enumname": "vr::EVRScreenshotType","values": [ + {"name": "VRScreenshotType_None","value": "0"} + ,{"name": "VRScreenshotType_Mono","value": "1"} + ,{"name": "VRScreenshotType_Stereo","value": "2"} + ,{"name": "VRScreenshotType_Cubemap","value": "3"} + ,{"name": "VRScreenshotType_MonoPanorama","value": "4"} + ,{"name": "VRScreenshotType_StereoPanorama","value": "5"} +]} +, {"enumname": "vr::EVRScreenshotPropertyFilenames","values": [ + {"name": "VRScreenshotPropertyFilenames_Preview","value": "0"} + ,{"name": "VRScreenshotPropertyFilenames_VR","value": "1"} +]} +, {"enumname": "vr::EVRTrackedCameraError","values": [ + {"name": "VRTrackedCameraError_None","value": "0"} + ,{"name": "VRTrackedCameraError_OperationFailed","value": "100"} + ,{"name": "VRTrackedCameraError_InvalidHandle","value": "101"} + ,{"name": "VRTrackedCameraError_InvalidFrameHeaderVersion","value": "102"} + ,{"name": "VRTrackedCameraError_OutOfHandles","value": "103"} + ,{"name": "VRTrackedCameraError_IPCFailure","value": "104"} + ,{"name": "VRTrackedCameraError_NotSupportedForThisDevice","value": "105"} + ,{"name": "VRTrackedCameraError_SharedMemoryFailure","value": "106"} + ,{"name": "VRTrackedCameraError_FrameBufferingFailure","value": "107"} + ,{"name": "VRTrackedCameraError_StreamSetupFailure","value": "108"} + ,{"name": "VRTrackedCameraError_InvalidGLTextureId","value": "109"} + ,{"name": "VRTrackedCameraError_InvalidSharedTextureHandle","value": "110"} + ,{"name": "VRTrackedCameraError_FailedToGetGLTextureId","value": "111"} + ,{"name": "VRTrackedCameraError_SharedTextureFailure","value": "112"} + ,{"name": "VRTrackedCameraError_NoFrameAvailable","value": "113"} + ,{"name": "VRTrackedCameraError_InvalidArgument","value": "114"} + ,{"name": "VRTrackedCameraError_InvalidFrameBufferSize","value": "115"} +]} +, {"enumname": "vr::EVRTrackedCameraFrameType","values": [ + {"name": "VRTrackedCameraFrameType_Distorted","value": "0"} + ,{"name": "VRTrackedCameraFrameType_Undistorted","value": "1"} + ,{"name": "VRTrackedCameraFrameType_MaximumUndistorted","value": "2"} + ,{"name": "MAX_CAMERA_FRAME_TYPES","value": "3"} +]} +, {"enumname": "vr::EVRApplicationError","values": [ + {"name": "VRApplicationError_None","value": "0"} + ,{"name": "VRApplicationError_AppKeyAlreadyExists","value": "100"} + ,{"name": "VRApplicationError_NoManifest","value": "101"} + ,{"name": "VRApplicationError_NoApplication","value": "102"} + ,{"name": "VRApplicationError_InvalidIndex","value": "103"} + ,{"name": "VRApplicationError_UnknownApplication","value": "104"} + ,{"name": "VRApplicationError_IPCFailed","value": "105"} + ,{"name": "VRApplicationError_ApplicationAlreadyRunning","value": "106"} + ,{"name": "VRApplicationError_InvalidManifest","value": "107"} + ,{"name": "VRApplicationError_InvalidApplication","value": "108"} + ,{"name": "VRApplicationError_LaunchFailed","value": "109"} + ,{"name": "VRApplicationError_ApplicationAlreadyStarting","value": "110"} + ,{"name": "VRApplicationError_LaunchInProgress","value": "111"} + ,{"name": "VRApplicationError_OldApplicationQuitting","value": "112"} + ,{"name": "VRApplicationError_TransitionAborted","value": "113"} + ,{"name": "VRApplicationError_IsTemplate","value": "114"} + ,{"name": "VRApplicationError_BufferTooSmall","value": "200"} + ,{"name": "VRApplicationError_PropertyNotSet","value": "201"} + ,{"name": "VRApplicationError_UnknownProperty","value": "202"} + ,{"name": "VRApplicationError_InvalidParameter","value": "203"} +]} +, {"enumname": "vr::EVRApplicationProperty","values": [ + {"name": "VRApplicationProperty_Name_String","value": "0"} + ,{"name": "VRApplicationProperty_LaunchType_String","value": "11"} + ,{"name": "VRApplicationProperty_WorkingDirectory_String","value": "12"} + ,{"name": "VRApplicationProperty_BinaryPath_String","value": "13"} + ,{"name": "VRApplicationProperty_Arguments_String","value": "14"} + ,{"name": "VRApplicationProperty_URL_String","value": "15"} + ,{"name": "VRApplicationProperty_Description_String","value": "50"} + ,{"name": "VRApplicationProperty_NewsURL_String","value": "51"} + ,{"name": "VRApplicationProperty_ImagePath_String","value": "52"} + ,{"name": "VRApplicationProperty_Source_String","value": "53"} + ,{"name": "VRApplicationProperty_IsDashboardOverlay_Bool","value": "60"} + ,{"name": "VRApplicationProperty_IsTemplate_Bool","value": "61"} + ,{"name": "VRApplicationProperty_IsInstanced_Bool","value": "62"} + ,{"name": "VRApplicationProperty_IsInternal_Bool","value": "63"} + ,{"name": "VRApplicationProperty_LastLaunchTime_Uint64","value": "70"} +]} +, {"enumname": "vr::EVRApplicationTransitionState","values": [ + {"name": "VRApplicationTransition_None","value": "0"} + ,{"name": "VRApplicationTransition_OldAppQuitSent","value": "10"} + ,{"name": "VRApplicationTransition_WaitingForExternalLaunch","value": "11"} + ,{"name": "VRApplicationTransition_NewAppLaunched","value": "20"} +]} +, {"enumname": "vr::ChaperoneCalibrationState","values": [ + {"name": "ChaperoneCalibrationState_OK","value": "1"} + ,{"name": "ChaperoneCalibrationState_Warning","value": "100"} + ,{"name": "ChaperoneCalibrationState_Warning_BaseStationMayHaveMoved","value": "101"} + ,{"name": "ChaperoneCalibrationState_Warning_BaseStationRemoved","value": "102"} + ,{"name": "ChaperoneCalibrationState_Warning_SeatedBoundsInvalid","value": "103"} + ,{"name": "ChaperoneCalibrationState_Error","value": "200"} + ,{"name": "ChaperoneCalibrationState_Error_BaseStationUninitialized","value": "201"} + ,{"name": "ChaperoneCalibrationState_Error_BaseStationConflict","value": "202"} + ,{"name": "ChaperoneCalibrationState_Error_PlayAreaInvalid","value": "203"} + ,{"name": "ChaperoneCalibrationState_Error_CollisionBoundsInvalid","value": "204"} +]} +, {"enumname": "vr::EChaperoneConfigFile","values": [ + {"name": "EChaperoneConfigFile_Live","value": "1"} + ,{"name": "EChaperoneConfigFile_Temp","value": "2"} +]} +, {"enumname": "vr::EChaperoneImportFlags","values": [ + {"name": "EChaperoneImport_BoundsOnly","value": "1"} +]} +, {"enumname": "vr::EVRCompositorError","values": [ + {"name": "VRCompositorError_None","value": "0"} + ,{"name": "VRCompositorError_RequestFailed","value": "1"} + ,{"name": "VRCompositorError_IncompatibleVersion","value": "100"} + ,{"name": "VRCompositorError_DoNotHaveFocus","value": "101"} + ,{"name": "VRCompositorError_InvalidTexture","value": "102"} + ,{"name": "VRCompositorError_IsNotSceneApplication","value": "103"} + ,{"name": "VRCompositorError_TextureIsOnWrongDevice","value": "104"} + ,{"name": "VRCompositorError_TextureUsesUnsupportedFormat","value": "105"} + ,{"name": "VRCompositorError_SharedTexturesNotSupported","value": "106"} + ,{"name": "VRCompositorError_IndexOutOfRange","value": "107"} + ,{"name": "VRCompositorError_AlreadySubmitted","value": "108"} +]} +, {"enumname": "vr::VROverlayInputMethod","values": [ + {"name": "VROverlayInputMethod_None","value": "0"} + ,{"name": "VROverlayInputMethod_Mouse","value": "1"} +]} +, {"enumname": "vr::VROverlayTransformType","values": [ + {"name": "VROverlayTransform_Absolute","value": "0"} + ,{"name": "VROverlayTransform_TrackedDeviceRelative","value": "1"} + ,{"name": "VROverlayTransform_SystemOverlay","value": "2"} + ,{"name": "VROverlayTransform_TrackedComponent","value": "3"} +]} +, {"enumname": "vr::VROverlayFlags","values": [ + {"name": "VROverlayFlags_None","value": "0"} + ,{"name": "VROverlayFlags_Curved","value": "1"} + ,{"name": "VROverlayFlags_RGSS4X","value": "2"} + ,{"name": "VROverlayFlags_NoDashboardTab","value": "3"} + ,{"name": "VROverlayFlags_AcceptsGamepadEvents","value": "4"} + ,{"name": "VROverlayFlags_ShowGamepadFocus","value": "5"} + ,{"name": "VROverlayFlags_SendVRScrollEvents","value": "6"} + ,{"name": "VROverlayFlags_SendVRTouchpadEvents","value": "7"} + ,{"name": "VROverlayFlags_ShowTouchPadScrollWheel","value": "8"} + ,{"name": "VROverlayFlags_TransferOwnershipToInternalProcess","value": "9"} + ,{"name": "VROverlayFlags_SideBySide_Parallel","value": "10"} + ,{"name": "VROverlayFlags_SideBySide_Crossed","value": "11"} + ,{"name": "VROverlayFlags_Panorama","value": "12"} + ,{"name": "VROverlayFlags_StereoPanorama","value": "13"} + ,{"name": "VROverlayFlags_SortWithNonSceneOverlays","value": "14"} + ,{"name": "VROverlayFlags_VisibleInDashboard","value": "15"} +]} +, {"enumname": "vr::VRMessageOverlayResponse","values": [ + {"name": "VRMessageOverlayResponse_ButtonPress_0","value": "0"} + ,{"name": "VRMessageOverlayResponse_ButtonPress_1","value": "1"} + ,{"name": "VRMessageOverlayResponse_ButtonPress_2","value": "2"} + ,{"name": "VRMessageOverlayResponse_ButtonPress_3","value": "3"} + ,{"name": "VRMessageOverlayResponse_CouldntFindSystemOverlay","value": "4"} + ,{"name": "VRMessageOverlayResponse_CouldntFindOrCreateClientOverlay","value": "5"} + ,{"name": "VRMessageOverlayResponse_ApplicationQuit","value": "6"} +]} +, {"enumname": "vr::EGamepadTextInputMode","values": [ + {"name": "k_EGamepadTextInputModeNormal","value": "0"} + ,{"name": "k_EGamepadTextInputModePassword","value": "1"} + ,{"name": "k_EGamepadTextInputModeSubmit","value": "2"} +]} +, {"enumname": "vr::EGamepadTextInputLineMode","values": [ + {"name": "k_EGamepadTextInputLineModeSingleLine","value": "0"} + ,{"name": "k_EGamepadTextInputLineModeMultipleLines","value": "1"} +]} +, {"enumname": "vr::EOverlayDirection","values": [ + {"name": "OverlayDirection_Up","value": "0"} + ,{"name": "OverlayDirection_Down","value": "1"} + ,{"name": "OverlayDirection_Left","value": "2"} + ,{"name": "OverlayDirection_Right","value": "3"} + ,{"name": "OverlayDirection_Count","value": "4"} +]} +, {"enumname": "vr::EVROverlayIntersectionMaskPrimitiveType","values": [ + {"name": "OverlayIntersectionPrimitiveType_Rectangle","value": "0"} + ,{"name": "OverlayIntersectionPrimitiveType_Circle","value": "1"} +]} +, {"enumname": "vr::EVRRenderModelError","values": [ + {"name": "VRRenderModelError_None","value": "0"} + ,{"name": "VRRenderModelError_Loading","value": "100"} + ,{"name": "VRRenderModelError_NotSupported","value": "200"} + ,{"name": "VRRenderModelError_InvalidArg","value": "300"} + ,{"name": "VRRenderModelError_InvalidModel","value": "301"} + ,{"name": "VRRenderModelError_NoShapes","value": "302"} + ,{"name": "VRRenderModelError_MultipleShapes","value": "303"} + ,{"name": "VRRenderModelError_TooManyVertices","value": "304"} + ,{"name": "VRRenderModelError_MultipleTextures","value": "305"} + ,{"name": "VRRenderModelError_BufferTooSmall","value": "306"} + ,{"name": "VRRenderModelError_NotEnoughNormals","value": "307"} + ,{"name": "VRRenderModelError_NotEnoughTexCoords","value": "308"} + ,{"name": "VRRenderModelError_InvalidTexture","value": "400"} +]} +, {"enumname": "vr::EVRComponentProperty","values": [ + {"name": "VRComponentProperty_IsStatic","value": "1"} + ,{"name": "VRComponentProperty_IsVisible","value": "2"} + ,{"name": "VRComponentProperty_IsTouched","value": "4"} + ,{"name": "VRComponentProperty_IsPressed","value": "8"} + ,{"name": "VRComponentProperty_IsScrolled","value": "16"} +]} +, {"enumname": "vr::EVRNotificationType","values": [ + {"name": "EVRNotificationType_Transient","value": "0"} + ,{"name": "EVRNotificationType_Persistent","value": "1"} + ,{"name": "EVRNotificationType_Transient_SystemWithUserValue","value": "2"} +]} +, {"enumname": "vr::EVRNotificationStyle","values": [ + {"name": "EVRNotificationStyle_None","value": "0"} + ,{"name": "EVRNotificationStyle_Application","value": "100"} + ,{"name": "EVRNotificationStyle_Contact_Disabled","value": "200"} + ,{"name": "EVRNotificationStyle_Contact_Enabled","value": "201"} + ,{"name": "EVRNotificationStyle_Contact_Active","value": "202"} +]} +, {"enumname": "vr::EVRSettingsError","values": [ + {"name": "VRSettingsError_None","value": "0"} + ,{"name": "VRSettingsError_IPCFailed","value": "1"} + ,{"name": "VRSettingsError_WriteFailed","value": "2"} + ,{"name": "VRSettingsError_ReadFailed","value": "3"} + ,{"name": "VRSettingsError_JsonParseFailed","value": "4"} + ,{"name": "VRSettingsError_UnsetSettingHasNoDefault","value": "5"} +]} +, {"enumname": "vr::EVRScreenshotError","values": [ + {"name": "VRScreenshotError_None","value": "0"} + ,{"name": "VRScreenshotError_RequestFailed","value": "1"} + ,{"name": "VRScreenshotError_IncompatibleVersion","value": "100"} + ,{"name": "VRScreenshotError_NotFound","value": "101"} + ,{"name": "VRScreenshotError_BufferTooSmall","value": "102"} + ,{"name": "VRScreenshotError_ScreenshotAlreadyInProgress","value": "108"} +]} +], +"consts":[{ + "constname": "k_nDriverNone","consttype": "const uint32_t", "constval": "4294967295"} +,{ + "constname": "k_unMaxDriverDebugResponseSize","consttype": "const uint32_t", "constval": "32768"} +,{ + "constname": "k_unTrackedDeviceIndex_Hmd","consttype": "const uint32_t", "constval": "0"} +,{ + "constname": "k_unMaxTrackedDeviceCount","consttype": "const uint32_t", "constval": "16"} +,{ + "constname": "k_unTrackedDeviceIndexOther","consttype": "const uint32_t", "constval": "4294967294"} +,{ + "constname": "k_unTrackedDeviceIndexInvalid","consttype": "const uint32_t", "constval": "4294967295"} +,{ + "constname": "k_ulInvalidPropertyContainer","consttype": "const PropertyContainerHandle_t", "constval": "0"} +,{ + "constname": "k_unInvalidPropertyTag","consttype": "const PropertyTypeTag_t", "constval": "0"} +,{ + "constname": "k_unFloatPropertyTag","consttype": "const PropertyTypeTag_t", "constval": "1"} +,{ + "constname": "k_unInt32PropertyTag","consttype": "const PropertyTypeTag_t", "constval": "2"} +,{ + "constname": "k_unUint64PropertyTag","consttype": "const PropertyTypeTag_t", "constval": "3"} +,{ + "constname": "k_unBoolPropertyTag","consttype": "const PropertyTypeTag_t", "constval": "4"} +,{ + "constname": "k_unStringPropertyTag","consttype": "const PropertyTypeTag_t", "constval": "5"} +,{ + "constname": "k_unHmdMatrix34PropertyTag","consttype": "const PropertyTypeTag_t", "constval": "20"} +,{ + "constname": "k_unHmdMatrix44PropertyTag","consttype": "const PropertyTypeTag_t", "constval": "21"} +,{ + "constname": "k_unHmdVector3PropertyTag","consttype": "const PropertyTypeTag_t", "constval": "22"} +,{ + "constname": "k_unHmdVector4PropertyTag","consttype": "const PropertyTypeTag_t", "constval": "23"} +,{ + "constname": "k_unHiddenAreaPropertyTag","consttype": "const PropertyTypeTag_t", "constval": "30"} +,{ + "constname": "k_unOpenVRInternalReserved_Start","consttype": "const PropertyTypeTag_t", "constval": "1000"} +,{ + "constname": "k_unOpenVRInternalReserved_End","consttype": "const PropertyTypeTag_t", "constval": "10000"} +,{ + "constname": "k_unMaxPropertyStringSize","consttype": "const uint32_t", "constval": "32768"} +,{ + "constname": "k_unControllerStateAxisCount","consttype": "const uint32_t", "constval": "5"} +,{ + "constname": "k_ulOverlayHandleInvalid","consttype": "const VROverlayHandle_t", "constval": "0"} +,{ + "constname": "k_unScreenshotHandleInvalid","consttype": "const uint32_t", "constval": "0"} +,{ + "constname": "IVRSystem_Version","consttype": "const char *const", "constval": "IVRSystem_016"} +,{ + "constname": "IVRExtendedDisplay_Version","consttype": "const char *const", "constval": "IVRExtendedDisplay_001"} +,{ + "constname": "IVRTrackedCamera_Version","consttype": "const char *const", "constval": "IVRTrackedCamera_003"} +,{ + "constname": "k_unMaxApplicationKeyLength","consttype": "const uint32_t", "constval": "128"} +,{ + "constname": "k_pch_MimeType_HomeApp","consttype": "const char *const", "constval": "vr/home"} +,{ + "constname": "k_pch_MimeType_GameTheater","consttype": "const char *const", "constval": "vr/game_theater"} +,{ + "constname": "IVRApplications_Version","consttype": "const char *const", "constval": "IVRApplications_006"} +,{ + "constname": "IVRChaperone_Version","consttype": "const char *const", "constval": "IVRChaperone_003"} +,{ + "constname": "IVRChaperoneSetup_Version","consttype": "const char *const", "constval": "IVRChaperoneSetup_005"} +,{ + "constname": "IVRCompositor_Version","consttype": "const char *const", "constval": "IVRCompositor_020"} +,{ + "constname": "k_unVROverlayMaxKeyLength","consttype": "const uint32_t", "constval": "128"} +,{ + "constname": "k_unVROverlayMaxNameLength","consttype": "const uint32_t", "constval": "128"} +,{ + "constname": "k_unMaxOverlayCount","consttype": "const uint32_t", "constval": "64"} +,{ + "constname": "k_unMaxOverlayIntersectionMaskPrimitivesCount","consttype": "const uint32_t", "constval": "32"} +,{ + "constname": "IVROverlay_Version","consttype": "const char *const", "constval": "IVROverlay_016"} +,{ + "constname": "k_pch_Controller_Component_GDC2015","consttype": "const char *const", "constval": "gdc2015"} +,{ + "constname": "k_pch_Controller_Component_Base","consttype": "const char *const", "constval": "base"} +,{ + "constname": "k_pch_Controller_Component_Tip","consttype": "const char *const", "constval": "tip"} +,{ + "constname": "k_pch_Controller_Component_HandGrip","consttype": "const char *const", "constval": "handgrip"} +,{ + "constname": "k_pch_Controller_Component_Status","consttype": "const char *const", "constval": "status"} +,{ + "constname": "IVRRenderModels_Version","consttype": "const char *const", "constval": "IVRRenderModels_005"} +,{ + "constname": "k_unNotificationTextMaxSize","consttype": "const uint32_t", "constval": "256"} +,{ + "constname": "IVRNotifications_Version","consttype": "const char *const", "constval": "IVRNotifications_002"} +,{ + "constname": "k_unMaxSettingsKeyLength","consttype": "const uint32_t", "constval": "128"} +,{ + "constname": "IVRSettings_Version","consttype": "const char *const", "constval": "IVRSettings_002"} +,{ + "constname": "k_pch_SteamVR_Section","consttype": "const char *const", "constval": "steamvr"} +,{ + "constname": "k_pch_SteamVR_RequireHmd_String","consttype": "const char *const", "constval": "requireHmd"} +,{ + "constname": "k_pch_SteamVR_ForcedDriverKey_String","consttype": "const char *const", "constval": "forcedDriver"} +,{ + "constname": "k_pch_SteamVR_ForcedHmdKey_String","consttype": "const char *const", "constval": "forcedHmd"} +,{ + "constname": "k_pch_SteamVR_DisplayDebug_Bool","consttype": "const char *const", "constval": "displayDebug"} +,{ + "constname": "k_pch_SteamVR_DebugProcessPipe_String","consttype": "const char *const", "constval": "debugProcessPipe"} +,{ + "constname": "k_pch_SteamVR_DisplayDebugX_Int32","consttype": "const char *const", "constval": "displayDebugX"} +,{ + "constname": "k_pch_SteamVR_DisplayDebugY_Int32","consttype": "const char *const", "constval": "displayDebugY"} +,{ + "constname": "k_pch_SteamVR_SendSystemButtonToAllApps_Bool","consttype": "const char *const", "constval": "sendSystemButtonToAllApps"} +,{ + "constname": "k_pch_SteamVR_LogLevel_Int32","consttype": "const char *const", "constval": "loglevel"} +,{ + "constname": "k_pch_SteamVR_IPD_Float","consttype": "const char *const", "constval": "ipd"} +,{ + "constname": "k_pch_SteamVR_Background_String","consttype": "const char *const", "constval": "background"} +,{ + "constname": "k_pch_SteamVR_BackgroundUseDomeProjection_Bool","consttype": "const char *const", "constval": "backgroundUseDomeProjection"} +,{ + "constname": "k_pch_SteamVR_BackgroundCameraHeight_Float","consttype": "const char *const", "constval": "backgroundCameraHeight"} +,{ + "constname": "k_pch_SteamVR_BackgroundDomeRadius_Float","consttype": "const char *const", "constval": "backgroundDomeRadius"} +,{ + "constname": "k_pch_SteamVR_GridColor_String","consttype": "const char *const", "constval": "gridColor"} +,{ + "constname": "k_pch_SteamVR_PlayAreaColor_String","consttype": "const char *const", "constval": "playAreaColor"} +,{ + "constname": "k_pch_SteamVR_ShowStage_Bool","consttype": "const char *const", "constval": "showStage"} +,{ + "constname": "k_pch_SteamVR_ActivateMultipleDrivers_Bool","consttype": "const char *const", "constval": "activateMultipleDrivers"} +,{ + "constname": "k_pch_SteamVR_DirectMode_Bool","consttype": "const char *const", "constval": "directMode"} +,{ + "constname": "k_pch_SteamVR_DirectModeEdidVid_Int32","consttype": "const char *const", "constval": "directModeEdidVid"} +,{ + "constname": "k_pch_SteamVR_DirectModeEdidPid_Int32","consttype": "const char *const", "constval": "directModeEdidPid"} +,{ + "constname": "k_pch_SteamVR_UsingSpeakers_Bool","consttype": "const char *const", "constval": "usingSpeakers"} +,{ + "constname": "k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float","consttype": "const char *const", "constval": "speakersForwardYawOffsetDegrees"} +,{ + "constname": "k_pch_SteamVR_BaseStationPowerManagement_Bool","consttype": "const char *const", "constval": "basestationPowerManagement"} +,{ + "constname": "k_pch_SteamVR_NeverKillProcesses_Bool","consttype": "const char *const", "constval": "neverKillProcesses"} +,{ + "constname": "k_pch_SteamVR_SupersampleScale_Float","consttype": "const char *const", "constval": "supersampleScale"} +,{ + "constname": "k_pch_SteamVR_AllowAsyncReprojection_Bool","consttype": "const char *const", "constval": "allowAsyncReprojection"} +,{ + "constname": "k_pch_SteamVR_AllowReprojection_Bool","consttype": "const char *const", "constval": "allowInterleavedReprojection"} +,{ + "constname": "k_pch_SteamVR_ForceReprojection_Bool","consttype": "const char *const", "constval": "forceReprojection"} +,{ + "constname": "k_pch_SteamVR_ForceFadeOnBadTracking_Bool","consttype": "const char *const", "constval": "forceFadeOnBadTracking"} +,{ + "constname": "k_pch_SteamVR_DefaultMirrorView_Int32","consttype": "const char *const", "constval": "defaultMirrorView"} +,{ + "constname": "k_pch_SteamVR_ShowMirrorView_Bool","consttype": "const char *const", "constval": "showMirrorView"} +,{ + "constname": "k_pch_SteamVR_MirrorViewGeometry_String","consttype": "const char *const", "constval": "mirrorViewGeometry"} +,{ + "constname": "k_pch_SteamVR_StartMonitorFromAppLaunch","consttype": "const char *const", "constval": "startMonitorFromAppLaunch"} +,{ + "constname": "k_pch_SteamVR_StartCompositorFromAppLaunch_Bool","consttype": "const char *const", "constval": "startCompositorFromAppLaunch"} +,{ + "constname": "k_pch_SteamVR_StartDashboardFromAppLaunch_Bool","consttype": "const char *const", "constval": "startDashboardFromAppLaunch"} +,{ + "constname": "k_pch_SteamVR_StartOverlayAppsFromDashboard_Bool","consttype": "const char *const", "constval": "startOverlayAppsFromDashboard"} +,{ + "constname": "k_pch_SteamVR_EnableHomeApp","consttype": "const char *const", "constval": "enableHomeApp"} +,{ + "constname": "k_pch_SteamVR_CycleBackgroundImageTimeSec_Int32","consttype": "const char *const", "constval": "CycleBackgroundImageTimeSec"} +,{ + "constname": "k_pch_SteamVR_RetailDemo_Bool","consttype": "const char *const", "constval": "retailDemo"} +,{ + "constname": "k_pch_SteamVR_IpdOffset_Float","consttype": "const char *const", "constval": "ipdOffset"} +,{ + "constname": "k_pch_SteamVR_AllowSupersampleFiltering_Bool","consttype": "const char *const", "constval": "allowSupersampleFiltering"} +,{ + "constname": "k_pch_Lighthouse_Section","consttype": "const char *const", "constval": "driver_lighthouse"} +,{ + "constname": "k_pch_Lighthouse_DisableIMU_Bool","consttype": "const char *const", "constval": "disableimu"} +,{ + "constname": "k_pch_Lighthouse_UseDisambiguation_String","consttype": "const char *const", "constval": "usedisambiguation"} +,{ + "constname": "k_pch_Lighthouse_DisambiguationDebug_Int32","consttype": "const char *const", "constval": "disambiguationdebug"} +,{ + "constname": "k_pch_Lighthouse_PrimaryBasestation_Int32","consttype": "const char *const", "constval": "primarybasestation"} +,{ + "constname": "k_pch_Lighthouse_DBHistory_Bool","consttype": "const char *const", "constval": "dbhistory"} +,{ + "constname": "k_pch_Null_Section","consttype": "const char *const", "constval": "driver_null"} +,{ + "constname": "k_pch_Null_SerialNumber_String","consttype": "const char *const", "constval": "serialNumber"} +,{ + "constname": "k_pch_Null_ModelNumber_String","consttype": "const char *const", "constval": "modelNumber"} +,{ + "constname": "k_pch_Null_WindowX_Int32","consttype": "const char *const", "constval": "windowX"} +,{ + "constname": "k_pch_Null_WindowY_Int32","consttype": "const char *const", "constval": "windowY"} +,{ + "constname": "k_pch_Null_WindowWidth_Int32","consttype": "const char *const", "constval": "windowWidth"} +,{ + "constname": "k_pch_Null_WindowHeight_Int32","consttype": "const char *const", "constval": "windowHeight"} +,{ + "constname": "k_pch_Null_RenderWidth_Int32","consttype": "const char *const", "constval": "renderWidth"} +,{ + "constname": "k_pch_Null_RenderHeight_Int32","consttype": "const char *const", "constval": "renderHeight"} +,{ + "constname": "k_pch_Null_SecondsFromVsyncToPhotons_Float","consttype": "const char *const", "constval": "secondsFromVsyncToPhotons"} +,{ + "constname": "k_pch_Null_DisplayFrequency_Float","consttype": "const char *const", "constval": "displayFrequency"} +,{ + "constname": "k_pch_UserInterface_Section","consttype": "const char *const", "constval": "userinterface"} +,{ + "constname": "k_pch_UserInterface_StatusAlwaysOnTop_Bool","consttype": "const char *const", "constval": "StatusAlwaysOnTop"} +,{ + "constname": "k_pch_UserInterface_MinimizeToTray_Bool","consttype": "const char *const", "constval": "MinimizeToTray"} +,{ + "constname": "k_pch_UserInterface_Screenshots_Bool","consttype": "const char *const", "constval": "screenshots"} +,{ + "constname": "k_pch_UserInterface_ScreenshotType_Int","consttype": "const char *const", "constval": "screenshotType"} +,{ + "constname": "k_pch_Notifications_Section","consttype": "const char *const", "constval": "notifications"} +,{ + "constname": "k_pch_Notifications_DoNotDisturb_Bool","consttype": "const char *const", "constval": "DoNotDisturb"} +,{ + "constname": "k_pch_Keyboard_Section","consttype": "const char *const", "constval": "keyboard"} +,{ + "constname": "k_pch_Keyboard_TutorialCompletions","consttype": "const char *const", "constval": "TutorialCompletions"} +,{ + "constname": "k_pch_Keyboard_ScaleX","consttype": "const char *const", "constval": "ScaleX"} +,{ + "constname": "k_pch_Keyboard_ScaleY","consttype": "const char *const", "constval": "ScaleY"} +,{ + "constname": "k_pch_Keyboard_OffsetLeftX","consttype": "const char *const", "constval": "OffsetLeftX"} +,{ + "constname": "k_pch_Keyboard_OffsetRightX","consttype": "const char *const", "constval": "OffsetRightX"} +,{ + "constname": "k_pch_Keyboard_OffsetY","consttype": "const char *const", "constval": "OffsetY"} +,{ + "constname": "k_pch_Keyboard_Smoothing","consttype": "const char *const", "constval": "Smoothing"} +,{ + "constname": "k_pch_Perf_Section","consttype": "const char *const", "constval": "perfcheck"} +,{ + "constname": "k_pch_Perf_HeuristicActive_Bool","consttype": "const char *const", "constval": "heuristicActive"} +,{ + "constname": "k_pch_Perf_NotifyInHMD_Bool","consttype": "const char *const", "constval": "warnInHMD"} +,{ + "constname": "k_pch_Perf_NotifyOnlyOnce_Bool","consttype": "const char *const", "constval": "warnOnlyOnce"} +,{ + "constname": "k_pch_Perf_AllowTimingStore_Bool","consttype": "const char *const", "constval": "allowTimingStore"} +,{ + "constname": "k_pch_Perf_SaveTimingsOnExit_Bool","consttype": "const char *const", "constval": "saveTimingsOnExit"} +,{ + "constname": "k_pch_Perf_TestData_Float","consttype": "const char *const", "constval": "perfTestData"} +,{ + "constname": "k_pch_Perf_LinuxGPUProfiling_Bool","consttype": "const char *const", "constval": "linuxGPUProfiling"} +,{ + "constname": "k_pch_CollisionBounds_Section","consttype": "const char *const", "constval": "collisionBounds"} +,{ + "constname": "k_pch_CollisionBounds_Style_Int32","consttype": "const char *const", "constval": "CollisionBoundsStyle"} +,{ + "constname": "k_pch_CollisionBounds_GroundPerimeterOn_Bool","consttype": "const char *const", "constval": "CollisionBoundsGroundPerimeterOn"} +,{ + "constname": "k_pch_CollisionBounds_CenterMarkerOn_Bool","consttype": "const char *const", "constval": "CollisionBoundsCenterMarkerOn"} +,{ + "constname": "k_pch_CollisionBounds_PlaySpaceOn_Bool","consttype": "const char *const", "constval": "CollisionBoundsPlaySpaceOn"} +,{ + "constname": "k_pch_CollisionBounds_FadeDistance_Float","consttype": "const char *const", "constval": "CollisionBoundsFadeDistance"} +,{ + "constname": "k_pch_CollisionBounds_ColorGammaR_Int32","consttype": "const char *const", "constval": "CollisionBoundsColorGammaR"} +,{ + "constname": "k_pch_CollisionBounds_ColorGammaG_Int32","consttype": "const char *const", "constval": "CollisionBoundsColorGammaG"} +,{ + "constname": "k_pch_CollisionBounds_ColorGammaB_Int32","consttype": "const char *const", "constval": "CollisionBoundsColorGammaB"} +,{ + "constname": "k_pch_CollisionBounds_ColorGammaA_Int32","consttype": "const char *const", "constval": "CollisionBoundsColorGammaA"} +,{ + "constname": "k_pch_Camera_Section","consttype": "const char *const", "constval": "camera"} +,{ + "constname": "k_pch_Camera_EnableCamera_Bool","consttype": "const char *const", "constval": "enableCamera"} +,{ + "constname": "k_pch_Camera_EnableCameraInDashboard_Bool","consttype": "const char *const", "constval": "enableCameraInDashboard"} +,{ + "constname": "k_pch_Camera_EnableCameraForCollisionBounds_Bool","consttype": "const char *const", "constval": "enableCameraForCollisionBounds"} +,{ + "constname": "k_pch_Camera_EnableCameraForRoomView_Bool","consttype": "const char *const", "constval": "enableCameraForRoomView"} +,{ + "constname": "k_pch_Camera_BoundsColorGammaR_Int32","consttype": "const char *const", "constval": "cameraBoundsColorGammaR"} +,{ + "constname": "k_pch_Camera_BoundsColorGammaG_Int32","consttype": "const char *const", "constval": "cameraBoundsColorGammaG"} +,{ + "constname": "k_pch_Camera_BoundsColorGammaB_Int32","consttype": "const char *const", "constval": "cameraBoundsColorGammaB"} +,{ + "constname": "k_pch_Camera_BoundsColorGammaA_Int32","consttype": "const char *const", "constval": "cameraBoundsColorGammaA"} +,{ + "constname": "k_pch_Camera_BoundsStrength_Int32","consttype": "const char *const", "constval": "cameraBoundsStrength"} +,{ + "constname": "k_pch_audio_Section","consttype": "const char *const", "constval": "audio"} +,{ + "constname": "k_pch_audio_OnPlaybackDevice_String","consttype": "const char *const", "constval": "onPlaybackDevice"} +,{ + "constname": "k_pch_audio_OnRecordDevice_String","consttype": "const char *const", "constval": "onRecordDevice"} +,{ + "constname": "k_pch_audio_OnPlaybackMirrorDevice_String","consttype": "const char *const", "constval": "onPlaybackMirrorDevice"} +,{ + "constname": "k_pch_audio_OffPlaybackDevice_String","consttype": "const char *const", "constval": "offPlaybackDevice"} +,{ + "constname": "k_pch_audio_OffRecordDevice_String","consttype": "const char *const", "constval": "offRecordDevice"} +,{ + "constname": "k_pch_audio_VIVEHDMIGain","consttype": "const char *const", "constval": "viveHDMIGain"} +,{ + "constname": "k_pch_Power_Section","consttype": "const char *const", "constval": "power"} +,{ + "constname": "k_pch_Power_PowerOffOnExit_Bool","consttype": "const char *const", "constval": "powerOffOnExit"} +,{ + "constname": "k_pch_Power_TurnOffScreensTimeout_Float","consttype": "const char *const", "constval": "turnOffScreensTimeout"} +,{ + "constname": "k_pch_Power_TurnOffControllersTimeout_Float","consttype": "const char *const", "constval": "turnOffControllersTimeout"} +,{ + "constname": "k_pch_Power_ReturnToWatchdogTimeout_Float","consttype": "const char *const", "constval": "returnToWatchdogTimeout"} +,{ + "constname": "k_pch_Power_AutoLaunchSteamVROnButtonPress","consttype": "const char *const", "constval": "autoLaunchSteamVROnButtonPress"} +,{ + "constname": "k_pch_Dashboard_Section","consttype": "const char *const", "constval": "dashboard"} +,{ + "constname": "k_pch_Dashboard_EnableDashboard_Bool","consttype": "const char *const", "constval": "enableDashboard"} +,{ + "constname": "k_pch_Dashboard_ArcadeMode_Bool","consttype": "const char *const", "constval": "arcadeMode"} +,{ + "constname": "k_pch_modelskin_Section","consttype": "const char *const", "constval": "modelskins"} +,{ + "constname": "k_pch_Driver_Enable_Bool","consttype": "const char *const", "constval": "enable"} +,{ + "constname": "IVRScreenshots_Version","consttype": "const char *const", "constval": "IVRScreenshots_001"} +,{ + "constname": "IVRResources_Version","consttype": "const char *const", "constval": "IVRResources_001"} +,{ + "constname": "IVRDriverManager_Version","consttype": "const char *const", "constval": "IVRDriverManager_001"} +], +"structs":[{"struct": "vr::HmdMatrix34_t","fields": [ +{ "fieldname": "m", "fieldtype": "float [3][4]"}]} +,{"struct": "vr::HmdMatrix44_t","fields": [ +{ "fieldname": "m", "fieldtype": "float [4][4]"}]} +,{"struct": "vr::HmdVector3_t","fields": [ +{ "fieldname": "v", "fieldtype": "float [3]"}]} +,{"struct": "vr::HmdVector4_t","fields": [ +{ "fieldname": "v", "fieldtype": "float [4]"}]} +,{"struct": "vr::HmdVector3d_t","fields": [ +{ "fieldname": "v", "fieldtype": "double [3]"}]} +,{"struct": "vr::HmdVector2_t","fields": [ +{ "fieldname": "v", "fieldtype": "float [2]"}]} +,{"struct": "vr::HmdQuaternion_t","fields": [ +{ "fieldname": "w", "fieldtype": "double"}, +{ "fieldname": "x", "fieldtype": "double"}, +{ "fieldname": "y", "fieldtype": "double"}, +{ "fieldname": "z", "fieldtype": "double"}]} +,{"struct": "vr::HmdColor_t","fields": [ +{ "fieldname": "r", "fieldtype": "float"}, +{ "fieldname": "g", "fieldtype": "float"}, +{ "fieldname": "b", "fieldtype": "float"}, +{ "fieldname": "a", "fieldtype": "float"}]} +,{"struct": "vr::HmdQuad_t","fields": [ +{ "fieldname": "vCorners", "fieldtype": "struct vr::HmdVector3_t [4]"}]} +,{"struct": "vr::HmdRect2_t","fields": [ +{ "fieldname": "vTopLeft", "fieldtype": "struct vr::HmdVector2_t"}, +{ "fieldname": "vBottomRight", "fieldtype": "struct vr::HmdVector2_t"}]} +,{"struct": "vr::DistortionCoordinates_t","fields": [ +{ "fieldname": "rfRed", "fieldtype": "float [2]"}, +{ "fieldname": "rfGreen", "fieldtype": "float [2]"}, +{ "fieldname": "rfBlue", "fieldtype": "float [2]"}]} +,{"struct": "vr::Texture_t","fields": [ +{ "fieldname": "handle", "fieldtype": "void *"}, +{ "fieldname": "eType", "fieldtype": "enum vr::ETextureType"}, +{ "fieldname": "eColorSpace", "fieldtype": "enum vr::EColorSpace"}]} +,{"struct": "vr::TrackedDevicePose_t","fields": [ +{ "fieldname": "mDeviceToAbsoluteTracking", "fieldtype": "struct vr::HmdMatrix34_t"}, +{ "fieldname": "vVelocity", "fieldtype": "struct vr::HmdVector3_t"}, +{ "fieldname": "vAngularVelocity", "fieldtype": "struct vr::HmdVector3_t"}, +{ "fieldname": "eTrackingResult", "fieldtype": "enum vr::ETrackingResult"}, +{ "fieldname": "bPoseIsValid", "fieldtype": "_Bool"}, +{ "fieldname": "bDeviceIsConnected", "fieldtype": "_Bool"}]} +,{"struct": "vr::VRTextureBounds_t","fields": [ +{ "fieldname": "uMin", "fieldtype": "float"}, +{ "fieldname": "vMin", "fieldtype": "float"}, +{ "fieldname": "uMax", "fieldtype": "float"}, +{ "fieldname": "vMax", "fieldtype": "float"}]} +,{"struct": "vr::VRVulkanTextureData_t","fields": [ +{ "fieldname": "m_nImage", "fieldtype": "uint64_t"}, +{ "fieldname": "m_pDevice", "fieldtype": "struct VkDevice_T *"}, +{ "fieldname": "m_pPhysicalDevice", "fieldtype": "struct VkPhysicalDevice_T *"}, +{ "fieldname": "m_pInstance", "fieldtype": "struct VkInstance_T *"}, +{ "fieldname": "m_pQueue", "fieldtype": "struct VkQueue_T *"}, +{ "fieldname": "m_nQueueFamilyIndex", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nWidth", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nHeight", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nFormat", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nSampleCount", "fieldtype": "uint32_t"}]} +,{"struct": "vr::D3D12TextureData_t","fields": [ +{ "fieldname": "m_pResource", "fieldtype": "struct ID3D12Resource *"}, +{ "fieldname": "m_pCommandQueue", "fieldtype": "struct ID3D12CommandQueue *"}, +{ "fieldname": "m_nNodeMask", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_Controller_t","fields": [ +{ "fieldname": "button", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_Mouse_t","fields": [ +{ "fieldname": "x", "fieldtype": "float"}, +{ "fieldname": "y", "fieldtype": "float"}, +{ "fieldname": "button", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_Scroll_t","fields": [ +{ "fieldname": "xdelta", "fieldtype": "float"}, +{ "fieldname": "ydelta", "fieldtype": "float"}, +{ "fieldname": "repeatCount", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_TouchPadMove_t","fields": [ +{ "fieldname": "bFingerDown", "fieldtype": "_Bool"}, +{ "fieldname": "flSecondsFingerDown", "fieldtype": "float"}, +{ "fieldname": "fValueXFirst", "fieldtype": "float"}, +{ "fieldname": "fValueYFirst", "fieldtype": "float"}, +{ "fieldname": "fValueXRaw", "fieldtype": "float"}, +{ "fieldname": "fValueYRaw", "fieldtype": "float"}]} +,{"struct": "vr::VREvent_Notification_t","fields": [ +{ "fieldname": "ulUserValue", "fieldtype": "uint64_t"}, +{ "fieldname": "notificationId", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_Process_t","fields": [ +{ "fieldname": "pid", "fieldtype": "uint32_t"}, +{ "fieldname": "oldPid", "fieldtype": "uint32_t"}, +{ "fieldname": "bForced", "fieldtype": "_Bool"}]} +,{"struct": "vr::VREvent_Overlay_t","fields": [ +{ "fieldname": "overlayHandle", "fieldtype": "uint64_t"}]} +,{"struct": "vr::VREvent_Status_t","fields": [ +{ "fieldname": "statusState", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_Keyboard_t","fields": [ +{ "fieldname": "cNewInput", "fieldtype": "char [8]"}, +{ "fieldname": "uUserValue", "fieldtype": "uint64_t"}]} +,{"struct": "vr::VREvent_Ipd_t","fields": [ +{ "fieldname": "ipdMeters", "fieldtype": "float"}]} +,{"struct": "vr::VREvent_Chaperone_t","fields": [ +{ "fieldname": "m_nPreviousUniverse", "fieldtype": "uint64_t"}, +{ "fieldname": "m_nCurrentUniverse", "fieldtype": "uint64_t"}]} +,{"struct": "vr::VREvent_Reserved_t","fields": [ +{ "fieldname": "reserved0", "fieldtype": "uint64_t"}, +{ "fieldname": "reserved1", "fieldtype": "uint64_t"}]} +,{"struct": "vr::VREvent_PerformanceTest_t","fields": [ +{ "fieldname": "m_nFidelityLevel", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_SeatedZeroPoseReset_t","fields": [ +{ "fieldname": "bResetBySystemMenu", "fieldtype": "_Bool"}]} +,{"struct": "vr::VREvent_Screenshot_t","fields": [ +{ "fieldname": "handle", "fieldtype": "uint32_t"}, +{ "fieldname": "type", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_ScreenshotProgress_t","fields": [ +{ "fieldname": "progress", "fieldtype": "float"}]} +,{"struct": "vr::VREvent_ApplicationLaunch_t","fields": [ +{ "fieldname": "pid", "fieldtype": "uint32_t"}, +{ "fieldname": "unArgsHandle", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_EditingCameraSurface_t","fields": [ +{ "fieldname": "overlayHandle", "fieldtype": "uint64_t"}, +{ "fieldname": "nVisualMode", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_MessageOverlay_t","fields": [ +{ "fieldname": "unVRMessageOverlayResponse", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_Property_t","fields": [ +{ "fieldname": "container", "fieldtype": "PropertyContainerHandle_t"}, +{ "fieldname": "prop", "fieldtype": "enum vr::ETrackedDeviceProperty"}]} +,{"struct": "vr::(anonymous)","fields": [ +{ "fieldname": "reserved", "fieldtype": "struct vr::VREvent_Reserved_t"}, +{ "fieldname": "controller", "fieldtype": "struct vr::VREvent_Controller_t"}, +{ "fieldname": "mouse", "fieldtype": "struct vr::VREvent_Mouse_t"}, +{ "fieldname": "scroll", "fieldtype": "struct vr::VREvent_Scroll_t"}, +{ "fieldname": "process", "fieldtype": "struct vr::VREvent_Process_t"}, +{ "fieldname": "notification", "fieldtype": "struct vr::VREvent_Notification_t"}, +{ "fieldname": "overlay", "fieldtype": "struct vr::VREvent_Overlay_t"}, +{ "fieldname": "status", "fieldtype": "struct vr::VREvent_Status_t"}, +{ "fieldname": "keyboard", "fieldtype": "struct vr::VREvent_Keyboard_t"}, +{ "fieldname": "ipd", "fieldtype": "struct vr::VREvent_Ipd_t"}, +{ "fieldname": "chaperone", "fieldtype": "struct vr::VREvent_Chaperone_t"}, +{ "fieldname": "performanceTest", "fieldtype": "struct vr::VREvent_PerformanceTest_t"}, +{ "fieldname": "touchPadMove", "fieldtype": "struct vr::VREvent_TouchPadMove_t"}, +{ "fieldname": "seatedZeroPoseReset", "fieldtype": "struct vr::VREvent_SeatedZeroPoseReset_t"}, +{ "fieldname": "screenshot", "fieldtype": "struct vr::VREvent_Screenshot_t"}, +{ "fieldname": "screenshotProgress", "fieldtype": "struct vr::VREvent_ScreenshotProgress_t"}, +{ "fieldname": "applicationLaunch", "fieldtype": "struct vr::VREvent_ApplicationLaunch_t"}, +{ "fieldname": "cameraSurface", "fieldtype": "struct vr::VREvent_EditingCameraSurface_t"}, +{ "fieldname": "messageOverlay", "fieldtype": "struct vr::VREvent_MessageOverlay_t"}, +{ "fieldname": "property", "fieldtype": "struct vr::VREvent_Property_t"}]} +,{"struct": "vr::VREvent_t","fields": [ +{ "fieldname": "eventType", "fieldtype": "uint32_t"}, +{ "fieldname": "trackedDeviceIndex", "fieldtype": "TrackedDeviceIndex_t"}, +{ "fieldname": "eventAgeSeconds", "fieldtype": "float"}, +{ "fieldname": "data", "fieldtype": "VREvent_Data_t"}]} +,{"struct": "vr::HiddenAreaMesh_t","fields": [ +{ "fieldname": "pVertexData", "fieldtype": "const struct vr::HmdVector2_t *"}, +{ "fieldname": "unTriangleCount", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VRControllerAxis_t","fields": [ +{ "fieldname": "x", "fieldtype": "float"}, +{ "fieldname": "y", "fieldtype": "float"}]} +,{"struct": "vr::VRControllerState001_t","fields": [ +{ "fieldname": "unPacketNum", "fieldtype": "uint32_t"}, +{ "fieldname": "ulButtonPressed", "fieldtype": "uint64_t"}, +{ "fieldname": "ulButtonTouched", "fieldtype": "uint64_t"}, +{ "fieldname": "rAxis", "fieldtype": "struct vr::VRControllerAxis_t [5]"}]} +,{"struct": "vr::Compositor_OverlaySettings","fields": [ +{ "fieldname": "size", "fieldtype": "uint32_t"}, +{ "fieldname": "curved", "fieldtype": "_Bool"}, +{ "fieldname": "antialias", "fieldtype": "_Bool"}, +{ "fieldname": "scale", "fieldtype": "float"}, +{ "fieldname": "distance", "fieldtype": "float"}, +{ "fieldname": "alpha", "fieldtype": "float"}, +{ "fieldname": "uOffset", "fieldtype": "float"}, +{ "fieldname": "vOffset", "fieldtype": "float"}, +{ "fieldname": "uScale", "fieldtype": "float"}, +{ "fieldname": "vScale", "fieldtype": "float"}, +{ "fieldname": "gridDivs", "fieldtype": "float"}, +{ "fieldname": "gridWidth", "fieldtype": "float"}, +{ "fieldname": "gridScale", "fieldtype": "float"}, +{ "fieldname": "transform", "fieldtype": "struct vr::HmdMatrix44_t"}]} +,{"struct": "vr::CameraVideoStreamFrameHeader_t","fields": [ +{ "fieldname": "eFrameType", "fieldtype": "enum vr::EVRTrackedCameraFrameType"}, +{ "fieldname": "nWidth", "fieldtype": "uint32_t"}, +{ "fieldname": "nHeight", "fieldtype": "uint32_t"}, +{ "fieldname": "nBytesPerPixel", "fieldtype": "uint32_t"}, +{ "fieldname": "nFrameSequence", "fieldtype": "uint32_t"}, +{ "fieldname": "standingTrackedDevicePose", "fieldtype": "struct vr::TrackedDevicePose_t"}]} +,{"struct": "vr::AppOverrideKeys_t","fields": [ +{ "fieldname": "pchKey", "fieldtype": "const char *"}, +{ "fieldname": "pchValue", "fieldtype": "const char *"}]} +,{"struct": "vr::Compositor_FrameTiming","fields": [ +{ "fieldname": "m_nSize", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nFrameIndex", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumFramePresents", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumMisPresented", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumDroppedFrames", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nReprojectionFlags", "fieldtype": "uint32_t"}, +{ "fieldname": "m_flSystemTimeInSeconds", "fieldtype": "double"}, +{ "fieldname": "m_flPreSubmitGpuMs", "fieldtype": "float"}, +{ "fieldname": "m_flPostSubmitGpuMs", "fieldtype": "float"}, +{ "fieldname": "m_flTotalRenderGpuMs", "fieldtype": "float"}, +{ "fieldname": "m_flCompositorRenderGpuMs", "fieldtype": "float"}, +{ "fieldname": "m_flCompositorRenderCpuMs", "fieldtype": "float"}, +{ "fieldname": "m_flCompositorIdleCpuMs", "fieldtype": "float"}, +{ "fieldname": "m_flClientFrameIntervalMs", "fieldtype": "float"}, +{ "fieldname": "m_flPresentCallCpuMs", "fieldtype": "float"}, +{ "fieldname": "m_flWaitForPresentCpuMs", "fieldtype": "float"}, +{ "fieldname": "m_flSubmitFrameMs", "fieldtype": "float"}, +{ "fieldname": "m_flWaitGetPosesCalledMs", "fieldtype": "float"}, +{ "fieldname": "m_flNewPosesReadyMs", "fieldtype": "float"}, +{ "fieldname": "m_flNewFrameReadyMs", "fieldtype": "float"}, +{ "fieldname": "m_flCompositorUpdateStartMs", "fieldtype": "float"}, +{ "fieldname": "m_flCompositorUpdateEndMs", "fieldtype": "float"}, +{ "fieldname": "m_flCompositorRenderStartMs", "fieldtype": "float"}, +{ "fieldname": "m_HmdPose", "fieldtype": "vr::TrackedDevicePose_t"}]} +,{"struct": "vr::Compositor_CumulativeStats","fields": [ +{ "fieldname": "m_nPid", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumFramePresents", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumDroppedFrames", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumReprojectedFrames", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumFramePresentsOnStartup", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumDroppedFramesOnStartup", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumReprojectedFramesOnStartup", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumLoading", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumFramePresentsLoading", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumDroppedFramesLoading", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumReprojectedFramesLoading", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumTimedOut", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumFramePresentsTimedOut", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumDroppedFramesTimedOut", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumReprojectedFramesTimedOut", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VROverlayIntersectionParams_t","fields": [ +{ "fieldname": "vSource", "fieldtype": "struct vr::HmdVector3_t"}, +{ "fieldname": "vDirection", "fieldtype": "struct vr::HmdVector3_t"}, +{ "fieldname": "eOrigin", "fieldtype": "enum vr::ETrackingUniverseOrigin"}]} +,{"struct": "vr::VROverlayIntersectionResults_t","fields": [ +{ "fieldname": "vPoint", "fieldtype": "struct vr::HmdVector3_t"}, +{ "fieldname": "vNormal", "fieldtype": "struct vr::HmdVector3_t"}, +{ "fieldname": "vUVs", "fieldtype": "struct vr::HmdVector2_t"}, +{ "fieldname": "fDistance", "fieldtype": "float"}]} +,{"struct": "vr::IntersectionMaskRectangle_t","fields": [ +{ "fieldname": "m_flTopLeftX", "fieldtype": "float"}, +{ "fieldname": "m_flTopLeftY", "fieldtype": "float"}, +{ "fieldname": "m_flWidth", "fieldtype": "float"}, +{ "fieldname": "m_flHeight", "fieldtype": "float"}]} +,{"struct": "vr::IntersectionMaskCircle_t","fields": [ +{ "fieldname": "m_flCenterX", "fieldtype": "float"}, +{ "fieldname": "m_flCenterY", "fieldtype": "float"}, +{ "fieldname": "m_flRadius", "fieldtype": "float"}]} +,{"struct": "vr::(anonymous)","fields": [ +{ "fieldname": "m_Rectangle", "fieldtype": "struct vr::IntersectionMaskRectangle_t"}, +{ "fieldname": "m_Circle", "fieldtype": "struct vr::IntersectionMaskCircle_t"}]} +,{"struct": "vr::VROverlayIntersectionMaskPrimitive_t","fields": [ +{ "fieldname": "m_nPrimitiveType", "fieldtype": "enum vr::EVROverlayIntersectionMaskPrimitiveType"}, +{ "fieldname": "m_Primitive", "fieldtype": "VROverlayIntersectionMaskPrimitive_Data_t"}]} +,{"struct": "vr::RenderModel_ComponentState_t","fields": [ +{ "fieldname": "mTrackingToComponentRenderModel", "fieldtype": "struct vr::HmdMatrix34_t"}, +{ "fieldname": "mTrackingToComponentLocal", "fieldtype": "struct vr::HmdMatrix34_t"}, +{ "fieldname": "uProperties", "fieldtype": "VRComponentProperties"}]} +,{"struct": "vr::RenderModel_Vertex_t","fields": [ +{ "fieldname": "vPosition", "fieldtype": "struct vr::HmdVector3_t"}, +{ "fieldname": "vNormal", "fieldtype": "struct vr::HmdVector3_t"}, +{ "fieldname": "rfTextureCoord", "fieldtype": "float [2]"}]} +,{"struct": "vr::RenderModel_TextureMap_t","fields": [ +{ "fieldname": "unWidth", "fieldtype": "uint16_t"}, +{ "fieldname": "unHeight", "fieldtype": "uint16_t"}, +{ "fieldname": "rubTextureMapData", "fieldtype": "const uint8_t *"}]} +,{"struct": "vr::RenderModel_t","fields": [ +{ "fieldname": "rVertexData", "fieldtype": "const struct vr::RenderModel_Vertex_t *"}, +{ "fieldname": "unVertexCount", "fieldtype": "uint32_t"}, +{ "fieldname": "rIndexData", "fieldtype": "const uint16_t *"}, +{ "fieldname": "unTriangleCount", "fieldtype": "uint32_t"}, +{ "fieldname": "diffuseTextureId", "fieldtype": "TextureID_t"}]} +,{"struct": "vr::RenderModel_ControllerMode_State_t","fields": [ +{ "fieldname": "bScrollWheelVisible", "fieldtype": "_Bool"}]} +,{"struct": "vr::NotificationBitmap_t","fields": [ +{ "fieldname": "m_pImageData", "fieldtype": "void *"}, +{ "fieldname": "m_nWidth", "fieldtype": "int32_t"}, +{ "fieldname": "m_nHeight", "fieldtype": "int32_t"}, +{ "fieldname": "m_nBytesPerPixel", "fieldtype": "int32_t"}]} +,{"struct": "vr::COpenVRContext","fields": [ +{ "fieldname": "m_pVRSystem", "fieldtype": "class vr::IVRSystem *"}, +{ "fieldname": "m_pVRChaperone", "fieldtype": "class vr::IVRChaperone *"}, +{ "fieldname": "m_pVRChaperoneSetup", "fieldtype": "class vr::IVRChaperoneSetup *"}, +{ "fieldname": "m_pVRCompositor", "fieldtype": "class vr::IVRCompositor *"}, +{ "fieldname": "m_pVROverlay", "fieldtype": "class vr::IVROverlay *"}, +{ "fieldname": "m_pVRResources", "fieldtype": "class vr::IVRResources *"}, +{ "fieldname": "m_pVRRenderModels", "fieldtype": "class vr::IVRRenderModels *"}, +{ "fieldname": "m_pVRExtendedDisplay", "fieldtype": "class vr::IVRExtendedDisplay *"}, +{ "fieldname": "m_pVRSettings", "fieldtype": "class vr::IVRSettings *"}, +{ "fieldname": "m_pVRApplications", "fieldtype": "class vr::IVRApplications *"}, +{ "fieldname": "m_pVRTrackedCamera", "fieldtype": "class vr::IVRTrackedCamera *"}, +{ "fieldname": "m_pVRScreenshots", "fieldtype": "class vr::IVRScreenshots *"}, +{ "fieldname": "m_pVRDriverManager", "fieldtype": "class vr::IVRDriverManager *"}]} +], +"methods":[{ + "classname": "vr::IVRSystem", + "methodname": "GetRecommendedRenderTargetSize", + "returntype": "void", + "params": [ +{ "paramname": "pnWidth" ,"paramtype": "uint32_t *"}, +{ "paramname": "pnHeight" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetProjectionMatrix", + "returntype": "struct vr::HmdMatrix44_t", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"}, +{ "paramname": "fNearZ" ,"paramtype": "float"}, +{ "paramname": "fFarZ" ,"paramtype": "float"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetProjectionRaw", + "returntype": "void", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"}, +{ "paramname": "pfLeft" ,"paramtype": "float *"}, +{ "paramname": "pfRight" ,"paramtype": "float *"}, +{ "paramname": "pfTop" ,"paramtype": "float *"}, +{ "paramname": "pfBottom" ,"paramtype": "float *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "ComputeDistortion", + "returntype": "bool", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"}, +{ "paramname": "fU" ,"paramtype": "float"}, +{ "paramname": "fV" ,"paramtype": "float"}, +{ "paramname": "pDistortionCoordinates" ,"paramtype": "struct vr::DistortionCoordinates_t *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetEyeToHeadTransform", + "returntype": "struct vr::HmdMatrix34_t", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetTimeSinceLastVsync", + "returntype": "bool", + "params": [ +{ "paramname": "pfSecondsSinceLastVsync" ,"paramtype": "float *"}, +{ "paramname": "pulFrameCounter" ,"paramtype": "uint64_t *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetD3D9AdapterIndex", + "returntype": "int32_t" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetDXGIOutputInfo", + "returntype": "void", + "params": [ +{ "paramname": "pnAdapterIndex" ,"paramtype": "int32_t *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetOutputDevice", + "returntype": "void", + "params": [ +{ "paramname": "pnDevice" ,"paramtype": "uint64_t *"}, +{ "paramname": "textureType" ,"paramtype": "vr::ETextureType"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "IsDisplayOnDesktop", + "returntype": "bool" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "SetDisplayVisibility", + "returntype": "bool", + "params": [ +{ "paramname": "bIsVisibleOnDesktop" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetDeviceToAbsoluteTrackingPose", + "returntype": "void", + "params": [ +{ "paramname": "eOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin"}, +{ "paramname": "fPredictedSecondsToPhotonsFromNow" ,"paramtype": "float"}, +{ "paramname": "pTrackedDevicePoseArray" ,"array_count": "unTrackedDevicePoseArrayCount" ,"paramtype": "struct vr::TrackedDevicePose_t *"}, +{ "paramname": "unTrackedDevicePoseArrayCount" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "ResetSeatedZeroPose", + "returntype": "void" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetSeatedZeroPoseToStandingAbsoluteTrackingPose", + "returntype": "struct vr::HmdMatrix34_t" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetRawZeroPoseToStandingAbsoluteTrackingPose", + "returntype": "struct vr::HmdMatrix34_t" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetSortedTrackedDeviceIndicesOfClass", + "returntype": "uint32_t", + "params": [ +{ "paramname": "eTrackedDeviceClass" ,"paramtype": "vr::ETrackedDeviceClass"}, +{ "paramname": "punTrackedDeviceIndexArray" ,"array_count": "unTrackedDeviceIndexArrayCount" ,"paramtype": "vr::TrackedDeviceIndex_t *"}, +{ "paramname": "unTrackedDeviceIndexArrayCount" ,"paramtype": "uint32_t"}, +{ "paramname": "unRelativeToTrackedDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetTrackedDeviceActivityLevel", + "returntype": "vr::EDeviceActivityLevel", + "params": [ +{ "paramname": "unDeviceId" ,"paramtype": "vr::TrackedDeviceIndex_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "ApplyTransform", + "returntype": "void", + "params": [ +{ "paramname": "pOutputPose" ,"paramtype": "struct vr::TrackedDevicePose_t *"}, +{ "paramname": "pTrackedDevicePose" ,"paramtype": "const struct vr::TrackedDevicePose_t *"}, +{ "paramname": "pTransform" ,"paramtype": "const struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetTrackedDeviceIndexForControllerRole", + "returntype": "vr::TrackedDeviceIndex_t", + "params": [ +{ "paramname": "unDeviceType" ,"paramtype": "vr::ETrackedControllerRole"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetControllerRoleForTrackedDeviceIndex", + "returntype": "vr::ETrackedControllerRole", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetTrackedDeviceClass", + "returntype": "vr::ETrackedDeviceClass", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "IsTrackedDeviceConnected", + "returntype": "bool", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetBoolTrackedDeviceProperty", + "returntype": "bool", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "prop" ,"paramtype": "vr::ETrackedDeviceProperty"}, +{ "paramname": "pError" ,"paramtype": "vr::ETrackedPropertyError *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetFloatTrackedDeviceProperty", + "returntype": "float", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "prop" ,"paramtype": "vr::ETrackedDeviceProperty"}, +{ "paramname": "pError" ,"paramtype": "vr::ETrackedPropertyError *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetInt32TrackedDeviceProperty", + "returntype": "int32_t", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "prop" ,"paramtype": "vr::ETrackedDeviceProperty"}, +{ "paramname": "pError" ,"paramtype": "vr::ETrackedPropertyError *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetUint64TrackedDeviceProperty", + "returntype": "uint64_t", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "prop" ,"paramtype": "vr::ETrackedDeviceProperty"}, +{ "paramname": "pError" ,"paramtype": "vr::ETrackedPropertyError *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetMatrix34TrackedDeviceProperty", + "returntype": "struct vr::HmdMatrix34_t", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "prop" ,"paramtype": "vr::ETrackedDeviceProperty"}, +{ "paramname": "pError" ,"paramtype": "vr::ETrackedPropertyError *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetStringTrackedDeviceProperty", + "returntype": "uint32_t", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "prop" ,"paramtype": "vr::ETrackedDeviceProperty"}, +{ "paramname": "pchValue" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"}, +{ "paramname": "pError" ,"paramtype": "vr::ETrackedPropertyError *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetPropErrorNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "error" ,"paramtype": "vr::ETrackedPropertyError"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "PollNextEvent", + "returntype": "bool", + "params": [ +{ "paramname": "pEvent" ,"paramtype": "struct vr::VREvent_t *"}, +{ "paramname": "uncbVREvent" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "PollNextEventWithPose", + "returntype": "bool", + "params": [ +{ "paramname": "eOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin"}, +{ "paramname": "pEvent" ,"paramtype": "struct vr::VREvent_t *"}, +{ "paramname": "uncbVREvent" ,"paramtype": "uint32_t"}, +{ "paramname": "pTrackedDevicePose" ,"paramtype": "vr::TrackedDevicePose_t *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetEventTypeNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "eType" ,"paramtype": "vr::EVREventType"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetHiddenAreaMesh", + "returntype": "struct vr::HiddenAreaMesh_t", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"}, +{ "paramname": "type" ,"paramtype": "vr::EHiddenAreaMeshType"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetControllerState", + "returntype": "bool", + "params": [ +{ "paramname": "unControllerDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "pControllerState" ,"paramtype": "vr::VRControllerState_t *"}, +{ "paramname": "unControllerStateSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetControllerStateWithPose", + "returntype": "bool", + "params": [ +{ "paramname": "eOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin"}, +{ "paramname": "unControllerDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "pControllerState" ,"paramtype": "vr::VRControllerState_t *"}, +{ "paramname": "unControllerStateSize" ,"paramtype": "uint32_t"}, +{ "paramname": "pTrackedDevicePose" ,"paramtype": "struct vr::TrackedDevicePose_t *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "TriggerHapticPulse", + "returntype": "void", + "params": [ +{ "paramname": "unControllerDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "unAxisId" ,"paramtype": "uint32_t"}, +{ "paramname": "usDurationMicroSec" ,"paramtype": "unsigned short"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetButtonIdNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "eButtonId" ,"paramtype": "vr::EVRButtonId"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetControllerAxisTypeNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "eAxisType" ,"paramtype": "vr::EVRControllerAxisType"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "CaptureInputFocus", + "returntype": "bool" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "ReleaseInputFocus", + "returntype": "void" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "IsInputFocusCapturedByAnotherProcess", + "returntype": "bool" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "DriverDebugRequest", + "returntype": "uint32_t", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "pchRequest" ,"paramtype": "const char *"}, +{ "paramname": "pchResponseBuffer" ,"paramtype": "char *"}, +{ "paramname": "unResponseBufferSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "PerformFirmwareUpdate", + "returntype": "vr::EVRFirmwareError", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "AcknowledgeQuit_Exiting", + "returntype": "void" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "AcknowledgeQuit_UserPrompt", + "returntype": "void" +} +,{ + "classname": "vr::IVRExtendedDisplay", + "methodname": "GetWindowBounds", + "returntype": "void", + "params": [ +{ "paramname": "pnX" ,"paramtype": "int32_t *"}, +{ "paramname": "pnY" ,"paramtype": "int32_t *"}, +{ "paramname": "pnWidth" ,"paramtype": "uint32_t *"}, +{ "paramname": "pnHeight" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRExtendedDisplay", + "methodname": "GetEyeOutputViewport", + "returntype": "void", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"}, +{ "paramname": "pnX" ,"paramtype": "uint32_t *"}, +{ "paramname": "pnY" ,"paramtype": "uint32_t *"}, +{ "paramname": "pnWidth" ,"paramtype": "uint32_t *"}, +{ "paramname": "pnHeight" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRExtendedDisplay", + "methodname": "GetDXGIOutputInfo", + "returntype": "void", + "params": [ +{ "paramname": "pnAdapterIndex" ,"paramtype": "int32_t *"}, +{ "paramname": "pnAdapterOutputIndex" ,"paramtype": "int32_t *"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "GetCameraErrorNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "eCameraError" ,"paramtype": "vr::EVRTrackedCameraError"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "HasCamera", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "nDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "pHasCamera" ,"paramtype": "bool *"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "GetCameraFrameSize", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "nDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "eFrameType" ,"paramtype": "vr::EVRTrackedCameraFrameType"}, +{ "paramname": "pnWidth" ,"paramtype": "uint32_t *"}, +{ "paramname": "pnHeight" ,"paramtype": "uint32_t *"}, +{ "paramname": "pnFrameBufferSize" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "GetCameraIntrinsics", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "nDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "eFrameType" ,"paramtype": "vr::EVRTrackedCameraFrameType"}, +{ "paramname": "pFocalLength" ,"paramtype": "vr::HmdVector2_t *"}, +{ "paramname": "pCenter" ,"paramtype": "vr::HmdVector2_t *"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "GetCameraProjection", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "nDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "eFrameType" ,"paramtype": "vr::EVRTrackedCameraFrameType"}, +{ "paramname": "flZNear" ,"paramtype": "float"}, +{ "paramname": "flZFar" ,"paramtype": "float"}, +{ "paramname": "pProjection" ,"paramtype": "vr::HmdMatrix44_t *"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "AcquireVideoStreamingService", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "nDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "pHandle" ,"paramtype": "vr::TrackedCameraHandle_t *"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "ReleaseVideoStreamingService", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "hTrackedCamera" ,"paramtype": "vr::TrackedCameraHandle_t"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "GetVideoStreamFrameBuffer", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "hTrackedCamera" ,"paramtype": "vr::TrackedCameraHandle_t"}, +{ "paramname": "eFrameType" ,"paramtype": "vr::EVRTrackedCameraFrameType"}, +{ "paramname": "pFrameBuffer" ,"paramtype": "void *"}, +{ "paramname": "nFrameBufferSize" ,"paramtype": "uint32_t"}, +{ "paramname": "pFrameHeader" ,"paramtype": "vr::CameraVideoStreamFrameHeader_t *"}, +{ "paramname": "nFrameHeaderSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "GetVideoStreamTextureSize", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "nDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "eFrameType" ,"paramtype": "vr::EVRTrackedCameraFrameType"}, +{ "paramname": "pTextureBounds" ,"paramtype": "vr::VRTextureBounds_t *"}, +{ "paramname": "pnWidth" ,"paramtype": "uint32_t *"}, +{ "paramname": "pnHeight" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "GetVideoStreamTextureD3D11", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "hTrackedCamera" ,"paramtype": "vr::TrackedCameraHandle_t"}, +{ "paramname": "eFrameType" ,"paramtype": "vr::EVRTrackedCameraFrameType"}, +{ "paramname": "pD3D11DeviceOrResource" ,"paramtype": "void *"}, +{ "paramname": "ppD3D11ShaderResourceView" ,"paramtype": "void **"}, +{ "paramname": "pFrameHeader" ,"paramtype": "vr::CameraVideoStreamFrameHeader_t *"}, +{ "paramname": "nFrameHeaderSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "GetVideoStreamTextureGL", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "hTrackedCamera" ,"paramtype": "vr::TrackedCameraHandle_t"}, +{ "paramname": "eFrameType" ,"paramtype": "vr::EVRTrackedCameraFrameType"}, +{ "paramname": "pglTextureId" ,"paramtype": "vr::glUInt_t *"}, +{ "paramname": "pFrameHeader" ,"paramtype": "vr::CameraVideoStreamFrameHeader_t *"}, +{ "paramname": "nFrameHeaderSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "ReleaseVideoStreamTextureGL", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "hTrackedCamera" ,"paramtype": "vr::TrackedCameraHandle_t"}, +{ "paramname": "glTextureId" ,"paramtype": "vr::glUInt_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "AddApplicationManifest", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchApplicationManifestFullPath" ,"paramtype": "const char *"}, +{ "paramname": "bTemporary" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "RemoveApplicationManifest", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchApplicationManifestFullPath" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "IsApplicationInstalled", + "returntype": "bool", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationCount", + "returntype": "uint32_t" +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationKeyByIndex", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "unApplicationIndex" ,"paramtype": "uint32_t"}, +{ "paramname": "pchAppKeyBuffer" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unAppKeyBufferLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationKeyByProcessId", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "unProcessId" ,"paramtype": "uint32_t"}, +{ "paramname": "pchAppKeyBuffer" ,"paramtype": "char *"}, +{ "paramname": "unAppKeyBufferLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "LaunchApplication", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "LaunchTemplateApplication", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchTemplateAppKey" ,"paramtype": "const char *"}, +{ "paramname": "pchNewAppKey" ,"paramtype": "const char *"}, +{ "paramname": "pKeys" ,"array_count": "unKeys" ,"paramtype": "const struct vr::AppOverrideKeys_t *"}, +{ "paramname": "unKeys" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "LaunchApplicationFromMimeType", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchMimeType" ,"paramtype": "const char *"}, +{ "paramname": "pchArgs" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "LaunchDashboardOverlay", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "CancelApplicationLaunch", + "returntype": "bool", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "IdentifyApplication", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "unProcessId" ,"paramtype": "uint32_t"}, +{ "paramname": "pchAppKey" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationProcessId", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationsErrorNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "error" ,"paramtype": "vr::EVRApplicationError"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationPropertyString", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"}, +{ "paramname": "eProperty" ,"paramtype": "vr::EVRApplicationProperty"}, +{ "paramname": "pchPropertyValueBuffer" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unPropertyValueBufferLen" ,"paramtype": "uint32_t"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRApplicationError *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationPropertyBool", + "returntype": "bool", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"}, +{ "paramname": "eProperty" ,"paramtype": "vr::EVRApplicationProperty"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRApplicationError *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationPropertyUint64", + "returntype": "uint64_t", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"}, +{ "paramname": "eProperty" ,"paramtype": "vr::EVRApplicationProperty"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRApplicationError *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "SetApplicationAutoLaunch", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"}, +{ "paramname": "bAutoLaunch" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationAutoLaunch", + "returntype": "bool", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "SetDefaultApplicationForMimeType", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"}, +{ "paramname": "pchMimeType" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetDefaultApplicationForMimeType", + "returntype": "bool", + "params": [ +{ "paramname": "pchMimeType" ,"paramtype": "const char *"}, +{ "paramname": "pchAppKeyBuffer" ,"paramtype": "char *"}, +{ "paramname": "unAppKeyBufferLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationSupportedMimeTypes", + "returntype": "bool", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"}, +{ "paramname": "pchMimeTypesBuffer" ,"paramtype": "char *"}, +{ "paramname": "unMimeTypesBuffer" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationsThatSupportMimeType", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchMimeType" ,"paramtype": "const char *"}, +{ "paramname": "pchAppKeysThatSupportBuffer" ,"paramtype": "char *"}, +{ "paramname": "unAppKeysThatSupportBuffer" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationLaunchArguments", + "returntype": "uint32_t", + "params": [ +{ "paramname": "unHandle" ,"paramtype": "uint32_t"}, +{ "paramname": "pchArgs" ,"paramtype": "char *"}, +{ "paramname": "unArgs" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetStartingApplication", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchAppKeyBuffer" ,"paramtype": "char *"}, +{ "paramname": "unAppKeyBufferLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetTransitionState", + "returntype": "vr::EVRApplicationTransitionState" +} +,{ + "classname": "vr::IVRApplications", + "methodname": "PerformApplicationPrelaunchCheck", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationsTransitionStateNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "state" ,"paramtype": "vr::EVRApplicationTransitionState"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "IsQuitUserPromptRequested", + "returntype": "bool" +} +,{ + "classname": "vr::IVRApplications", + "methodname": "LaunchInternalProcess", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchBinaryPath" ,"paramtype": "const char *"}, +{ "paramname": "pchArguments" ,"paramtype": "const char *"}, +{ "paramname": "pchWorkingDirectory" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetCurrentSceneProcessId", + "returntype": "uint32_t" +} +,{ + "classname": "vr::IVRChaperone", + "methodname": "GetCalibrationState", + "returntype": "vr::ChaperoneCalibrationState" +} +,{ + "classname": "vr::IVRChaperone", + "methodname": "GetPlayAreaSize", + "returntype": "bool", + "params": [ +{ "paramname": "pSizeX" ,"paramtype": "float *"}, +{ "paramname": "pSizeZ" ,"paramtype": "float *"} + ] +} +,{ + "classname": "vr::IVRChaperone", + "methodname": "GetPlayAreaRect", + "returntype": "bool", + "params": [ +{ "paramname": "rect" ,"paramtype": "struct vr::HmdQuad_t *"} + ] +} +,{ + "classname": "vr::IVRChaperone", + "methodname": "ReloadInfo", + "returntype": "void" +} +,{ + "classname": "vr::IVRChaperone", + "methodname": "SetSceneColor", + "returntype": "void", + "params": [ +{ "paramname": "color" ,"paramtype": "struct vr::HmdColor_t"} + ] +} +,{ + "classname": "vr::IVRChaperone", + "methodname": "GetBoundsColor", + "returntype": "void", + "params": [ +{ "paramname": "pOutputColorArray" ,"paramtype": "struct vr::HmdColor_t *"}, +{ "paramname": "nNumOutputColors" ,"paramtype": "int"}, +{ "paramname": "flCollisionBoundsFadeDistance" ,"paramtype": "float"}, +{ "paramname": "pOutputCameraColor" ,"paramtype": "struct vr::HmdColor_t *"} + ] +} +,{ + "classname": "vr::IVRChaperone", + "methodname": "AreBoundsVisible", + "returntype": "bool" +} +,{ + "classname": "vr::IVRChaperone", + "methodname": "ForceBoundsVisible", + "returntype": "void", + "params": [ +{ "paramname": "bForce" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "CommitWorkingCopy", + "returntype": "bool", + "params": [ +{ "paramname": "configFile" ,"paramtype": "vr::EChaperoneConfigFile"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "RevertWorkingCopy", + "returntype": "void" +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetWorkingPlayAreaSize", + "returntype": "bool", + "params": [ +{ "paramname": "pSizeX" ,"paramtype": "float *"}, +{ "paramname": "pSizeZ" ,"paramtype": "float *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetWorkingPlayAreaRect", + "returntype": "bool", + "params": [ +{ "paramname": "rect" ,"paramtype": "struct vr::HmdQuad_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetWorkingCollisionBoundsInfo", + "returntype": "bool", + "params": [ +{ "paramname": "pQuadsBuffer" ,"out_array_count": "punQuadsCount" ,"paramtype": "struct vr::HmdQuad_t *"}, +{ "paramname": "punQuadsCount" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetLiveCollisionBoundsInfo", + "returntype": "bool", + "params": [ +{ "paramname": "pQuadsBuffer" ,"out_array_count": "punQuadsCount" ,"paramtype": "struct vr::HmdQuad_t *"}, +{ "paramname": "punQuadsCount" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetWorkingSeatedZeroPoseToRawTrackingPose", + "returntype": "bool", + "params": [ +{ "paramname": "pmatSeatedZeroPoseToRawTrackingPose" ,"paramtype": "struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetWorkingStandingZeroPoseToRawTrackingPose", + "returntype": "bool", + "params": [ +{ "paramname": "pmatStandingZeroPoseToRawTrackingPose" ,"paramtype": "struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "SetWorkingPlayAreaSize", + "returntype": "void", + "params": [ +{ "paramname": "sizeX" ,"paramtype": "float"}, +{ "paramname": "sizeZ" ,"paramtype": "float"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "SetWorkingCollisionBoundsInfo", + "returntype": "void", + "params": [ +{ "paramname": "pQuadsBuffer" ,"array_count": "unQuadsCount" ,"paramtype": "struct vr::HmdQuad_t *"}, +{ "paramname": "unQuadsCount" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "SetWorkingSeatedZeroPoseToRawTrackingPose", + "returntype": "void", + "params": [ +{ "paramname": "pMatSeatedZeroPoseToRawTrackingPose" ,"paramtype": "const struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "SetWorkingStandingZeroPoseToRawTrackingPose", + "returntype": "void", + "params": [ +{ "paramname": "pMatStandingZeroPoseToRawTrackingPose" ,"paramtype": "const struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "ReloadFromDisk", + "returntype": "void", + "params": [ +{ "paramname": "configFile" ,"paramtype": "vr::EChaperoneConfigFile"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetLiveSeatedZeroPoseToRawTrackingPose", + "returntype": "bool", + "params": [ +{ "paramname": "pmatSeatedZeroPoseToRawTrackingPose" ,"paramtype": "struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "SetWorkingCollisionBoundsTagsInfo", + "returntype": "void", + "params": [ +{ "paramname": "pTagsBuffer" ,"array_count": "unTagCount" ,"paramtype": "uint8_t *"}, +{ "paramname": "unTagCount" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetLiveCollisionBoundsTagsInfo", + "returntype": "bool", + "params": [ +{ "paramname": "pTagsBuffer" ,"out_array_count": "punTagCount" ,"paramtype": "uint8_t *"}, +{ "paramname": "punTagCount" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "SetWorkingPhysicalBoundsInfo", + "returntype": "bool", + "params": [ +{ "paramname": "pQuadsBuffer" ,"array_count": "unQuadsCount" ,"paramtype": "struct vr::HmdQuad_t *"}, +{ "paramname": "unQuadsCount" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetLivePhysicalBoundsInfo", + "returntype": "bool", + "params": [ +{ "paramname": "pQuadsBuffer" ,"out_array_count": "punQuadsCount" ,"paramtype": "struct vr::HmdQuad_t *"}, +{ "paramname": "punQuadsCount" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "ExportLiveToBuffer", + "returntype": "bool", + "params": [ +{ "paramname": "pBuffer" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "pnBufferLength" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "ImportFromBufferToWorking", + "returntype": "bool", + "params": [ +{ "paramname": "pBuffer" ,"paramtype": "const char *"}, +{ "paramname": "nImportFlags" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "SetTrackingSpace", + "returntype": "void", + "params": [ +{ "paramname": "eOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetTrackingSpace", + "returntype": "vr::ETrackingUniverseOrigin" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "WaitGetPoses", + "returntype": "vr::EVRCompositorError", + "params": [ +{ "paramname": "pRenderPoseArray" ,"array_count": "unRenderPoseArrayCount" ,"paramtype": "struct vr::TrackedDevicePose_t *"}, +{ "paramname": "unRenderPoseArrayCount" ,"paramtype": "uint32_t"}, +{ "paramname": "pGamePoseArray" ,"array_count": "unGamePoseArrayCount" ,"paramtype": "struct vr::TrackedDevicePose_t *"}, +{ "paramname": "unGamePoseArrayCount" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetLastPoses", + "returntype": "vr::EVRCompositorError", + "params": [ +{ "paramname": "pRenderPoseArray" ,"array_count": "unRenderPoseArrayCount" ,"paramtype": "struct vr::TrackedDevicePose_t *"}, +{ "paramname": "unRenderPoseArrayCount" ,"paramtype": "uint32_t"}, +{ "paramname": "pGamePoseArray" ,"array_count": "unGamePoseArrayCount" ,"paramtype": "struct vr::TrackedDevicePose_t *"}, +{ "paramname": "unGamePoseArrayCount" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetLastPoseForTrackedDeviceIndex", + "returntype": "vr::EVRCompositorError", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "pOutputPose" ,"paramtype": "struct vr::TrackedDevicePose_t *"}, +{ "paramname": "pOutputGamePose" ,"paramtype": "struct vr::TrackedDevicePose_t *"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "Submit", + "returntype": "vr::EVRCompositorError", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"}, +{ "paramname": "pTexture" ,"paramtype": "const struct vr::Texture_t *"}, +{ "paramname": "pBounds" ,"paramtype": "const struct vr::VRTextureBounds_t *"}, +{ "paramname": "nSubmitFlags" ,"paramtype": "vr::EVRSubmitFlags"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "ClearLastSubmittedFrame", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "PostPresentHandoff", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetFrameTiming", + "returntype": "bool", + "params": [ +{ "paramname": "pTiming" ,"paramtype": "struct vr::Compositor_FrameTiming *"}, +{ "paramname": "unFramesAgo" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetFrameTimings", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pTiming" ,"paramtype": "struct vr::Compositor_FrameTiming *"}, +{ "paramname": "nFrames" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetFrameTimeRemaining", + "returntype": "float" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetCumulativeStats", + "returntype": "void", + "params": [ +{ "paramname": "pStats" ,"paramtype": "struct vr::Compositor_CumulativeStats *"}, +{ "paramname": "nStatsSizeInBytes" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "FadeToColor", + "returntype": "void", + "params": [ +{ "paramname": "fSeconds" ,"paramtype": "float"}, +{ "paramname": "fRed" ,"paramtype": "float"}, +{ "paramname": "fGreen" ,"paramtype": "float"}, +{ "paramname": "fBlue" ,"paramtype": "float"}, +{ "paramname": "fAlpha" ,"paramtype": "float"}, +{ "paramname": "bBackground" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetCurrentFadeColor", + "returntype": "struct vr::HmdColor_t", + "params": [ +{ "paramname": "bBackground" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "FadeGrid", + "returntype": "void", + "params": [ +{ "paramname": "fSeconds" ,"paramtype": "float"}, +{ "paramname": "bFadeIn" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetCurrentGridAlpha", + "returntype": "float" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "SetSkyboxOverride", + "returntype": "vr::EVRCompositorError", + "params": [ +{ "paramname": "pTextures" ,"array_count": "unTextureCount" ,"paramtype": "const struct vr::Texture_t *"}, +{ "paramname": "unTextureCount" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "ClearSkyboxOverride", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "CompositorBringToFront", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "CompositorGoToBack", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "CompositorQuit", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "IsFullscreen", + "returntype": "bool" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetCurrentSceneFocusProcess", + "returntype": "uint32_t" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetLastFrameRenderer", + "returntype": "uint32_t" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "CanRenderScene", + "returntype": "bool" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "ShowMirrorWindow", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "HideMirrorWindow", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "IsMirrorWindowVisible", + "returntype": "bool" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "CompositorDumpImages", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "ShouldAppRenderWithLowResources", + "returntype": "bool" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "ForceInterleavedReprojectionOn", + "returntype": "void", + "params": [ +{ "paramname": "bOverride" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "ForceReconnectProcess", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "SuspendRendering", + "returntype": "void", + "params": [ +{ "paramname": "bSuspend" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetMirrorTextureD3D11", + "returntype": "vr::EVRCompositorError", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"}, +{ "paramname": "pD3D11DeviceOrResource" ,"paramtype": "void *"}, +{ "paramname": "ppD3D11ShaderResourceView" ,"paramtype": "void **"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "ReleaseMirrorTextureD3D11", + "returntype": "void", + "params": [ +{ "paramname": "pD3D11ShaderResourceView" ,"paramtype": "void *"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetMirrorTextureGL", + "returntype": "vr::EVRCompositorError", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"}, +{ "paramname": "pglTextureId" ,"paramtype": "vr::glUInt_t *"}, +{ "paramname": "pglSharedTextureHandle" ,"paramtype": "vr::glSharedTextureHandle_t *"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "ReleaseSharedGLTexture", + "returntype": "bool", + "params": [ +{ "paramname": "glTextureId" ,"paramtype": "vr::glUInt_t"}, +{ "paramname": "glSharedTextureHandle" ,"paramtype": "vr::glSharedTextureHandle_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "LockGLSharedTextureForAccess", + "returntype": "void", + "params": [ +{ "paramname": "glSharedTextureHandle" ,"paramtype": "vr::glSharedTextureHandle_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "UnlockGLSharedTextureForAccess", + "returntype": "void", + "params": [ +{ "paramname": "glSharedTextureHandle" ,"paramtype": "vr::glSharedTextureHandle_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetVulkanInstanceExtensionsRequired", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchValue" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetVulkanDeviceExtensionsRequired", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pPhysicalDevice" ,"paramtype": "struct VkPhysicalDevice_T *"}, +{ "paramname": "pchValue" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "FindOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "pchOverlayKey" ,"paramtype": "const char *"}, +{ "paramname": "pOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "CreateOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "pchOverlayKey" ,"paramtype": "const char *"}, +{ "paramname": "pchOverlayName" ,"paramtype": "const char *"}, +{ "paramname": "pOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "DestroyOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetHighQualityOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetHighQualityOverlay", + "returntype": "vr::VROverlayHandle_t" +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayKey", + "returntype": "uint32_t", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pchValue" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"}, +{ "paramname": "pError" ,"paramtype": "vr::EVROverlayError *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayName", + "returntype": "uint32_t", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pchValue" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"}, +{ "paramname": "pError" ,"paramtype": "vr::EVROverlayError *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayName", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pchName" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayImageData", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pvBuffer" ,"paramtype": "void *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"}, +{ "paramname": "punWidth" ,"paramtype": "uint32_t *"}, +{ "paramname": "punHeight" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayErrorNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "error" ,"paramtype": "vr::EVROverlayError"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayRenderingPid", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "unPID" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayRenderingPid", + "returntype": "uint32_t", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayFlag", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "eOverlayFlag" ,"paramtype": "vr::VROverlayFlags"}, +{ "paramname": "bEnabled" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayFlag", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "eOverlayFlag" ,"paramtype": "vr::VROverlayFlags"}, +{ "paramname": "pbEnabled" ,"paramtype": "bool *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayColor", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "fRed" ,"paramtype": "float"}, +{ "paramname": "fGreen" ,"paramtype": "float"}, +{ "paramname": "fBlue" ,"paramtype": "float"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayColor", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pfRed" ,"paramtype": "float *"}, +{ "paramname": "pfGreen" ,"paramtype": "float *"}, +{ "paramname": "pfBlue" ,"paramtype": "float *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayAlpha", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "fAlpha" ,"paramtype": "float"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayAlpha", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pfAlpha" ,"paramtype": "float *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayTexelAspect", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "fTexelAspect" ,"paramtype": "float"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTexelAspect", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pfTexelAspect" ,"paramtype": "float *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlaySortOrder", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "unSortOrder" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlaySortOrder", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "punSortOrder" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayWidthInMeters", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "fWidthInMeters" ,"paramtype": "float"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayWidthInMeters", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pfWidthInMeters" ,"paramtype": "float *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayAutoCurveDistanceRangeInMeters", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "fMinDistanceInMeters" ,"paramtype": "float"}, +{ "paramname": "fMaxDistanceInMeters" ,"paramtype": "float"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayAutoCurveDistanceRangeInMeters", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pfMinDistanceInMeters" ,"paramtype": "float *"}, +{ "paramname": "pfMaxDistanceInMeters" ,"paramtype": "float *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayTextureColorSpace", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "eTextureColorSpace" ,"paramtype": "vr::EColorSpace"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTextureColorSpace", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "peTextureColorSpace" ,"paramtype": "vr::EColorSpace *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayTextureBounds", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pOverlayTextureBounds" ,"paramtype": "const struct vr::VRTextureBounds_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTextureBounds", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pOverlayTextureBounds" ,"paramtype": "struct vr::VRTextureBounds_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayRenderModel", + "returntype": "uint32_t", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pchValue" ,"paramtype": "char *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"}, +{ "paramname": "pColor" ,"paramtype": "struct vr::HmdColor_t *"}, +{ "paramname": "pError" ,"paramtype": "vr::EVROverlayError *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayRenderModel", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pchRenderModel" ,"paramtype": "const char *"}, +{ "paramname": "pColor" ,"paramtype": "const struct vr::HmdColor_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTransformType", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "peTransformType" ,"paramtype": "vr::VROverlayTransformType *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayTransformAbsolute", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "eTrackingOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin"}, +{ "paramname": "pmatTrackingOriginToOverlayTransform" ,"paramtype": "const struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTransformAbsolute", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "peTrackingOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin *"}, +{ "paramname": "pmatTrackingOriginToOverlayTransform" ,"paramtype": "struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayTransformTrackedDeviceRelative", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "unTrackedDevice" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "pmatTrackedDeviceToOverlayTransform" ,"paramtype": "const struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTransformTrackedDeviceRelative", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "punTrackedDevice" ,"paramtype": "vr::TrackedDeviceIndex_t *"}, +{ "paramname": "pmatTrackedDeviceToOverlayTransform" ,"paramtype": "struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayTransformTrackedDeviceComponent", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "pchComponentName" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTransformTrackedDeviceComponent", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "punDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t *"}, +{ "paramname": "pchComponentName" ,"paramtype": "char *"}, +{ "paramname": "unComponentNameSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTransformOverlayRelative", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "ulOverlayHandleParent" ,"paramtype": "vr::VROverlayHandle_t *"}, +{ "paramname": "pmatParentOverlayToOverlayTransform" ,"paramtype": "struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayTransformOverlayRelative", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "ulOverlayHandleParent" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pmatParentOverlayToOverlayTransform" ,"paramtype": "const struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "ShowOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "HideOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "IsOverlayVisible", + "returntype": "bool", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetTransformForOverlayCoordinates", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "eTrackingOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin"}, +{ "paramname": "coordinatesInOverlay" ,"paramtype": "struct vr::HmdVector2_t"}, +{ "paramname": "pmatTransform" ,"paramtype": "struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "PollNextOverlayEvent", + "returntype": "bool", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pEvent" ,"paramtype": "struct vr::VREvent_t *"}, +{ "paramname": "uncbVREvent" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayInputMethod", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "peInputMethod" ,"paramtype": "vr::VROverlayInputMethod *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayInputMethod", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "eInputMethod" ,"paramtype": "vr::VROverlayInputMethod"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayMouseScale", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pvecMouseScale" ,"paramtype": "struct vr::HmdVector2_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayMouseScale", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pvecMouseScale" ,"paramtype": "const struct vr::HmdVector2_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "ComputeOverlayIntersection", + "returntype": "bool", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pParams" ,"paramtype": "const struct vr::VROverlayIntersectionParams_t *"}, +{ "paramname": "pResults" ,"paramtype": "struct vr::VROverlayIntersectionResults_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "HandleControllerOverlayInteractionAsMouse", + "returntype": "bool", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "unControllerDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "IsHoverTargetOverlay", + "returntype": "bool", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetGamepadFocusOverlay", + "returntype": "vr::VROverlayHandle_t" +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetGamepadFocusOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulNewFocusOverlay" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayNeighbor", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "eDirection" ,"paramtype": "vr::EOverlayDirection"}, +{ "paramname": "ulFrom" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "ulTo" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "MoveGamepadFocusToNeighbor", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "eDirection" ,"paramtype": "vr::EOverlayDirection"}, +{ "paramname": "ulFrom" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayTexture", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pTexture" ,"paramtype": "const struct vr::Texture_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "ClearOverlayTexture", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayRaw", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pvBuffer" ,"paramtype": "void *"}, +{ "paramname": "unWidth" ,"paramtype": "uint32_t"}, +{ "paramname": "unHeight" ,"paramtype": "uint32_t"}, +{ "paramname": "unDepth" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayFromFile", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pchFilePath" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTexture", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pNativeTextureHandle" ,"paramtype": "void **"}, +{ "paramname": "pNativeTextureRef" ,"paramtype": "void *"}, +{ "paramname": "pWidth" ,"paramtype": "uint32_t *"}, +{ "paramname": "pHeight" ,"paramtype": "uint32_t *"}, +{ "paramname": "pNativeFormat" ,"paramtype": "uint32_t *"}, +{ "paramname": "pAPIType" ,"paramtype": "vr::ETextureType *"}, +{ "paramname": "pColorSpace" ,"paramtype": "vr::EColorSpace *"}, +{ "paramname": "pTextureBounds" ,"paramtype": "struct vr::VRTextureBounds_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "ReleaseNativeOverlayHandle", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pNativeTextureHandle" ,"paramtype": "void *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTextureSize", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pWidth" ,"paramtype": "uint32_t *"}, +{ "paramname": "pHeight" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "CreateDashboardOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "pchOverlayKey" ,"paramtype": "const char *"}, +{ "paramname": "pchOverlayFriendlyName" ,"paramtype": "const char *"}, +{ "paramname": "pMainHandle" ,"paramtype": "vr::VROverlayHandle_t *"}, +{ "paramname": "pThumbnailHandle" ,"paramtype": "vr::VROverlayHandle_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "IsDashboardVisible", + "returntype": "bool" +} +,{ + "classname": "vr::IVROverlay", + "methodname": "IsActiveDashboardOverlay", + "returntype": "bool", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetDashboardOverlaySceneProcess", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "unProcessId" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetDashboardOverlaySceneProcess", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "punProcessId" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "ShowDashboard", + "returntype": "void", + "params": [ +{ "paramname": "pchOverlayToShow" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetPrimaryDashboardDevice", + "returntype": "vr::TrackedDeviceIndex_t" +} +,{ + "classname": "vr::IVROverlay", + "methodname": "ShowKeyboard", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "eInputMode" ,"paramtype": "vr::EGamepadTextInputMode"}, +{ "paramname": "eLineInputMode" ,"paramtype": "vr::EGamepadTextInputLineMode"}, +{ "paramname": "pchDescription" ,"paramtype": "const char *"}, +{ "paramname": "unCharMax" ,"paramtype": "uint32_t"}, +{ "paramname": "pchExistingText" ,"paramtype": "const char *"}, +{ "paramname": "bUseMinimalMode" ,"paramtype": "bool"}, +{ "paramname": "uUserValue" ,"paramtype": "uint64_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "ShowKeyboardForOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "eInputMode" ,"paramtype": "vr::EGamepadTextInputMode"}, +{ "paramname": "eLineInputMode" ,"paramtype": "vr::EGamepadTextInputLineMode"}, +{ "paramname": "pchDescription" ,"paramtype": "const char *"}, +{ "paramname": "unCharMax" ,"paramtype": "uint32_t"}, +{ "paramname": "pchExistingText" ,"paramtype": "const char *"}, +{ "paramname": "bUseMinimalMode" ,"paramtype": "bool"}, +{ "paramname": "uUserValue" ,"paramtype": "uint64_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetKeyboardText", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchText" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "cchText" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "HideKeyboard", + "returntype": "void" +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetKeyboardTransformAbsolute", + "returntype": "void", + "params": [ +{ "paramname": "eTrackingOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin"}, +{ "paramname": "pmatTrackingOriginToKeyboardTransform" ,"paramtype": "const struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetKeyboardPositionForOverlay", + "returntype": "void", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "avoidRect" ,"paramtype": "struct vr::HmdRect2_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayIntersectionMask", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pMaskPrimitives" ,"paramtype": "struct vr::VROverlayIntersectionMaskPrimitive_t *"}, +{ "paramname": "unNumMaskPrimitives" ,"paramtype": "uint32_t"}, +{ "paramname": "unPrimitiveSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayFlags", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pFlags" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "ShowMessageOverlay", + "returntype": "vr::VRMessageOverlayResponse", + "params": [ +{ "paramname": "pchText" ,"paramtype": "const char *"}, +{ "paramname": "pchCaption" ,"paramtype": "const char *"}, +{ "paramname": "pchButton0Text" ,"paramtype": "const char *"}, +{ "paramname": "pchButton1Text" ,"paramtype": "const char *"}, +{ "paramname": "pchButton2Text" ,"paramtype": "const char *"}, +{ "paramname": "pchButton3Text" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "LoadRenderModel_Async", + "returntype": "vr::EVRRenderModelError", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"}, +{ "paramname": "ppRenderModel" ,"paramtype": "struct vr::RenderModel_t **"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "FreeRenderModel", + "returntype": "void", + "params": [ +{ "paramname": "pRenderModel" ,"paramtype": "struct vr::RenderModel_t *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "LoadTexture_Async", + "returntype": "vr::EVRRenderModelError", + "params": [ +{ "paramname": "textureId" ,"paramtype": "vr::TextureID_t"}, +{ "paramname": "ppTexture" ,"paramtype": "struct vr::RenderModel_TextureMap_t **"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "FreeTexture", + "returntype": "void", + "params": [ +{ "paramname": "pTexture" ,"paramtype": "struct vr::RenderModel_TextureMap_t *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "LoadTextureD3D11_Async", + "returntype": "vr::EVRRenderModelError", + "params": [ +{ "paramname": "textureId" ,"paramtype": "vr::TextureID_t"}, +{ "paramname": "pD3D11Device" ,"paramtype": "void *"}, +{ "paramname": "ppD3D11Texture2D" ,"paramtype": "void **"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "LoadIntoTextureD3D11_Async", + "returntype": "vr::EVRRenderModelError", + "params": [ +{ "paramname": "textureId" ,"paramtype": "vr::TextureID_t"}, +{ "paramname": "pDstTexture" ,"paramtype": "void *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "FreeTextureD3D11", + "returntype": "void", + "params": [ +{ "paramname": "pD3D11Texture2D" ,"paramtype": "void *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetRenderModelName", + "returntype": "uint32_t", + "params": [ +{ "paramname": "unRenderModelIndex" ,"paramtype": "uint32_t"}, +{ "paramname": "pchRenderModelName" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unRenderModelNameLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetRenderModelCount", + "returntype": "uint32_t" +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetComponentCount", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetComponentName", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"}, +{ "paramname": "unComponentIndex" ,"paramtype": "uint32_t"}, +{ "paramname": "pchComponentName" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unComponentNameLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetComponentButtonMask", + "returntype": "uint64_t", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"}, +{ "paramname": "pchComponentName" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetComponentRenderModelName", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"}, +{ "paramname": "pchComponentName" ,"paramtype": "const char *"}, +{ "paramname": "pchComponentRenderModelName" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unComponentRenderModelNameLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetComponentState", + "returntype": "bool", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"}, +{ "paramname": "pchComponentName" ,"paramtype": "const char *"}, +{ "paramname": "pControllerState" ,"paramtype": "const vr::VRControllerState_t *"}, +{ "paramname": "pState" ,"paramtype": "const struct vr::RenderModel_ControllerMode_State_t *"}, +{ "paramname": "pComponentState" ,"paramtype": "struct vr::RenderModel_ComponentState_t *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "RenderModelHasComponent", + "returntype": "bool", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"}, +{ "paramname": "pchComponentName" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetRenderModelThumbnailURL", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"}, +{ "paramname": "pchThumbnailURL" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unThumbnailURLLen" ,"paramtype": "uint32_t"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRRenderModelError *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetRenderModelOriginalPath", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"}, +{ "paramname": "pchOriginalPath" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unOriginalPathLen" ,"paramtype": "uint32_t"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRRenderModelError *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetRenderModelErrorNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "error" ,"paramtype": "vr::EVRRenderModelError"} + ] +} +,{ + "classname": "vr::IVRNotifications", + "methodname": "CreateNotification", + "returntype": "vr::EVRNotificationError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "ulUserValue" ,"paramtype": "uint64_t"}, +{ "paramname": "type" ,"paramtype": "vr::EVRNotificationType"}, +{ "paramname": "pchText" ,"paramtype": "const char *"}, +{ "paramname": "style" ,"paramtype": "vr::EVRNotificationStyle"}, +{ "paramname": "pImage" ,"paramtype": "const struct vr::NotificationBitmap_t *"}, +{ "paramname": "pNotificationId" ,"paramtype": "vr::VRNotificationId *"} + ] +} +,{ + "classname": "vr::IVRNotifications", + "methodname": "RemoveNotification", + "returntype": "vr::EVRNotificationError", + "params": [ +{ "paramname": "notificationId" ,"paramtype": "vr::VRNotificationId"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "GetSettingsErrorNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "eError" ,"paramtype": "vr::EVRSettingsError"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "Sync", + "returntype": "bool", + "params": [ +{ "paramname": "bForce" ,"paramtype": "bool"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "SetBool", + "returntype": "void", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "bValue" ,"paramtype": "bool"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "SetInt32", + "returntype": "void", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "nValue" ,"paramtype": "int32_t"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "SetFloat", + "returntype": "void", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "flValue" ,"paramtype": "float"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "SetString", + "returntype": "void", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "pchValue" ,"paramtype": "const char *"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "GetBool", + "returntype": "bool", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "GetInt32", + "returntype": "int32_t", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "GetFloat", + "returntype": "float", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "GetString", + "returntype": "void", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "pchValue" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unValueLen" ,"paramtype": "uint32_t"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "RemoveSection", + "returntype": "void", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "RemoveKeyInSection", + "returntype": "void", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRScreenshots", + "methodname": "RequestScreenshot", + "returntype": "vr::EVRScreenshotError", + "params": [ +{ "paramname": "pOutScreenshotHandle" ,"paramtype": "vr::ScreenshotHandle_t *"}, +{ "paramname": "type" ,"paramtype": "vr::EVRScreenshotType"}, +{ "paramname": "pchPreviewFilename" ,"paramtype": "const char *"}, +{ "paramname": "pchVRFilename" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRScreenshots", + "methodname": "HookScreenshot", + "returntype": "vr::EVRScreenshotError", + "params": [ +{ "paramname": "pSupportedTypes" ,"array_count": "numTypes" ,"paramtype": "const vr::EVRScreenshotType *"}, +{ "paramname": "numTypes" ,"paramtype": "int"} + ] +} +,{ + "classname": "vr::IVRScreenshots", + "methodname": "GetScreenshotPropertyType", + "returntype": "vr::EVRScreenshotType", + "params": [ +{ "paramname": "screenshotHandle" ,"paramtype": "vr::ScreenshotHandle_t"}, +{ "paramname": "pError" ,"paramtype": "vr::EVRScreenshotError *"} + ] +} +,{ + "classname": "vr::IVRScreenshots", + "methodname": "GetScreenshotPropertyFilename", + "returntype": "uint32_t", + "params": [ +{ "paramname": "screenshotHandle" ,"paramtype": "vr::ScreenshotHandle_t"}, +{ "paramname": "filenameType" ,"paramtype": "vr::EVRScreenshotPropertyFilenames"}, +{ "paramname": "pchFilename" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "cchFilename" ,"paramtype": "uint32_t"}, +{ "paramname": "pError" ,"paramtype": "vr::EVRScreenshotError *"} + ] +} +,{ + "classname": "vr::IVRScreenshots", + "methodname": "UpdateScreenshotProgress", + "returntype": "vr::EVRScreenshotError", + "params": [ +{ "paramname": "screenshotHandle" ,"paramtype": "vr::ScreenshotHandle_t"}, +{ "paramname": "flProgress" ,"paramtype": "float"} + ] +} +,{ + "classname": "vr::IVRScreenshots", + "methodname": "TakeStereoScreenshot", + "returntype": "vr::EVRScreenshotError", + "params": [ +{ "paramname": "pOutScreenshotHandle" ,"paramtype": "vr::ScreenshotHandle_t *"}, +{ "paramname": "pchPreviewFilename" ,"paramtype": "const char *"}, +{ "paramname": "pchVRFilename" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRScreenshots", + "methodname": "SubmitScreenshot", + "returntype": "vr::EVRScreenshotError", + "params": [ +{ "paramname": "screenshotHandle" ,"paramtype": "vr::ScreenshotHandle_t"}, +{ "paramname": "type" ,"paramtype": "vr::EVRScreenshotType"}, +{ "paramname": "pchSourcePreviewFilename" ,"paramtype": "const char *"}, +{ "paramname": "pchSourceVRFilename" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRResources", + "methodname": "LoadSharedResource", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchResourceName" ,"paramtype": "const char *"}, +{ "paramname": "pchBuffer" ,"paramtype": "char *"}, +{ "paramname": "unBufferLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRResources", + "methodname": "GetResourceFullPath", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchResourceName" ,"paramtype": "const char *"}, +{ "paramname": "pchResourceTypeDirectory" ,"paramtype": "const char *"}, +{ "paramname": "pchPathBuffer" ,"paramtype": "char *"}, +{ "paramname": "unBufferLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRDriverManager", + "methodname": "GetDriverCount", + "returntype": "uint32_t" +} +,{ + "classname": "vr::IVRDriverManager", + "methodname": "GetDriverName", + "returntype": "uint32_t", + "params": [ +{ "paramname": "nDriver" ,"paramtype": "vr::DriverId_t"}, +{ "paramname": "pchValue" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"} + ] +} +] +} \ No newline at end of file diff --git a/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_capi.h b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_capi.h new file mode 100644 index 000000000..a6685e579 --- /dev/null +++ b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_capi.h @@ -0,0 +1,1918 @@ +//======= Copyright (c) Valve Corporation, All rights reserved. =============== +// +// Purpose: Header for flatted SteamAPI. Use this for binding to other languages. +// This file is auto-generated, do not edit it. +// +//============================================================================= + +#ifndef __OPENVR_API_FLAT_H__ +#define __OPENVR_API_FLAT_H__ +#if defined( _WIN32 ) || defined( __clang__ ) +#pragma once +#endif + +#ifdef __cplusplus +#define EXTERN_C extern "C" +#else +#define EXTERN_C +#endif + +#if defined( _WIN32 ) +#define OPENVR_FNTABLE_CALLTYPE __stdcall +#else +#define OPENVR_FNTABLE_CALLTYPE +#endif + +// OPENVR API export macro +#if defined( _WIN32 ) && !defined( _X360 ) + #if defined( OPENVR_API_EXPORTS ) + #define S_API EXTERN_C __declspec( dllexport ) + #elif defined( OPENVR_API_NODLL ) + #define S_API EXTERN_C + #else + #define S_API extern "C" __declspec( dllimport ) + #endif // OPENVR_API_EXPORTS +#elif defined( __GNUC__ ) + #if defined( OPENVR_API_EXPORTS ) + #define S_API EXTERN_C __attribute__ ((visibility("default"))) + #else + #define S_API EXTERN_C + #endif // OPENVR_API_EXPORTS +#else // !WIN32 + #if defined( OPENVR_API_EXPORTS ) + #define S_API EXTERN_C + #else + #define S_API EXTERN_C + #endif // OPENVR_API_EXPORTS +#endif + +#include + +#if defined( __WIN32 ) +typedef char bool; +#else +#include +#endif + +typedef uint64_t PropertyContainerHandle_t; +typedef uint32_t PropertyTypeTag_t; + + +// OpenVR Constants + +static const unsigned int k_nDriverNone = 4294967295; +static const unsigned int k_unMaxDriverDebugResponseSize = 32768; +static const unsigned int k_unTrackedDeviceIndex_Hmd = 0; +static const unsigned int k_unMaxTrackedDeviceCount = 16; +static const unsigned int k_unTrackedDeviceIndexOther = 4294967294; +static const unsigned int k_unTrackedDeviceIndexInvalid = 4294967295; +static const unsigned long k_ulInvalidPropertyContainer = 0; +static const unsigned int k_unInvalidPropertyTag = 0; +static const unsigned int k_unFloatPropertyTag = 1; +static const unsigned int k_unInt32PropertyTag = 2; +static const unsigned int k_unUint64PropertyTag = 3; +static const unsigned int k_unBoolPropertyTag = 4; +static const unsigned int k_unStringPropertyTag = 5; +static const unsigned int k_unHmdMatrix34PropertyTag = 20; +static const unsigned int k_unHmdMatrix44PropertyTag = 21; +static const unsigned int k_unHmdVector3PropertyTag = 22; +static const unsigned int k_unHmdVector4PropertyTag = 23; +static const unsigned int k_unHiddenAreaPropertyTag = 30; +static const unsigned int k_unOpenVRInternalReserved_Start = 1000; +static const unsigned int k_unOpenVRInternalReserved_End = 10000; +static const unsigned int k_unMaxPropertyStringSize = 32768; +static const unsigned int k_unControllerStateAxisCount = 5; +static const unsigned long k_ulOverlayHandleInvalid = 0; +static const unsigned int k_unScreenshotHandleInvalid = 0; +static const char * IVRSystem_Version = "IVRSystem_016"; +static const char * IVRExtendedDisplay_Version = "IVRExtendedDisplay_001"; +static const char * IVRTrackedCamera_Version = "IVRTrackedCamera_003"; +static const unsigned int k_unMaxApplicationKeyLength = 128; +static const char * k_pch_MimeType_HomeApp = "vr/home"; +static const char * k_pch_MimeType_GameTheater = "vr/game_theater"; +static const char * IVRApplications_Version = "IVRApplications_006"; +static const char * IVRChaperone_Version = "IVRChaperone_003"; +static const char * IVRChaperoneSetup_Version = "IVRChaperoneSetup_005"; +static const char * IVRCompositor_Version = "IVRCompositor_020"; +static const unsigned int k_unVROverlayMaxKeyLength = 128; +static const unsigned int k_unVROverlayMaxNameLength = 128; +static const unsigned int k_unMaxOverlayCount = 64; +static const unsigned int k_unMaxOverlayIntersectionMaskPrimitivesCount = 32; +static const char * IVROverlay_Version = "IVROverlay_016"; +static const char * k_pch_Controller_Component_GDC2015 = "gdc2015"; +static const char * k_pch_Controller_Component_Base = "base"; +static const char * k_pch_Controller_Component_Tip = "tip"; +static const char * k_pch_Controller_Component_HandGrip = "handgrip"; +static const char * k_pch_Controller_Component_Status = "status"; +static const char * IVRRenderModels_Version = "IVRRenderModels_005"; +static const unsigned int k_unNotificationTextMaxSize = 256; +static const char * IVRNotifications_Version = "IVRNotifications_002"; +static const unsigned int k_unMaxSettingsKeyLength = 128; +static const char * IVRSettings_Version = "IVRSettings_002"; +static const char * k_pch_SteamVR_Section = "steamvr"; +static const char * k_pch_SteamVR_RequireHmd_String = "requireHmd"; +static const char * k_pch_SteamVR_ForcedDriverKey_String = "forcedDriver"; +static const char * k_pch_SteamVR_ForcedHmdKey_String = "forcedHmd"; +static const char * k_pch_SteamVR_DisplayDebug_Bool = "displayDebug"; +static const char * k_pch_SteamVR_DebugProcessPipe_String = "debugProcessPipe"; +static const char * k_pch_SteamVR_DisplayDebugX_Int32 = "displayDebugX"; +static const char * k_pch_SteamVR_DisplayDebugY_Int32 = "displayDebugY"; +static const char * k_pch_SteamVR_SendSystemButtonToAllApps_Bool = "sendSystemButtonToAllApps"; +static const char * k_pch_SteamVR_LogLevel_Int32 = "loglevel"; +static const char * k_pch_SteamVR_IPD_Float = "ipd"; +static const char * k_pch_SteamVR_Background_String = "background"; +static const char * k_pch_SteamVR_BackgroundUseDomeProjection_Bool = "backgroundUseDomeProjection"; +static const char * k_pch_SteamVR_BackgroundCameraHeight_Float = "backgroundCameraHeight"; +static const char * k_pch_SteamVR_BackgroundDomeRadius_Float = "backgroundDomeRadius"; +static const char * k_pch_SteamVR_GridColor_String = "gridColor"; +static const char * k_pch_SteamVR_PlayAreaColor_String = "playAreaColor"; +static const char * k_pch_SteamVR_ShowStage_Bool = "showStage"; +static const char * k_pch_SteamVR_ActivateMultipleDrivers_Bool = "activateMultipleDrivers"; +static const char * k_pch_SteamVR_DirectMode_Bool = "directMode"; +static const char * k_pch_SteamVR_DirectModeEdidVid_Int32 = "directModeEdidVid"; +static const char * k_pch_SteamVR_DirectModeEdidPid_Int32 = "directModeEdidPid"; +static const char * k_pch_SteamVR_UsingSpeakers_Bool = "usingSpeakers"; +static const char * k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float = "speakersForwardYawOffsetDegrees"; +static const char * k_pch_SteamVR_BaseStationPowerManagement_Bool = "basestationPowerManagement"; +static const char * k_pch_SteamVR_NeverKillProcesses_Bool = "neverKillProcesses"; +static const char * k_pch_SteamVR_SupersampleScale_Float = "supersampleScale"; +static const char * k_pch_SteamVR_AllowAsyncReprojection_Bool = "allowAsyncReprojection"; +static const char * k_pch_SteamVR_AllowReprojection_Bool = "allowInterleavedReprojection"; +static const char * k_pch_SteamVR_ForceReprojection_Bool = "forceReprojection"; +static const char * k_pch_SteamVR_ForceFadeOnBadTracking_Bool = "forceFadeOnBadTracking"; +static const char * k_pch_SteamVR_DefaultMirrorView_Int32 = "defaultMirrorView"; +static const char * k_pch_SteamVR_ShowMirrorView_Bool = "showMirrorView"; +static const char * k_pch_SteamVR_MirrorViewGeometry_String = "mirrorViewGeometry"; +static const char * k_pch_SteamVR_StartMonitorFromAppLaunch = "startMonitorFromAppLaunch"; +static const char * k_pch_SteamVR_StartCompositorFromAppLaunch_Bool = "startCompositorFromAppLaunch"; +static const char * k_pch_SteamVR_StartDashboardFromAppLaunch_Bool = "startDashboardFromAppLaunch"; +static const char * k_pch_SteamVR_StartOverlayAppsFromDashboard_Bool = "startOverlayAppsFromDashboard"; +static const char * k_pch_SteamVR_EnableHomeApp = "enableHomeApp"; +static const char * k_pch_SteamVR_CycleBackgroundImageTimeSec_Int32 = "CycleBackgroundImageTimeSec"; +static const char * k_pch_SteamVR_RetailDemo_Bool = "retailDemo"; +static const char * k_pch_SteamVR_IpdOffset_Float = "ipdOffset"; +static const char * k_pch_SteamVR_AllowSupersampleFiltering_Bool = "allowSupersampleFiltering"; +static const char * k_pch_Lighthouse_Section = "driver_lighthouse"; +static const char * k_pch_Lighthouse_DisableIMU_Bool = "disableimu"; +static const char * k_pch_Lighthouse_UseDisambiguation_String = "usedisambiguation"; +static const char * k_pch_Lighthouse_DisambiguationDebug_Int32 = "disambiguationdebug"; +static const char * k_pch_Lighthouse_PrimaryBasestation_Int32 = "primarybasestation"; +static const char * k_pch_Lighthouse_DBHistory_Bool = "dbhistory"; +static const char * k_pch_Null_Section = "driver_null"; +static const char * k_pch_Null_SerialNumber_String = "serialNumber"; +static const char * k_pch_Null_ModelNumber_String = "modelNumber"; +static const char * k_pch_Null_WindowX_Int32 = "windowX"; +static const char * k_pch_Null_WindowY_Int32 = "windowY"; +static const char * k_pch_Null_WindowWidth_Int32 = "windowWidth"; +static const char * k_pch_Null_WindowHeight_Int32 = "windowHeight"; +static const char * k_pch_Null_RenderWidth_Int32 = "renderWidth"; +static const char * k_pch_Null_RenderHeight_Int32 = "renderHeight"; +static const char * k_pch_Null_SecondsFromVsyncToPhotons_Float = "secondsFromVsyncToPhotons"; +static const char * k_pch_Null_DisplayFrequency_Float = "displayFrequency"; +static const char * k_pch_UserInterface_Section = "userinterface"; +static const char * k_pch_UserInterface_StatusAlwaysOnTop_Bool = "StatusAlwaysOnTop"; +static const char * k_pch_UserInterface_MinimizeToTray_Bool = "MinimizeToTray"; +static const char * k_pch_UserInterface_Screenshots_Bool = "screenshots"; +static const char * k_pch_UserInterface_ScreenshotType_Int = "screenshotType"; +static const char * k_pch_Notifications_Section = "notifications"; +static const char * k_pch_Notifications_DoNotDisturb_Bool = "DoNotDisturb"; +static const char * k_pch_Keyboard_Section = "keyboard"; +static const char * k_pch_Keyboard_TutorialCompletions = "TutorialCompletions"; +static const char * k_pch_Keyboard_ScaleX = "ScaleX"; +static const char * k_pch_Keyboard_ScaleY = "ScaleY"; +static const char * k_pch_Keyboard_OffsetLeftX = "OffsetLeftX"; +static const char * k_pch_Keyboard_OffsetRightX = "OffsetRightX"; +static const char * k_pch_Keyboard_OffsetY = "OffsetY"; +static const char * k_pch_Keyboard_Smoothing = "Smoothing"; +static const char * k_pch_Perf_Section = "perfcheck"; +static const char * k_pch_Perf_HeuristicActive_Bool = "heuristicActive"; +static const char * k_pch_Perf_NotifyInHMD_Bool = "warnInHMD"; +static const char * k_pch_Perf_NotifyOnlyOnce_Bool = "warnOnlyOnce"; +static const char * k_pch_Perf_AllowTimingStore_Bool = "allowTimingStore"; +static const char * k_pch_Perf_SaveTimingsOnExit_Bool = "saveTimingsOnExit"; +static const char * k_pch_Perf_TestData_Float = "perfTestData"; +static const char * k_pch_Perf_LinuxGPUProfiling_Bool = "linuxGPUProfiling"; +static const char * k_pch_CollisionBounds_Section = "collisionBounds"; +static const char * k_pch_CollisionBounds_Style_Int32 = "CollisionBoundsStyle"; +static const char * k_pch_CollisionBounds_GroundPerimeterOn_Bool = "CollisionBoundsGroundPerimeterOn"; +static const char * k_pch_CollisionBounds_CenterMarkerOn_Bool = "CollisionBoundsCenterMarkerOn"; +static const char * k_pch_CollisionBounds_PlaySpaceOn_Bool = "CollisionBoundsPlaySpaceOn"; +static const char * k_pch_CollisionBounds_FadeDistance_Float = "CollisionBoundsFadeDistance"; +static const char * k_pch_CollisionBounds_ColorGammaR_Int32 = "CollisionBoundsColorGammaR"; +static const char * k_pch_CollisionBounds_ColorGammaG_Int32 = "CollisionBoundsColorGammaG"; +static const char * k_pch_CollisionBounds_ColorGammaB_Int32 = "CollisionBoundsColorGammaB"; +static const char * k_pch_CollisionBounds_ColorGammaA_Int32 = "CollisionBoundsColorGammaA"; +static const char * k_pch_Camera_Section = "camera"; +static const char * k_pch_Camera_EnableCamera_Bool = "enableCamera"; +static const char * k_pch_Camera_EnableCameraInDashboard_Bool = "enableCameraInDashboard"; +static const char * k_pch_Camera_EnableCameraForCollisionBounds_Bool = "enableCameraForCollisionBounds"; +static const char * k_pch_Camera_EnableCameraForRoomView_Bool = "enableCameraForRoomView"; +static const char * k_pch_Camera_BoundsColorGammaR_Int32 = "cameraBoundsColorGammaR"; +static const char * k_pch_Camera_BoundsColorGammaG_Int32 = "cameraBoundsColorGammaG"; +static const char * k_pch_Camera_BoundsColorGammaB_Int32 = "cameraBoundsColorGammaB"; +static const char * k_pch_Camera_BoundsColorGammaA_Int32 = "cameraBoundsColorGammaA"; +static const char * k_pch_Camera_BoundsStrength_Int32 = "cameraBoundsStrength"; +static const char * k_pch_audio_Section = "audio"; +static const char * k_pch_audio_OnPlaybackDevice_String = "onPlaybackDevice"; +static const char * k_pch_audio_OnRecordDevice_String = "onRecordDevice"; +static const char * k_pch_audio_OnPlaybackMirrorDevice_String = "onPlaybackMirrorDevice"; +static const char * k_pch_audio_OffPlaybackDevice_String = "offPlaybackDevice"; +static const char * k_pch_audio_OffRecordDevice_String = "offRecordDevice"; +static const char * k_pch_audio_VIVEHDMIGain = "viveHDMIGain"; +static const char * k_pch_Power_Section = "power"; +static const char * k_pch_Power_PowerOffOnExit_Bool = "powerOffOnExit"; +static const char * k_pch_Power_TurnOffScreensTimeout_Float = "turnOffScreensTimeout"; +static const char * k_pch_Power_TurnOffControllersTimeout_Float = "turnOffControllersTimeout"; +static const char * k_pch_Power_ReturnToWatchdogTimeout_Float = "returnToWatchdogTimeout"; +static const char * k_pch_Power_AutoLaunchSteamVROnButtonPress = "autoLaunchSteamVROnButtonPress"; +static const char * k_pch_Dashboard_Section = "dashboard"; +static const char * k_pch_Dashboard_EnableDashboard_Bool = "enableDashboard"; +static const char * k_pch_Dashboard_ArcadeMode_Bool = "arcadeMode"; +static const char * k_pch_modelskin_Section = "modelskins"; +static const char * k_pch_Driver_Enable_Bool = "enable"; +static const char * IVRScreenshots_Version = "IVRScreenshots_001"; +static const char * IVRResources_Version = "IVRResources_001"; +static const char * IVRDriverManager_Version = "IVRDriverManager_001"; + +// OpenVR Enums + +typedef enum EVREye +{ + EVREye_Eye_Left = 0, + EVREye_Eye_Right = 1, +} EVREye; + +typedef enum ETextureType +{ + ETextureType_TextureType_DirectX = 0, + ETextureType_TextureType_OpenGL = 1, + ETextureType_TextureType_Vulkan = 2, + ETextureType_TextureType_IOSurface = 3, + ETextureType_TextureType_DirectX12 = 4, +} ETextureType; + +typedef enum EColorSpace +{ + EColorSpace_ColorSpace_Auto = 0, + EColorSpace_ColorSpace_Gamma = 1, + EColorSpace_ColorSpace_Linear = 2, +} EColorSpace; + +typedef enum ETrackingResult +{ + ETrackingResult_TrackingResult_Uninitialized = 1, + ETrackingResult_TrackingResult_Calibrating_InProgress = 100, + ETrackingResult_TrackingResult_Calibrating_OutOfRange = 101, + ETrackingResult_TrackingResult_Running_OK = 200, + ETrackingResult_TrackingResult_Running_OutOfRange = 201, +} ETrackingResult; + +typedef enum ETrackedDeviceClass +{ + ETrackedDeviceClass_TrackedDeviceClass_Invalid = 0, + ETrackedDeviceClass_TrackedDeviceClass_HMD = 1, + ETrackedDeviceClass_TrackedDeviceClass_Controller = 2, + ETrackedDeviceClass_TrackedDeviceClass_GenericTracker = 3, + ETrackedDeviceClass_TrackedDeviceClass_TrackingReference = 4, + ETrackedDeviceClass_TrackedDeviceClass_DisplayRedirect = 5, +} ETrackedDeviceClass; + +typedef enum ETrackedControllerRole +{ + ETrackedControllerRole_TrackedControllerRole_Invalid = 0, + ETrackedControllerRole_TrackedControllerRole_LeftHand = 1, + ETrackedControllerRole_TrackedControllerRole_RightHand = 2, +} ETrackedControllerRole; + +typedef enum ETrackingUniverseOrigin +{ + ETrackingUniverseOrigin_TrackingUniverseSeated = 0, + ETrackingUniverseOrigin_TrackingUniverseStanding = 1, + ETrackingUniverseOrigin_TrackingUniverseRawAndUncalibrated = 2, +} ETrackingUniverseOrigin; + +typedef enum ETrackedDeviceProperty +{ + ETrackedDeviceProperty_Prop_Invalid = 0, + ETrackedDeviceProperty_Prop_TrackingSystemName_String = 1000, + ETrackedDeviceProperty_Prop_ModelNumber_String = 1001, + ETrackedDeviceProperty_Prop_SerialNumber_String = 1002, + ETrackedDeviceProperty_Prop_RenderModelName_String = 1003, + ETrackedDeviceProperty_Prop_WillDriftInYaw_Bool = 1004, + ETrackedDeviceProperty_Prop_ManufacturerName_String = 1005, + ETrackedDeviceProperty_Prop_TrackingFirmwareVersion_String = 1006, + ETrackedDeviceProperty_Prop_HardwareRevision_String = 1007, + ETrackedDeviceProperty_Prop_AllWirelessDongleDescriptions_String = 1008, + ETrackedDeviceProperty_Prop_ConnectedWirelessDongle_String = 1009, + ETrackedDeviceProperty_Prop_DeviceIsWireless_Bool = 1010, + ETrackedDeviceProperty_Prop_DeviceIsCharging_Bool = 1011, + ETrackedDeviceProperty_Prop_DeviceBatteryPercentage_Float = 1012, + ETrackedDeviceProperty_Prop_StatusDisplayTransform_Matrix34 = 1013, + ETrackedDeviceProperty_Prop_Firmware_UpdateAvailable_Bool = 1014, + ETrackedDeviceProperty_Prop_Firmware_ManualUpdate_Bool = 1015, + ETrackedDeviceProperty_Prop_Firmware_ManualUpdateURL_String = 1016, + ETrackedDeviceProperty_Prop_HardwareRevision_Uint64 = 1017, + ETrackedDeviceProperty_Prop_FirmwareVersion_Uint64 = 1018, + ETrackedDeviceProperty_Prop_FPGAVersion_Uint64 = 1019, + ETrackedDeviceProperty_Prop_VRCVersion_Uint64 = 1020, + ETrackedDeviceProperty_Prop_RadioVersion_Uint64 = 1021, + ETrackedDeviceProperty_Prop_DongleVersion_Uint64 = 1022, + ETrackedDeviceProperty_Prop_BlockServerShutdown_Bool = 1023, + ETrackedDeviceProperty_Prop_CanUnifyCoordinateSystemWithHmd_Bool = 1024, + ETrackedDeviceProperty_Prop_ContainsProximitySensor_Bool = 1025, + ETrackedDeviceProperty_Prop_DeviceProvidesBatteryStatus_Bool = 1026, + ETrackedDeviceProperty_Prop_DeviceCanPowerOff_Bool = 1027, + ETrackedDeviceProperty_Prop_Firmware_ProgrammingTarget_String = 1028, + ETrackedDeviceProperty_Prop_DeviceClass_Int32 = 1029, + ETrackedDeviceProperty_Prop_HasCamera_Bool = 1030, + ETrackedDeviceProperty_Prop_DriverVersion_String = 1031, + ETrackedDeviceProperty_Prop_Firmware_ForceUpdateRequired_Bool = 1032, + ETrackedDeviceProperty_Prop_ViveSystemButtonFixRequired_Bool = 1033, + ETrackedDeviceProperty_Prop_ParentDriver_Uint64 = 1034, + ETrackedDeviceProperty_Prop_ResourceRoot_String = 1035, + ETrackedDeviceProperty_Prop_ReportsTimeSinceVSync_Bool = 2000, + ETrackedDeviceProperty_Prop_SecondsFromVsyncToPhotons_Float = 2001, + ETrackedDeviceProperty_Prop_DisplayFrequency_Float = 2002, + ETrackedDeviceProperty_Prop_UserIpdMeters_Float = 2003, + ETrackedDeviceProperty_Prop_CurrentUniverseId_Uint64 = 2004, + ETrackedDeviceProperty_Prop_PreviousUniverseId_Uint64 = 2005, + ETrackedDeviceProperty_Prop_DisplayFirmwareVersion_Uint64 = 2006, + ETrackedDeviceProperty_Prop_IsOnDesktop_Bool = 2007, + ETrackedDeviceProperty_Prop_DisplayMCType_Int32 = 2008, + ETrackedDeviceProperty_Prop_DisplayMCOffset_Float = 2009, + ETrackedDeviceProperty_Prop_DisplayMCScale_Float = 2010, + ETrackedDeviceProperty_Prop_EdidVendorID_Int32 = 2011, + ETrackedDeviceProperty_Prop_DisplayMCImageLeft_String = 2012, + ETrackedDeviceProperty_Prop_DisplayMCImageRight_String = 2013, + ETrackedDeviceProperty_Prop_DisplayGCBlackClamp_Float = 2014, + ETrackedDeviceProperty_Prop_EdidProductID_Int32 = 2015, + ETrackedDeviceProperty_Prop_CameraToHeadTransform_Matrix34 = 2016, + ETrackedDeviceProperty_Prop_DisplayGCType_Int32 = 2017, + ETrackedDeviceProperty_Prop_DisplayGCOffset_Float = 2018, + ETrackedDeviceProperty_Prop_DisplayGCScale_Float = 2019, + ETrackedDeviceProperty_Prop_DisplayGCPrescale_Float = 2020, + ETrackedDeviceProperty_Prop_DisplayGCImage_String = 2021, + ETrackedDeviceProperty_Prop_LensCenterLeftU_Float = 2022, + ETrackedDeviceProperty_Prop_LensCenterLeftV_Float = 2023, + ETrackedDeviceProperty_Prop_LensCenterRightU_Float = 2024, + ETrackedDeviceProperty_Prop_LensCenterRightV_Float = 2025, + ETrackedDeviceProperty_Prop_UserHeadToEyeDepthMeters_Float = 2026, + ETrackedDeviceProperty_Prop_CameraFirmwareVersion_Uint64 = 2027, + ETrackedDeviceProperty_Prop_CameraFirmwareDescription_String = 2028, + ETrackedDeviceProperty_Prop_DisplayFPGAVersion_Uint64 = 2029, + ETrackedDeviceProperty_Prop_DisplayBootloaderVersion_Uint64 = 2030, + ETrackedDeviceProperty_Prop_DisplayHardwareVersion_Uint64 = 2031, + ETrackedDeviceProperty_Prop_AudioFirmwareVersion_Uint64 = 2032, + ETrackedDeviceProperty_Prop_CameraCompatibilityMode_Int32 = 2033, + ETrackedDeviceProperty_Prop_ScreenshotHorizontalFieldOfViewDegrees_Float = 2034, + ETrackedDeviceProperty_Prop_ScreenshotVerticalFieldOfViewDegrees_Float = 2035, + ETrackedDeviceProperty_Prop_DisplaySuppressed_Bool = 2036, + ETrackedDeviceProperty_Prop_DisplayAllowNightMode_Bool = 2037, + ETrackedDeviceProperty_Prop_DisplayMCImageWidth_Int32 = 2038, + ETrackedDeviceProperty_Prop_DisplayMCImageHeight_Int32 = 2039, + ETrackedDeviceProperty_Prop_DisplayMCImageNumChannels_Int32 = 2040, + ETrackedDeviceProperty_Prop_DisplayMCImageData_Binary = 2041, + ETrackedDeviceProperty_Prop_SecondsFromPhotonsToVblank_Float = 2042, + ETrackedDeviceProperty_Prop_DriverDirectModeSendsVsyncEvents_Bool = 2043, + ETrackedDeviceProperty_Prop_DisplayDebugMode_Bool = 2044, + ETrackedDeviceProperty_Prop_GraphicsAdapterLuid_Uint64 = 2045, + ETrackedDeviceProperty_Prop_AttachedDeviceId_String = 3000, + ETrackedDeviceProperty_Prop_SupportedButtons_Uint64 = 3001, + ETrackedDeviceProperty_Prop_Axis0Type_Int32 = 3002, + ETrackedDeviceProperty_Prop_Axis1Type_Int32 = 3003, + ETrackedDeviceProperty_Prop_Axis2Type_Int32 = 3004, + ETrackedDeviceProperty_Prop_Axis3Type_Int32 = 3005, + ETrackedDeviceProperty_Prop_Axis4Type_Int32 = 3006, + ETrackedDeviceProperty_Prop_ControllerRoleHint_Int32 = 3007, + ETrackedDeviceProperty_Prop_FieldOfViewLeftDegrees_Float = 4000, + ETrackedDeviceProperty_Prop_FieldOfViewRightDegrees_Float = 4001, + ETrackedDeviceProperty_Prop_FieldOfViewTopDegrees_Float = 4002, + ETrackedDeviceProperty_Prop_FieldOfViewBottomDegrees_Float = 4003, + ETrackedDeviceProperty_Prop_TrackingRangeMinimumMeters_Float = 4004, + ETrackedDeviceProperty_Prop_TrackingRangeMaximumMeters_Float = 4005, + ETrackedDeviceProperty_Prop_ModeLabel_String = 4006, + ETrackedDeviceProperty_Prop_IconPathName_String = 5000, + ETrackedDeviceProperty_Prop_NamedIconPathDeviceOff_String = 5001, + ETrackedDeviceProperty_Prop_NamedIconPathDeviceSearching_String = 5002, + ETrackedDeviceProperty_Prop_NamedIconPathDeviceSearchingAlert_String = 5003, + ETrackedDeviceProperty_Prop_NamedIconPathDeviceReady_String = 5004, + ETrackedDeviceProperty_Prop_NamedIconPathDeviceReadyAlert_String = 5005, + ETrackedDeviceProperty_Prop_NamedIconPathDeviceNotReady_String = 5006, + ETrackedDeviceProperty_Prop_NamedIconPathDeviceStandby_String = 5007, + ETrackedDeviceProperty_Prop_NamedIconPathDeviceAlertLow_String = 5008, + ETrackedDeviceProperty_Prop_DisplayHiddenArea_Binary_Start = 5100, + ETrackedDeviceProperty_Prop_DisplayHiddenArea_Binary_End = 5150, + ETrackedDeviceProperty_Prop_UserConfigPath_String = 6000, + ETrackedDeviceProperty_Prop_InstallPath_String = 6001, + ETrackedDeviceProperty_Prop_HasDisplayComponent_Bool = 6002, + ETrackedDeviceProperty_Prop_HasControllerComponent_Bool = 6003, + ETrackedDeviceProperty_Prop_HasCameraComponent_Bool = 6004, + ETrackedDeviceProperty_Prop_HasDriverDirectModeComponent_Bool = 6005, + ETrackedDeviceProperty_Prop_HasVirtualDisplayComponent_Bool = 6006, + ETrackedDeviceProperty_Prop_VendorSpecific_Reserved_Start = 10000, + ETrackedDeviceProperty_Prop_VendorSpecific_Reserved_End = 10999, +} ETrackedDeviceProperty; + +typedef enum ETrackedPropertyError +{ + ETrackedPropertyError_TrackedProp_Success = 0, + ETrackedPropertyError_TrackedProp_WrongDataType = 1, + ETrackedPropertyError_TrackedProp_WrongDeviceClass = 2, + ETrackedPropertyError_TrackedProp_BufferTooSmall = 3, + ETrackedPropertyError_TrackedProp_UnknownProperty = 4, + ETrackedPropertyError_TrackedProp_InvalidDevice = 5, + ETrackedPropertyError_TrackedProp_CouldNotContactServer = 6, + ETrackedPropertyError_TrackedProp_ValueNotProvidedByDevice = 7, + ETrackedPropertyError_TrackedProp_StringExceedsMaximumLength = 8, + ETrackedPropertyError_TrackedProp_NotYetAvailable = 9, + ETrackedPropertyError_TrackedProp_PermissionDenied = 10, + ETrackedPropertyError_TrackedProp_InvalidOperation = 11, +} ETrackedPropertyError; + +typedef enum EVRSubmitFlags +{ + EVRSubmitFlags_Submit_Default = 0, + EVRSubmitFlags_Submit_LensDistortionAlreadyApplied = 1, + EVRSubmitFlags_Submit_GlRenderBuffer = 2, + EVRSubmitFlags_Submit_Reserved = 4, +} EVRSubmitFlags; + +typedef enum EVRState +{ + EVRState_VRState_Undefined = -1, + EVRState_VRState_Off = 0, + EVRState_VRState_Searching = 1, + EVRState_VRState_Searching_Alert = 2, + EVRState_VRState_Ready = 3, + EVRState_VRState_Ready_Alert = 4, + EVRState_VRState_NotReady = 5, + EVRState_VRState_Standby = 6, + EVRState_VRState_Ready_Alert_Low = 7, +} EVRState; + +typedef enum EVREventType +{ + EVREventType_VREvent_None = 0, + EVREventType_VREvent_TrackedDeviceActivated = 100, + EVREventType_VREvent_TrackedDeviceDeactivated = 101, + EVREventType_VREvent_TrackedDeviceUpdated = 102, + EVREventType_VREvent_TrackedDeviceUserInteractionStarted = 103, + EVREventType_VREvent_TrackedDeviceUserInteractionEnded = 104, + EVREventType_VREvent_IpdChanged = 105, + EVREventType_VREvent_EnterStandbyMode = 106, + EVREventType_VREvent_LeaveStandbyMode = 107, + EVREventType_VREvent_TrackedDeviceRoleChanged = 108, + EVREventType_VREvent_WatchdogWakeUpRequested = 109, + EVREventType_VREvent_LensDistortionChanged = 110, + EVREventType_VREvent_PropertyChanged = 111, + EVREventType_VREvent_ButtonPress = 200, + EVREventType_VREvent_ButtonUnpress = 201, + EVREventType_VREvent_ButtonTouch = 202, + EVREventType_VREvent_ButtonUntouch = 203, + EVREventType_VREvent_MouseMove = 300, + EVREventType_VREvent_MouseButtonDown = 301, + EVREventType_VREvent_MouseButtonUp = 302, + EVREventType_VREvent_FocusEnter = 303, + EVREventType_VREvent_FocusLeave = 304, + EVREventType_VREvent_Scroll = 305, + EVREventType_VREvent_TouchPadMove = 306, + EVREventType_VREvent_OverlayFocusChanged = 307, + EVREventType_VREvent_InputFocusCaptured = 400, + EVREventType_VREvent_InputFocusReleased = 401, + EVREventType_VREvent_SceneFocusLost = 402, + EVREventType_VREvent_SceneFocusGained = 403, + EVREventType_VREvent_SceneApplicationChanged = 404, + EVREventType_VREvent_SceneFocusChanged = 405, + EVREventType_VREvent_InputFocusChanged = 406, + EVREventType_VREvent_SceneApplicationSecondaryRenderingStarted = 407, + EVREventType_VREvent_HideRenderModels = 410, + EVREventType_VREvent_ShowRenderModels = 411, + EVREventType_VREvent_OverlayShown = 500, + EVREventType_VREvent_OverlayHidden = 501, + EVREventType_VREvent_DashboardActivated = 502, + EVREventType_VREvent_DashboardDeactivated = 503, + EVREventType_VREvent_DashboardThumbSelected = 504, + EVREventType_VREvent_DashboardRequested = 505, + EVREventType_VREvent_ResetDashboard = 506, + EVREventType_VREvent_RenderToast = 507, + EVREventType_VREvent_ImageLoaded = 508, + EVREventType_VREvent_ShowKeyboard = 509, + EVREventType_VREvent_HideKeyboard = 510, + EVREventType_VREvent_OverlayGamepadFocusGained = 511, + EVREventType_VREvent_OverlayGamepadFocusLost = 512, + EVREventType_VREvent_OverlaySharedTextureChanged = 513, + EVREventType_VREvent_DashboardGuideButtonDown = 514, + EVREventType_VREvent_DashboardGuideButtonUp = 515, + EVREventType_VREvent_ScreenshotTriggered = 516, + EVREventType_VREvent_ImageFailed = 517, + EVREventType_VREvent_DashboardOverlayCreated = 518, + EVREventType_VREvent_RequestScreenshot = 520, + EVREventType_VREvent_ScreenshotTaken = 521, + EVREventType_VREvent_ScreenshotFailed = 522, + EVREventType_VREvent_SubmitScreenshotToDashboard = 523, + EVREventType_VREvent_ScreenshotProgressToDashboard = 524, + EVREventType_VREvent_PrimaryDashboardDeviceChanged = 525, + EVREventType_VREvent_Notification_Shown = 600, + EVREventType_VREvent_Notification_Hidden = 601, + EVREventType_VREvent_Notification_BeginInteraction = 602, + EVREventType_VREvent_Notification_Destroyed = 603, + EVREventType_VREvent_Quit = 700, + EVREventType_VREvent_ProcessQuit = 701, + EVREventType_VREvent_QuitAborted_UserPrompt = 702, + EVREventType_VREvent_QuitAcknowledged = 703, + EVREventType_VREvent_DriverRequestedQuit = 704, + EVREventType_VREvent_ChaperoneDataHasChanged = 800, + EVREventType_VREvent_ChaperoneUniverseHasChanged = 801, + EVREventType_VREvent_ChaperoneTempDataHasChanged = 802, + EVREventType_VREvent_ChaperoneSettingsHaveChanged = 803, + EVREventType_VREvent_SeatedZeroPoseReset = 804, + EVREventType_VREvent_AudioSettingsHaveChanged = 820, + EVREventType_VREvent_BackgroundSettingHasChanged = 850, + EVREventType_VREvent_CameraSettingsHaveChanged = 851, + EVREventType_VREvent_ReprojectionSettingHasChanged = 852, + EVREventType_VREvent_ModelSkinSettingsHaveChanged = 853, + EVREventType_VREvent_EnvironmentSettingsHaveChanged = 854, + EVREventType_VREvent_PowerSettingsHaveChanged = 855, + EVREventType_VREvent_EnableHomeAppSettingsHaveChanged = 856, + EVREventType_VREvent_StatusUpdate = 900, + EVREventType_VREvent_MCImageUpdated = 1000, + EVREventType_VREvent_FirmwareUpdateStarted = 1100, + EVREventType_VREvent_FirmwareUpdateFinished = 1101, + EVREventType_VREvent_KeyboardClosed = 1200, + EVREventType_VREvent_KeyboardCharInput = 1201, + EVREventType_VREvent_KeyboardDone = 1202, + EVREventType_VREvent_ApplicationTransitionStarted = 1300, + EVREventType_VREvent_ApplicationTransitionAborted = 1301, + EVREventType_VREvent_ApplicationTransitionNewAppStarted = 1302, + EVREventType_VREvent_ApplicationListUpdated = 1303, + EVREventType_VREvent_ApplicationMimeTypeLoad = 1304, + EVREventType_VREvent_ApplicationTransitionNewAppLaunchComplete = 1305, + EVREventType_VREvent_ProcessConnected = 1306, + EVREventType_VREvent_ProcessDisconnected = 1307, + EVREventType_VREvent_Compositor_MirrorWindowShown = 1400, + EVREventType_VREvent_Compositor_MirrorWindowHidden = 1401, + EVREventType_VREvent_Compositor_ChaperoneBoundsShown = 1410, + EVREventType_VREvent_Compositor_ChaperoneBoundsHidden = 1411, + EVREventType_VREvent_TrackedCamera_StartVideoStream = 1500, + EVREventType_VREvent_TrackedCamera_StopVideoStream = 1501, + EVREventType_VREvent_TrackedCamera_PauseVideoStream = 1502, + EVREventType_VREvent_TrackedCamera_ResumeVideoStream = 1503, + EVREventType_VREvent_TrackedCamera_EditingSurface = 1550, + EVREventType_VREvent_PerformanceTest_EnableCapture = 1600, + EVREventType_VREvent_PerformanceTest_DisableCapture = 1601, + EVREventType_VREvent_PerformanceTest_FidelityLevel = 1602, + EVREventType_VREvent_MessageOverlay_Closed = 1650, + EVREventType_VREvent_VendorSpecific_Reserved_Start = 10000, + EVREventType_VREvent_VendorSpecific_Reserved_End = 19999, +} EVREventType; + +typedef enum EDeviceActivityLevel +{ + EDeviceActivityLevel_k_EDeviceActivityLevel_Unknown = -1, + EDeviceActivityLevel_k_EDeviceActivityLevel_Idle = 0, + EDeviceActivityLevel_k_EDeviceActivityLevel_UserInteraction = 1, + EDeviceActivityLevel_k_EDeviceActivityLevel_UserInteraction_Timeout = 2, + EDeviceActivityLevel_k_EDeviceActivityLevel_Standby = 3, +} EDeviceActivityLevel; + +typedef enum EVRButtonId +{ + EVRButtonId_k_EButton_System = 0, + EVRButtonId_k_EButton_ApplicationMenu = 1, + EVRButtonId_k_EButton_Grip = 2, + EVRButtonId_k_EButton_DPad_Left = 3, + EVRButtonId_k_EButton_DPad_Up = 4, + EVRButtonId_k_EButton_DPad_Right = 5, + EVRButtonId_k_EButton_DPad_Down = 6, + EVRButtonId_k_EButton_A = 7, + EVRButtonId_k_EButton_ProximitySensor = 31, + EVRButtonId_k_EButton_Axis0 = 32, + EVRButtonId_k_EButton_Axis1 = 33, + EVRButtonId_k_EButton_Axis2 = 34, + EVRButtonId_k_EButton_Axis3 = 35, + EVRButtonId_k_EButton_Axis4 = 36, + EVRButtonId_k_EButton_SteamVR_Touchpad = 32, + EVRButtonId_k_EButton_SteamVR_Trigger = 33, + EVRButtonId_k_EButton_Dashboard_Back = 2, + EVRButtonId_k_EButton_Max = 64, +} EVRButtonId; + +typedef enum EVRMouseButton +{ + EVRMouseButton_VRMouseButton_Left = 1, + EVRMouseButton_VRMouseButton_Right = 2, + EVRMouseButton_VRMouseButton_Middle = 4, +} EVRMouseButton; + +typedef enum EHiddenAreaMeshType +{ + EHiddenAreaMeshType_k_eHiddenAreaMesh_Standard = 0, + EHiddenAreaMeshType_k_eHiddenAreaMesh_Inverse = 1, + EHiddenAreaMeshType_k_eHiddenAreaMesh_LineLoop = 2, + EHiddenAreaMeshType_k_eHiddenAreaMesh_Max = 3, +} EHiddenAreaMeshType; + +typedef enum EVRControllerAxisType +{ + EVRControllerAxisType_k_eControllerAxis_None = 0, + EVRControllerAxisType_k_eControllerAxis_TrackPad = 1, + EVRControllerAxisType_k_eControllerAxis_Joystick = 2, + EVRControllerAxisType_k_eControllerAxis_Trigger = 3, +} EVRControllerAxisType; + +typedef enum EVRControllerEventOutputType +{ + EVRControllerEventOutputType_ControllerEventOutput_OSEvents = 0, + EVRControllerEventOutputType_ControllerEventOutput_VREvents = 1, +} EVRControllerEventOutputType; + +typedef enum ECollisionBoundsStyle +{ + ECollisionBoundsStyle_COLLISION_BOUNDS_STYLE_BEGINNER = 0, + ECollisionBoundsStyle_COLLISION_BOUNDS_STYLE_INTERMEDIATE = 1, + ECollisionBoundsStyle_COLLISION_BOUNDS_STYLE_SQUARES = 2, + ECollisionBoundsStyle_COLLISION_BOUNDS_STYLE_ADVANCED = 3, + ECollisionBoundsStyle_COLLISION_BOUNDS_STYLE_NONE = 4, + ECollisionBoundsStyle_COLLISION_BOUNDS_STYLE_COUNT = 5, +} ECollisionBoundsStyle; + +typedef enum EVROverlayError +{ + EVROverlayError_VROverlayError_None = 0, + EVROverlayError_VROverlayError_UnknownOverlay = 10, + EVROverlayError_VROverlayError_InvalidHandle = 11, + EVROverlayError_VROverlayError_PermissionDenied = 12, + EVROverlayError_VROverlayError_OverlayLimitExceeded = 13, + EVROverlayError_VROverlayError_WrongVisibilityType = 14, + EVROverlayError_VROverlayError_KeyTooLong = 15, + EVROverlayError_VROverlayError_NameTooLong = 16, + EVROverlayError_VROverlayError_KeyInUse = 17, + EVROverlayError_VROverlayError_WrongTransformType = 18, + EVROverlayError_VROverlayError_InvalidTrackedDevice = 19, + EVROverlayError_VROverlayError_InvalidParameter = 20, + EVROverlayError_VROverlayError_ThumbnailCantBeDestroyed = 21, + EVROverlayError_VROverlayError_ArrayTooSmall = 22, + EVROverlayError_VROverlayError_RequestFailed = 23, + EVROverlayError_VROverlayError_InvalidTexture = 24, + EVROverlayError_VROverlayError_UnableToLoadFile = 25, + EVROverlayError_VROverlayError_KeyboardAlreadyInUse = 26, + EVROverlayError_VROverlayError_NoNeighbor = 27, + EVROverlayError_VROverlayError_TooManyMaskPrimitives = 29, + EVROverlayError_VROverlayError_BadMaskPrimitive = 30, +} EVROverlayError; + +typedef enum EVRApplicationType +{ + EVRApplicationType_VRApplication_Other = 0, + EVRApplicationType_VRApplication_Scene = 1, + EVRApplicationType_VRApplication_Overlay = 2, + EVRApplicationType_VRApplication_Background = 3, + EVRApplicationType_VRApplication_Utility = 4, + EVRApplicationType_VRApplication_VRMonitor = 5, + EVRApplicationType_VRApplication_SteamWatchdog = 6, + EVRApplicationType_VRApplication_Bootstrapper = 7, + EVRApplicationType_VRApplication_Max = 8, +} EVRApplicationType; + +typedef enum EVRFirmwareError +{ + EVRFirmwareError_VRFirmwareError_None = 0, + EVRFirmwareError_VRFirmwareError_Success = 1, + EVRFirmwareError_VRFirmwareError_Fail = 2, +} EVRFirmwareError; + +typedef enum EVRNotificationError +{ + EVRNotificationError_VRNotificationError_OK = 0, + EVRNotificationError_VRNotificationError_InvalidNotificationId = 100, + EVRNotificationError_VRNotificationError_NotificationQueueFull = 101, + EVRNotificationError_VRNotificationError_InvalidOverlayHandle = 102, + EVRNotificationError_VRNotificationError_SystemWithUserValueAlreadyExists = 103, +} EVRNotificationError; + +typedef enum EVRInitError +{ + EVRInitError_VRInitError_None = 0, + EVRInitError_VRInitError_Unknown = 1, + EVRInitError_VRInitError_Init_InstallationNotFound = 100, + EVRInitError_VRInitError_Init_InstallationCorrupt = 101, + EVRInitError_VRInitError_Init_VRClientDLLNotFound = 102, + EVRInitError_VRInitError_Init_FileNotFound = 103, + EVRInitError_VRInitError_Init_FactoryNotFound = 104, + EVRInitError_VRInitError_Init_InterfaceNotFound = 105, + EVRInitError_VRInitError_Init_InvalidInterface = 106, + EVRInitError_VRInitError_Init_UserConfigDirectoryInvalid = 107, + EVRInitError_VRInitError_Init_HmdNotFound = 108, + EVRInitError_VRInitError_Init_NotInitialized = 109, + EVRInitError_VRInitError_Init_PathRegistryNotFound = 110, + EVRInitError_VRInitError_Init_NoConfigPath = 111, + EVRInitError_VRInitError_Init_NoLogPath = 112, + EVRInitError_VRInitError_Init_PathRegistryNotWritable = 113, + EVRInitError_VRInitError_Init_AppInfoInitFailed = 114, + EVRInitError_VRInitError_Init_Retry = 115, + EVRInitError_VRInitError_Init_InitCanceledByUser = 116, + EVRInitError_VRInitError_Init_AnotherAppLaunching = 117, + EVRInitError_VRInitError_Init_SettingsInitFailed = 118, + EVRInitError_VRInitError_Init_ShuttingDown = 119, + EVRInitError_VRInitError_Init_TooManyObjects = 120, + EVRInitError_VRInitError_Init_NoServerForBackgroundApp = 121, + EVRInitError_VRInitError_Init_NotSupportedWithCompositor = 122, + EVRInitError_VRInitError_Init_NotAvailableToUtilityApps = 123, + EVRInitError_VRInitError_Init_Internal = 124, + EVRInitError_VRInitError_Init_HmdDriverIdIsNone = 125, + EVRInitError_VRInitError_Init_HmdNotFoundPresenceFailed = 126, + EVRInitError_VRInitError_Init_VRMonitorNotFound = 127, + EVRInitError_VRInitError_Init_VRMonitorStartupFailed = 128, + EVRInitError_VRInitError_Init_LowPowerWatchdogNotSupported = 129, + EVRInitError_VRInitError_Init_InvalidApplicationType = 130, + EVRInitError_VRInitError_Init_NotAvailableToWatchdogApps = 131, + EVRInitError_VRInitError_Init_WatchdogDisabledInSettings = 132, + EVRInitError_VRInitError_Init_VRDashboardNotFound = 133, + EVRInitError_VRInitError_Init_VRDashboardStartupFailed = 134, + EVRInitError_VRInitError_Init_VRHomeNotFound = 135, + EVRInitError_VRInitError_Init_VRHomeStartupFailed = 136, + EVRInitError_VRInitError_Driver_Failed = 200, + EVRInitError_VRInitError_Driver_Unknown = 201, + EVRInitError_VRInitError_Driver_HmdUnknown = 202, + EVRInitError_VRInitError_Driver_NotLoaded = 203, + EVRInitError_VRInitError_Driver_RuntimeOutOfDate = 204, + EVRInitError_VRInitError_Driver_HmdInUse = 205, + EVRInitError_VRInitError_Driver_NotCalibrated = 206, + EVRInitError_VRInitError_Driver_CalibrationInvalid = 207, + EVRInitError_VRInitError_Driver_HmdDisplayNotFound = 208, + EVRInitError_VRInitError_Driver_TrackedDeviceInterfaceUnknown = 209, + EVRInitError_VRInitError_Driver_HmdDriverIdOutOfBounds = 211, + EVRInitError_VRInitError_Driver_HmdDisplayMirrored = 212, + EVRInitError_VRInitError_IPC_ServerInitFailed = 300, + EVRInitError_VRInitError_IPC_ConnectFailed = 301, + EVRInitError_VRInitError_IPC_SharedStateInitFailed = 302, + EVRInitError_VRInitError_IPC_CompositorInitFailed = 303, + EVRInitError_VRInitError_IPC_MutexInitFailed = 304, + EVRInitError_VRInitError_IPC_Failed = 305, + EVRInitError_VRInitError_IPC_CompositorConnectFailed = 306, + EVRInitError_VRInitError_IPC_CompositorInvalidConnectResponse = 307, + EVRInitError_VRInitError_IPC_ConnectFailedAfterMultipleAttempts = 308, + EVRInitError_VRInitError_Compositor_Failed = 400, + EVRInitError_VRInitError_Compositor_D3D11HardwareRequired = 401, + EVRInitError_VRInitError_Compositor_FirmwareRequiresUpdate = 402, + EVRInitError_VRInitError_Compositor_OverlayInitFailed = 403, + EVRInitError_VRInitError_Compositor_ScreenshotsInitFailed = 404, + EVRInitError_VRInitError_Compositor_UnableToCreateDevice = 405, + EVRInitError_VRInitError_VendorSpecific_UnableToConnectToOculusRuntime = 1000, + EVRInitError_VRInitError_VendorSpecific_HmdFound_CantOpenDevice = 1101, + EVRInitError_VRInitError_VendorSpecific_HmdFound_UnableToRequestConfigStart = 1102, + EVRInitError_VRInitError_VendorSpecific_HmdFound_NoStoredConfig = 1103, + EVRInitError_VRInitError_VendorSpecific_HmdFound_ConfigTooBig = 1104, + EVRInitError_VRInitError_VendorSpecific_HmdFound_ConfigTooSmall = 1105, + EVRInitError_VRInitError_VendorSpecific_HmdFound_UnableToInitZLib = 1106, + EVRInitError_VRInitError_VendorSpecific_HmdFound_CantReadFirmwareVersion = 1107, + EVRInitError_VRInitError_VendorSpecific_HmdFound_UnableToSendUserDataStart = 1108, + EVRInitError_VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataStart = 1109, + EVRInitError_VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataNext = 1110, + EVRInitError_VRInitError_VendorSpecific_HmdFound_UserDataAddressRange = 1111, + EVRInitError_VRInitError_VendorSpecific_HmdFound_UserDataError = 1112, + EVRInitError_VRInitError_VendorSpecific_HmdFound_ConfigFailedSanityCheck = 1113, + EVRInitError_VRInitError_Steam_SteamInstallationNotFound = 2000, +} EVRInitError; + +typedef enum EVRScreenshotType +{ + EVRScreenshotType_VRScreenshotType_None = 0, + EVRScreenshotType_VRScreenshotType_Mono = 1, + EVRScreenshotType_VRScreenshotType_Stereo = 2, + EVRScreenshotType_VRScreenshotType_Cubemap = 3, + EVRScreenshotType_VRScreenshotType_MonoPanorama = 4, + EVRScreenshotType_VRScreenshotType_StereoPanorama = 5, +} EVRScreenshotType; + +typedef enum EVRScreenshotPropertyFilenames +{ + EVRScreenshotPropertyFilenames_VRScreenshotPropertyFilenames_Preview = 0, + EVRScreenshotPropertyFilenames_VRScreenshotPropertyFilenames_VR = 1, +} EVRScreenshotPropertyFilenames; + +typedef enum EVRTrackedCameraError +{ + EVRTrackedCameraError_VRTrackedCameraError_None = 0, + EVRTrackedCameraError_VRTrackedCameraError_OperationFailed = 100, + EVRTrackedCameraError_VRTrackedCameraError_InvalidHandle = 101, + EVRTrackedCameraError_VRTrackedCameraError_InvalidFrameHeaderVersion = 102, + EVRTrackedCameraError_VRTrackedCameraError_OutOfHandles = 103, + EVRTrackedCameraError_VRTrackedCameraError_IPCFailure = 104, + EVRTrackedCameraError_VRTrackedCameraError_NotSupportedForThisDevice = 105, + EVRTrackedCameraError_VRTrackedCameraError_SharedMemoryFailure = 106, + EVRTrackedCameraError_VRTrackedCameraError_FrameBufferingFailure = 107, + EVRTrackedCameraError_VRTrackedCameraError_StreamSetupFailure = 108, + EVRTrackedCameraError_VRTrackedCameraError_InvalidGLTextureId = 109, + EVRTrackedCameraError_VRTrackedCameraError_InvalidSharedTextureHandle = 110, + EVRTrackedCameraError_VRTrackedCameraError_FailedToGetGLTextureId = 111, + EVRTrackedCameraError_VRTrackedCameraError_SharedTextureFailure = 112, + EVRTrackedCameraError_VRTrackedCameraError_NoFrameAvailable = 113, + EVRTrackedCameraError_VRTrackedCameraError_InvalidArgument = 114, + EVRTrackedCameraError_VRTrackedCameraError_InvalidFrameBufferSize = 115, +} EVRTrackedCameraError; + +typedef enum EVRTrackedCameraFrameType +{ + EVRTrackedCameraFrameType_VRTrackedCameraFrameType_Distorted = 0, + EVRTrackedCameraFrameType_VRTrackedCameraFrameType_Undistorted = 1, + EVRTrackedCameraFrameType_VRTrackedCameraFrameType_MaximumUndistorted = 2, + EVRTrackedCameraFrameType_MAX_CAMERA_FRAME_TYPES = 3, +} EVRTrackedCameraFrameType; + +typedef enum EVRApplicationError +{ + EVRApplicationError_VRApplicationError_None = 0, + EVRApplicationError_VRApplicationError_AppKeyAlreadyExists = 100, + EVRApplicationError_VRApplicationError_NoManifest = 101, + EVRApplicationError_VRApplicationError_NoApplication = 102, + EVRApplicationError_VRApplicationError_InvalidIndex = 103, + EVRApplicationError_VRApplicationError_UnknownApplication = 104, + EVRApplicationError_VRApplicationError_IPCFailed = 105, + EVRApplicationError_VRApplicationError_ApplicationAlreadyRunning = 106, + EVRApplicationError_VRApplicationError_InvalidManifest = 107, + EVRApplicationError_VRApplicationError_InvalidApplication = 108, + EVRApplicationError_VRApplicationError_LaunchFailed = 109, + EVRApplicationError_VRApplicationError_ApplicationAlreadyStarting = 110, + EVRApplicationError_VRApplicationError_LaunchInProgress = 111, + EVRApplicationError_VRApplicationError_OldApplicationQuitting = 112, + EVRApplicationError_VRApplicationError_TransitionAborted = 113, + EVRApplicationError_VRApplicationError_IsTemplate = 114, + EVRApplicationError_VRApplicationError_BufferTooSmall = 200, + EVRApplicationError_VRApplicationError_PropertyNotSet = 201, + EVRApplicationError_VRApplicationError_UnknownProperty = 202, + EVRApplicationError_VRApplicationError_InvalidParameter = 203, +} EVRApplicationError; + +typedef enum EVRApplicationProperty +{ + EVRApplicationProperty_VRApplicationProperty_Name_String = 0, + EVRApplicationProperty_VRApplicationProperty_LaunchType_String = 11, + EVRApplicationProperty_VRApplicationProperty_WorkingDirectory_String = 12, + EVRApplicationProperty_VRApplicationProperty_BinaryPath_String = 13, + EVRApplicationProperty_VRApplicationProperty_Arguments_String = 14, + EVRApplicationProperty_VRApplicationProperty_URL_String = 15, + EVRApplicationProperty_VRApplicationProperty_Description_String = 50, + EVRApplicationProperty_VRApplicationProperty_NewsURL_String = 51, + EVRApplicationProperty_VRApplicationProperty_ImagePath_String = 52, + EVRApplicationProperty_VRApplicationProperty_Source_String = 53, + EVRApplicationProperty_VRApplicationProperty_IsDashboardOverlay_Bool = 60, + EVRApplicationProperty_VRApplicationProperty_IsTemplate_Bool = 61, + EVRApplicationProperty_VRApplicationProperty_IsInstanced_Bool = 62, + EVRApplicationProperty_VRApplicationProperty_IsInternal_Bool = 63, + EVRApplicationProperty_VRApplicationProperty_LastLaunchTime_Uint64 = 70, +} EVRApplicationProperty; + +typedef enum EVRApplicationTransitionState +{ + EVRApplicationTransitionState_VRApplicationTransition_None = 0, + EVRApplicationTransitionState_VRApplicationTransition_OldAppQuitSent = 10, + EVRApplicationTransitionState_VRApplicationTransition_WaitingForExternalLaunch = 11, + EVRApplicationTransitionState_VRApplicationTransition_NewAppLaunched = 20, +} EVRApplicationTransitionState; + +typedef enum ChaperoneCalibrationState +{ + ChaperoneCalibrationState_OK = 1, + ChaperoneCalibrationState_Warning = 100, + ChaperoneCalibrationState_Warning_BaseStationMayHaveMoved = 101, + ChaperoneCalibrationState_Warning_BaseStationRemoved = 102, + ChaperoneCalibrationState_Warning_SeatedBoundsInvalid = 103, + ChaperoneCalibrationState_Error = 200, + ChaperoneCalibrationState_Error_BaseStationUninitialized = 201, + ChaperoneCalibrationState_Error_BaseStationConflict = 202, + ChaperoneCalibrationState_Error_PlayAreaInvalid = 203, + ChaperoneCalibrationState_Error_CollisionBoundsInvalid = 204, +} ChaperoneCalibrationState; + +typedef enum EChaperoneConfigFile +{ + EChaperoneConfigFile_Live = 1, + EChaperoneConfigFile_Temp = 2, +} EChaperoneConfigFile; + +typedef enum EChaperoneImportFlags +{ + EChaperoneImportFlags_EChaperoneImport_BoundsOnly = 1, +} EChaperoneImportFlags; + +typedef enum EVRCompositorError +{ + EVRCompositorError_VRCompositorError_None = 0, + EVRCompositorError_VRCompositorError_RequestFailed = 1, + EVRCompositorError_VRCompositorError_IncompatibleVersion = 100, + EVRCompositorError_VRCompositorError_DoNotHaveFocus = 101, + EVRCompositorError_VRCompositorError_InvalidTexture = 102, + EVRCompositorError_VRCompositorError_IsNotSceneApplication = 103, + EVRCompositorError_VRCompositorError_TextureIsOnWrongDevice = 104, + EVRCompositorError_VRCompositorError_TextureUsesUnsupportedFormat = 105, + EVRCompositorError_VRCompositorError_SharedTexturesNotSupported = 106, + EVRCompositorError_VRCompositorError_IndexOutOfRange = 107, + EVRCompositorError_VRCompositorError_AlreadySubmitted = 108, +} EVRCompositorError; + +typedef enum VROverlayInputMethod +{ + VROverlayInputMethod_None = 0, + VROverlayInputMethod_Mouse = 1, +} VROverlayInputMethod; + +typedef enum VROverlayTransformType +{ + VROverlayTransformType_VROverlayTransform_Absolute = 0, + VROverlayTransformType_VROverlayTransform_TrackedDeviceRelative = 1, + VROverlayTransformType_VROverlayTransform_SystemOverlay = 2, + VROverlayTransformType_VROverlayTransform_TrackedComponent = 3, +} VROverlayTransformType; + +typedef enum VROverlayFlags +{ + VROverlayFlags_None = 0, + VROverlayFlags_Curved = 1, + VROverlayFlags_RGSS4X = 2, + VROverlayFlags_NoDashboardTab = 3, + VROverlayFlags_AcceptsGamepadEvents = 4, + VROverlayFlags_ShowGamepadFocus = 5, + VROverlayFlags_SendVRScrollEvents = 6, + VROverlayFlags_SendVRTouchpadEvents = 7, + VROverlayFlags_ShowTouchPadScrollWheel = 8, + VROverlayFlags_TransferOwnershipToInternalProcess = 9, + VROverlayFlags_SideBySide_Parallel = 10, + VROverlayFlags_SideBySide_Crossed = 11, + VROverlayFlags_Panorama = 12, + VROverlayFlags_StereoPanorama = 13, + VROverlayFlags_SortWithNonSceneOverlays = 14, + VROverlayFlags_VisibleInDashboard = 15, +} VROverlayFlags; + +typedef enum VRMessageOverlayResponse +{ + VRMessageOverlayResponse_ButtonPress_0 = 0, + VRMessageOverlayResponse_ButtonPress_1 = 1, + VRMessageOverlayResponse_ButtonPress_2 = 2, + VRMessageOverlayResponse_ButtonPress_3 = 3, + VRMessageOverlayResponse_CouldntFindSystemOverlay = 4, + VRMessageOverlayResponse_CouldntFindOrCreateClientOverlay = 5, + VRMessageOverlayResponse_ApplicationQuit = 6, +} VRMessageOverlayResponse; + +typedef enum EGamepadTextInputMode +{ + EGamepadTextInputMode_k_EGamepadTextInputModeNormal = 0, + EGamepadTextInputMode_k_EGamepadTextInputModePassword = 1, + EGamepadTextInputMode_k_EGamepadTextInputModeSubmit = 2, +} EGamepadTextInputMode; + +typedef enum EGamepadTextInputLineMode +{ + EGamepadTextInputLineMode_k_EGamepadTextInputLineModeSingleLine = 0, + EGamepadTextInputLineMode_k_EGamepadTextInputLineModeMultipleLines = 1, +} EGamepadTextInputLineMode; + +typedef enum EOverlayDirection +{ + EOverlayDirection_OverlayDirection_Up = 0, + EOverlayDirection_OverlayDirection_Down = 1, + EOverlayDirection_OverlayDirection_Left = 2, + EOverlayDirection_OverlayDirection_Right = 3, + EOverlayDirection_OverlayDirection_Count = 4, +} EOverlayDirection; + +typedef enum EVROverlayIntersectionMaskPrimitiveType +{ + EVROverlayIntersectionMaskPrimitiveType_OverlayIntersectionPrimitiveType_Rectangle = 0, + EVROverlayIntersectionMaskPrimitiveType_OverlayIntersectionPrimitiveType_Circle = 1, +} EVROverlayIntersectionMaskPrimitiveType; + +typedef enum EVRRenderModelError +{ + EVRRenderModelError_VRRenderModelError_None = 0, + EVRRenderModelError_VRRenderModelError_Loading = 100, + EVRRenderModelError_VRRenderModelError_NotSupported = 200, + EVRRenderModelError_VRRenderModelError_InvalidArg = 300, + EVRRenderModelError_VRRenderModelError_InvalidModel = 301, + EVRRenderModelError_VRRenderModelError_NoShapes = 302, + EVRRenderModelError_VRRenderModelError_MultipleShapes = 303, + EVRRenderModelError_VRRenderModelError_TooManyVertices = 304, + EVRRenderModelError_VRRenderModelError_MultipleTextures = 305, + EVRRenderModelError_VRRenderModelError_BufferTooSmall = 306, + EVRRenderModelError_VRRenderModelError_NotEnoughNormals = 307, + EVRRenderModelError_VRRenderModelError_NotEnoughTexCoords = 308, + EVRRenderModelError_VRRenderModelError_InvalidTexture = 400, +} EVRRenderModelError; + +typedef enum EVRComponentProperty +{ + EVRComponentProperty_VRComponentProperty_IsStatic = 1, + EVRComponentProperty_VRComponentProperty_IsVisible = 2, + EVRComponentProperty_VRComponentProperty_IsTouched = 4, + EVRComponentProperty_VRComponentProperty_IsPressed = 8, + EVRComponentProperty_VRComponentProperty_IsScrolled = 16, +} EVRComponentProperty; + +typedef enum EVRNotificationType +{ + EVRNotificationType_Transient = 0, + EVRNotificationType_Persistent = 1, + EVRNotificationType_Transient_SystemWithUserValue = 2, +} EVRNotificationType; + +typedef enum EVRNotificationStyle +{ + EVRNotificationStyle_None = 0, + EVRNotificationStyle_Application = 100, + EVRNotificationStyle_Contact_Disabled = 200, + EVRNotificationStyle_Contact_Enabled = 201, + EVRNotificationStyle_Contact_Active = 202, +} EVRNotificationStyle; + +typedef enum EVRSettingsError +{ + EVRSettingsError_VRSettingsError_None = 0, + EVRSettingsError_VRSettingsError_IPCFailed = 1, + EVRSettingsError_VRSettingsError_WriteFailed = 2, + EVRSettingsError_VRSettingsError_ReadFailed = 3, + EVRSettingsError_VRSettingsError_JsonParseFailed = 4, + EVRSettingsError_VRSettingsError_UnsetSettingHasNoDefault = 5, +} EVRSettingsError; + +typedef enum EVRScreenshotError +{ + EVRScreenshotError_VRScreenshotError_None = 0, + EVRScreenshotError_VRScreenshotError_RequestFailed = 1, + EVRScreenshotError_VRScreenshotError_IncompatibleVersion = 100, + EVRScreenshotError_VRScreenshotError_NotFound = 101, + EVRScreenshotError_VRScreenshotError_BufferTooSmall = 102, + EVRScreenshotError_VRScreenshotError_ScreenshotAlreadyInProgress = 108, +} EVRScreenshotError; + + +// OpenVR typedefs + +typedef uint32_t TrackedDeviceIndex_t; +typedef uint32_t VRNotificationId; +typedef uint64_t VROverlayHandle_t; + +typedef void * glSharedTextureHandle_t; +typedef int32_t glInt_t; +typedef uint32_t glUInt_t; +typedef uint64_t SharedTextureHandle_t; +typedef uint32_t DriverId_t; +typedef uint32_t TrackedDeviceIndex_t; +typedef uint64_t PropertyContainerHandle_t; +typedef uint32_t PropertyTypeTag_t; +typedef uint64_t VROverlayHandle_t; +typedef uint64_t TrackedCameraHandle_t; +typedef uint32_t ScreenshotHandle_t; +typedef uint32_t VRComponentProperties; +typedef int32_t TextureID_t; +typedef uint32_t VRNotificationId; +typedef EVRInitError HmdError; +typedef EVREye Hmd_Eye; +typedef EColorSpace ColorSpace; +typedef ETrackingResult HmdTrackingResult; +typedef ETrackedDeviceClass TrackedDeviceClass; +typedef ETrackingUniverseOrigin TrackingUniverseOrigin; +typedef ETrackedDeviceProperty TrackedDeviceProperty; +typedef ETrackedPropertyError TrackedPropertyError; +typedef EVRSubmitFlags VRSubmitFlags_t; +typedef EVRState VRState_t; +typedef ECollisionBoundsStyle CollisionBoundsStyle_t; +typedef EVROverlayError VROverlayError; +typedef EVRFirmwareError VRFirmwareError; +typedef EVRCompositorError VRCompositorError; +typedef EVRScreenshotError VRScreenshotsError; + +// OpenVR Structs + +typedef struct HmdMatrix34_t +{ + float m[3][4]; //float[3][4] +} HmdMatrix34_t; + +typedef struct HmdMatrix44_t +{ + float m[4][4]; //float[4][4] +} HmdMatrix44_t; + +typedef struct HmdVector3_t +{ + float v[3]; //float[3] +} HmdVector3_t; + +typedef struct HmdVector4_t +{ + float v[4]; //float[4] +} HmdVector4_t; + +typedef struct HmdVector3d_t +{ + double v[3]; //double[3] +} HmdVector3d_t; + +typedef struct HmdVector2_t +{ + float v[2]; //float[2] +} HmdVector2_t; + +typedef struct HmdQuaternion_t +{ + double w; + double x; + double y; + double z; +} HmdQuaternion_t; + +typedef struct HmdColor_t +{ + float r; + float g; + float b; + float a; +} HmdColor_t; + +typedef struct HmdQuad_t +{ + struct HmdVector3_t vCorners[4]; //struct vr::HmdVector3_t[4] +} HmdQuad_t; + +typedef struct HmdRect2_t +{ + struct HmdVector2_t vTopLeft; + struct HmdVector2_t vBottomRight; +} HmdRect2_t; + +typedef struct DistortionCoordinates_t +{ + float rfRed[2]; //float[2] + float rfGreen[2]; //float[2] + float rfBlue[2]; //float[2] +} DistortionCoordinates_t; + +typedef struct Texture_t +{ + void * handle; // void * + enum ETextureType eType; + enum EColorSpace eColorSpace; +} Texture_t; + +typedef struct TrackedDevicePose_t +{ + struct HmdMatrix34_t mDeviceToAbsoluteTracking; + struct HmdVector3_t vVelocity; + struct HmdVector3_t vAngularVelocity; + enum ETrackingResult eTrackingResult; + bool bPoseIsValid; + bool bDeviceIsConnected; +} TrackedDevicePose_t; + +typedef struct VRTextureBounds_t +{ + float uMin; + float vMin; + float uMax; + float vMax; +} VRTextureBounds_t; + +typedef struct VRVulkanTextureData_t +{ + uint64_t m_nImage; + struct VkDevice_T * m_pDevice; // struct VkDevice_T * + struct VkPhysicalDevice_T * m_pPhysicalDevice; // struct VkPhysicalDevice_T * + struct VkInstance_T * m_pInstance; // struct VkInstance_T * + struct VkQueue_T * m_pQueue; // struct VkQueue_T * + uint32_t m_nQueueFamilyIndex; + uint32_t m_nWidth; + uint32_t m_nHeight; + uint32_t m_nFormat; + uint32_t m_nSampleCount; +} VRVulkanTextureData_t; + +typedef struct D3D12TextureData_t +{ + struct ID3D12Resource * m_pResource; // struct ID3D12Resource * + struct ID3D12CommandQueue * m_pCommandQueue; // struct ID3D12CommandQueue * + uint32_t m_nNodeMask; +} D3D12TextureData_t; + +typedef struct VREvent_Controller_t +{ + uint32_t button; +} VREvent_Controller_t; + +typedef struct VREvent_Mouse_t +{ + float x; + float y; + uint32_t button; +} VREvent_Mouse_t; + +typedef struct VREvent_Scroll_t +{ + float xdelta; + float ydelta; + uint32_t repeatCount; +} VREvent_Scroll_t; + +typedef struct VREvent_TouchPadMove_t +{ + bool bFingerDown; + float flSecondsFingerDown; + float fValueXFirst; + float fValueYFirst; + float fValueXRaw; + float fValueYRaw; +} VREvent_TouchPadMove_t; + +typedef struct VREvent_Notification_t +{ + uint64_t ulUserValue; + uint32_t notificationId; +} VREvent_Notification_t; + +typedef struct VREvent_Process_t +{ + uint32_t pid; + uint32_t oldPid; + bool bForced; +} VREvent_Process_t; + +typedef struct VREvent_Overlay_t +{ + uint64_t overlayHandle; +} VREvent_Overlay_t; + +typedef struct VREvent_Status_t +{ + uint32_t statusState; +} VREvent_Status_t; + +typedef struct VREvent_Keyboard_t +{ + char * cNewInput[8]; //char[8] + uint64_t uUserValue; +} VREvent_Keyboard_t; + +typedef struct VREvent_Ipd_t +{ + float ipdMeters; +} VREvent_Ipd_t; + +typedef struct VREvent_Chaperone_t +{ + uint64_t m_nPreviousUniverse; + uint64_t m_nCurrentUniverse; +} VREvent_Chaperone_t; + +typedef struct VREvent_Reserved_t +{ + uint64_t reserved0; + uint64_t reserved1; +} VREvent_Reserved_t; + +typedef struct VREvent_PerformanceTest_t +{ + uint32_t m_nFidelityLevel; +} VREvent_PerformanceTest_t; + +typedef struct VREvent_SeatedZeroPoseReset_t +{ + bool bResetBySystemMenu; +} VREvent_SeatedZeroPoseReset_t; + +typedef struct VREvent_Screenshot_t +{ + uint32_t handle; + uint32_t type; +} VREvent_Screenshot_t; + +typedef struct VREvent_ScreenshotProgress_t +{ + float progress; +} VREvent_ScreenshotProgress_t; + +typedef struct VREvent_ApplicationLaunch_t +{ + uint32_t pid; + uint32_t unArgsHandle; +} VREvent_ApplicationLaunch_t; + +typedef struct VREvent_EditingCameraSurface_t +{ + uint64_t overlayHandle; + uint32_t nVisualMode; +} VREvent_EditingCameraSurface_t; + +typedef struct VREvent_MessageOverlay_t +{ + uint32_t unVRMessageOverlayResponse; +} VREvent_MessageOverlay_t; + +typedef struct VREvent_Property_t +{ + PropertyContainerHandle_t container; + enum ETrackedDeviceProperty prop; +} VREvent_Property_t; + +typedef struct HiddenAreaMesh_t +{ + struct HmdVector2_t * pVertexData; // const struct vr::HmdVector2_t * + uint32_t unTriangleCount; +} HiddenAreaMesh_t; + +typedef struct VRControllerAxis_t +{ + float x; + float y; +} VRControllerAxis_t; + +typedef struct VRControllerState_t +{ + uint32_t unPacketNum; + uint64_t ulButtonPressed; + uint64_t ulButtonTouched; + struct VRControllerAxis_t rAxis[5]; //struct vr::VRControllerAxis_t[5] +} VRControllerState_t; + +typedef struct Compositor_OverlaySettings +{ + uint32_t size; + bool curved; + bool antialias; + float scale; + float distance; + float alpha; + float uOffset; + float vOffset; + float uScale; + float vScale; + float gridDivs; + float gridWidth; + float gridScale; + struct HmdMatrix44_t transform; +} Compositor_OverlaySettings; + +typedef struct CameraVideoStreamFrameHeader_t +{ + enum EVRTrackedCameraFrameType eFrameType; + uint32_t nWidth; + uint32_t nHeight; + uint32_t nBytesPerPixel; + uint32_t nFrameSequence; + struct TrackedDevicePose_t standingTrackedDevicePose; +} CameraVideoStreamFrameHeader_t; + +typedef struct AppOverrideKeys_t +{ + char * pchKey; // const char * + char * pchValue; // const char * +} AppOverrideKeys_t; + +typedef struct Compositor_FrameTiming +{ + uint32_t m_nSize; + uint32_t m_nFrameIndex; + uint32_t m_nNumFramePresents; + uint32_t m_nNumMisPresented; + uint32_t m_nNumDroppedFrames; + uint32_t m_nReprojectionFlags; + double m_flSystemTimeInSeconds; + float m_flPreSubmitGpuMs; + float m_flPostSubmitGpuMs; + float m_flTotalRenderGpuMs; + float m_flCompositorRenderGpuMs; + float m_flCompositorRenderCpuMs; + float m_flCompositorIdleCpuMs; + float m_flClientFrameIntervalMs; + float m_flPresentCallCpuMs; + float m_flWaitForPresentCpuMs; + float m_flSubmitFrameMs; + float m_flWaitGetPosesCalledMs; + float m_flNewPosesReadyMs; + float m_flNewFrameReadyMs; + float m_flCompositorUpdateStartMs; + float m_flCompositorUpdateEndMs; + float m_flCompositorRenderStartMs; + TrackedDevicePose_t m_HmdPose; +} Compositor_FrameTiming; + +typedef struct Compositor_CumulativeStats +{ + uint32_t m_nPid; + uint32_t m_nNumFramePresents; + uint32_t m_nNumDroppedFrames; + uint32_t m_nNumReprojectedFrames; + uint32_t m_nNumFramePresentsOnStartup; + uint32_t m_nNumDroppedFramesOnStartup; + uint32_t m_nNumReprojectedFramesOnStartup; + uint32_t m_nNumLoading; + uint32_t m_nNumFramePresentsLoading; + uint32_t m_nNumDroppedFramesLoading; + uint32_t m_nNumReprojectedFramesLoading; + uint32_t m_nNumTimedOut; + uint32_t m_nNumFramePresentsTimedOut; + uint32_t m_nNumDroppedFramesTimedOut; + uint32_t m_nNumReprojectedFramesTimedOut; +} Compositor_CumulativeStats; + +typedef struct VROverlayIntersectionParams_t +{ + struct HmdVector3_t vSource; + struct HmdVector3_t vDirection; + enum ETrackingUniverseOrigin eOrigin; +} VROverlayIntersectionParams_t; + +typedef struct VROverlayIntersectionResults_t +{ + struct HmdVector3_t vPoint; + struct HmdVector3_t vNormal; + struct HmdVector2_t vUVs; + float fDistance; +} VROverlayIntersectionResults_t; + +typedef struct IntersectionMaskRectangle_t +{ + float m_flTopLeftX; + float m_flTopLeftY; + float m_flWidth; + float m_flHeight; +} IntersectionMaskRectangle_t; + +typedef struct IntersectionMaskCircle_t +{ + float m_flCenterX; + float m_flCenterY; + float m_flRadius; +} IntersectionMaskCircle_t; + +typedef struct RenderModel_ComponentState_t +{ + struct HmdMatrix34_t mTrackingToComponentRenderModel; + struct HmdMatrix34_t mTrackingToComponentLocal; + VRComponentProperties uProperties; +} RenderModel_ComponentState_t; + +typedef struct RenderModel_Vertex_t +{ + struct HmdVector3_t vPosition; + struct HmdVector3_t vNormal; + float rfTextureCoord[2]; //float[2] +} RenderModel_Vertex_t; + +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( push, 4 ) +#endif +typedef struct RenderModel_TextureMap_t +{ + uint16_t unWidth; + uint16_t unHeight; + uint8_t * rubTextureMapData; // const uint8_t * +} RenderModel_TextureMap_t; + +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( pop ) +#endif +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( push, 4 ) +#endif +typedef struct RenderModel_t +{ + struct RenderModel_Vertex_t * rVertexData; // const struct vr::RenderModel_Vertex_t * + uint32_t unVertexCount; + uint16_t * rIndexData; // const uint16_t * + uint32_t unTriangleCount; + TextureID_t diffuseTextureId; +} RenderModel_t; + +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( pop ) +#endif +typedef struct RenderModel_ControllerMode_State_t +{ + bool bScrollWheelVisible; +} RenderModel_ControllerMode_State_t; + +typedef struct NotificationBitmap_t +{ + void * m_pImageData; // void * + int32_t m_nWidth; + int32_t m_nHeight; + int32_t m_nBytesPerPixel; +} NotificationBitmap_t; + +typedef struct COpenVRContext +{ + intptr_t m_pVRSystem; // class vr::IVRSystem * + intptr_t m_pVRChaperone; // class vr::IVRChaperone * + intptr_t m_pVRChaperoneSetup; // class vr::IVRChaperoneSetup * + intptr_t m_pVRCompositor; // class vr::IVRCompositor * + intptr_t m_pVROverlay; // class vr::IVROverlay * + intptr_t m_pVRResources; // class vr::IVRResources * + intptr_t m_pVRRenderModels; // class vr::IVRRenderModels * + intptr_t m_pVRExtendedDisplay; // class vr::IVRExtendedDisplay * + intptr_t m_pVRSettings; // class vr::IVRSettings * + intptr_t m_pVRApplications; // class vr::IVRApplications * + intptr_t m_pVRTrackedCamera; // class vr::IVRTrackedCamera * + intptr_t m_pVRScreenshots; // class vr::IVRScreenshots * + intptr_t m_pVRDriverManager; // class vr::IVRDriverManager * +} COpenVRContext; + + +typedef union +{ + VREvent_Reserved_t reserved; + VREvent_Controller_t controller; + VREvent_Mouse_t mouse; + VREvent_Scroll_t scroll; + VREvent_Process_t process; + VREvent_Notification_t notification; + VREvent_Overlay_t overlay; + VREvent_Status_t status; + VREvent_Keyboard_t keyboard; + VREvent_Ipd_t ipd; + VREvent_Chaperone_t chaperone; + VREvent_PerformanceTest_t performanceTest; + VREvent_TouchPadMove_t touchPadMove; + VREvent_SeatedZeroPoseReset_t seatedZeroPoseReset; +} VREvent_Data_t; + +/** An event posted by the server to all running applications */ +struct VREvent_t +{ + uint32_t eventType; // EVREventType enum + TrackedDeviceIndex_t trackedDeviceIndex; + float eventAgeSeconds; + // event data must be the end of the struct as its size is variable + VREvent_Data_t data; +}; + + +typedef union +{ + IntersectionMaskRectangle_t m_Rectangle; + IntersectionMaskCircle_t m_Circle; +} VROverlayIntersectionMaskPrimitive_Data_t; + +struct VROverlayIntersectionMaskPrimitive_t +{ + EVROverlayIntersectionMaskPrimitiveType m_nPrimitiveType; + VROverlayIntersectionMaskPrimitive_Data_t m_Primitive; +}; + + +// OpenVR Function Pointer Tables + +struct VR_IVRSystem_FnTable +{ + void (OPENVR_FNTABLE_CALLTYPE *GetRecommendedRenderTargetSize)(uint32_t * pnWidth, uint32_t * pnHeight); + struct HmdMatrix44_t (OPENVR_FNTABLE_CALLTYPE *GetProjectionMatrix)(EVREye eEye, float fNearZ, float fFarZ); + void (OPENVR_FNTABLE_CALLTYPE *GetProjectionRaw)(EVREye eEye, float * pfLeft, float * pfRight, float * pfTop, float * pfBottom); + bool (OPENVR_FNTABLE_CALLTYPE *ComputeDistortion)(EVREye eEye, float fU, float fV, struct DistortionCoordinates_t * pDistortionCoordinates); + struct HmdMatrix34_t (OPENVR_FNTABLE_CALLTYPE *GetEyeToHeadTransform)(EVREye eEye); + bool (OPENVR_FNTABLE_CALLTYPE *GetTimeSinceLastVsync)(float * pfSecondsSinceLastVsync, uint64_t * pulFrameCounter); + int32_t (OPENVR_FNTABLE_CALLTYPE *GetD3D9AdapterIndex)(); + void (OPENVR_FNTABLE_CALLTYPE *GetDXGIOutputInfo)(int32_t * pnAdapterIndex); + void (OPENVR_FNTABLE_CALLTYPE *GetOutputDevice)(uint64_t * pnDevice, ETextureType textureType); + bool (OPENVR_FNTABLE_CALLTYPE *IsDisplayOnDesktop)(); + bool (OPENVR_FNTABLE_CALLTYPE *SetDisplayVisibility)(bool bIsVisibleOnDesktop); + void (OPENVR_FNTABLE_CALLTYPE *GetDeviceToAbsoluteTrackingPose)(ETrackingUniverseOrigin eOrigin, float fPredictedSecondsToPhotonsFromNow, struct TrackedDevicePose_t * pTrackedDevicePoseArray, uint32_t unTrackedDevicePoseArrayCount); + void (OPENVR_FNTABLE_CALLTYPE *ResetSeatedZeroPose)(); + struct HmdMatrix34_t (OPENVR_FNTABLE_CALLTYPE *GetSeatedZeroPoseToStandingAbsoluteTrackingPose)(); + struct HmdMatrix34_t (OPENVR_FNTABLE_CALLTYPE *GetRawZeroPoseToStandingAbsoluteTrackingPose)(); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetSortedTrackedDeviceIndicesOfClass)(ETrackedDeviceClass eTrackedDeviceClass, TrackedDeviceIndex_t * punTrackedDeviceIndexArray, uint32_t unTrackedDeviceIndexArrayCount, TrackedDeviceIndex_t unRelativeToTrackedDeviceIndex); + EDeviceActivityLevel (OPENVR_FNTABLE_CALLTYPE *GetTrackedDeviceActivityLevel)(TrackedDeviceIndex_t unDeviceId); + void (OPENVR_FNTABLE_CALLTYPE *ApplyTransform)(struct TrackedDevicePose_t * pOutputPose, struct TrackedDevicePose_t * pTrackedDevicePose, struct HmdMatrix34_t * pTransform); + TrackedDeviceIndex_t (OPENVR_FNTABLE_CALLTYPE *GetTrackedDeviceIndexForControllerRole)(ETrackedControllerRole unDeviceType); + ETrackedControllerRole (OPENVR_FNTABLE_CALLTYPE *GetControllerRoleForTrackedDeviceIndex)(TrackedDeviceIndex_t unDeviceIndex); + ETrackedDeviceClass (OPENVR_FNTABLE_CALLTYPE *GetTrackedDeviceClass)(TrackedDeviceIndex_t unDeviceIndex); + bool (OPENVR_FNTABLE_CALLTYPE *IsTrackedDeviceConnected)(TrackedDeviceIndex_t unDeviceIndex); + bool (OPENVR_FNTABLE_CALLTYPE *GetBoolTrackedDeviceProperty)(TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError * pError); + float (OPENVR_FNTABLE_CALLTYPE *GetFloatTrackedDeviceProperty)(TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError * pError); + int32_t (OPENVR_FNTABLE_CALLTYPE *GetInt32TrackedDeviceProperty)(TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError * pError); + uint64_t (OPENVR_FNTABLE_CALLTYPE *GetUint64TrackedDeviceProperty)(TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError * pError); + struct HmdMatrix34_t (OPENVR_FNTABLE_CALLTYPE *GetMatrix34TrackedDeviceProperty)(TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError * pError); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetStringTrackedDeviceProperty)(TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, char * pchValue, uint32_t unBufferSize, ETrackedPropertyError * pError); + char * (OPENVR_FNTABLE_CALLTYPE *GetPropErrorNameFromEnum)(ETrackedPropertyError error); + bool (OPENVR_FNTABLE_CALLTYPE *PollNextEvent)(struct VREvent_t * pEvent, uint32_t uncbVREvent); + bool (OPENVR_FNTABLE_CALLTYPE *PollNextEventWithPose)(ETrackingUniverseOrigin eOrigin, struct VREvent_t * pEvent, uint32_t uncbVREvent, TrackedDevicePose_t * pTrackedDevicePose); + char * (OPENVR_FNTABLE_CALLTYPE *GetEventTypeNameFromEnum)(EVREventType eType); + struct HiddenAreaMesh_t (OPENVR_FNTABLE_CALLTYPE *GetHiddenAreaMesh)(EVREye eEye, EHiddenAreaMeshType type); + bool (OPENVR_FNTABLE_CALLTYPE *GetControllerState)(TrackedDeviceIndex_t unControllerDeviceIndex, VRControllerState_t * pControllerState, uint32_t unControllerStateSize); + bool (OPENVR_FNTABLE_CALLTYPE *GetControllerStateWithPose)(ETrackingUniverseOrigin eOrigin, TrackedDeviceIndex_t unControllerDeviceIndex, VRControllerState_t * pControllerState, uint32_t unControllerStateSize, struct TrackedDevicePose_t * pTrackedDevicePose); + void (OPENVR_FNTABLE_CALLTYPE *TriggerHapticPulse)(TrackedDeviceIndex_t unControllerDeviceIndex, uint32_t unAxisId, unsigned short usDurationMicroSec); + char * (OPENVR_FNTABLE_CALLTYPE *GetButtonIdNameFromEnum)(EVRButtonId eButtonId); + char * (OPENVR_FNTABLE_CALLTYPE *GetControllerAxisTypeNameFromEnum)(EVRControllerAxisType eAxisType); + bool (OPENVR_FNTABLE_CALLTYPE *CaptureInputFocus)(); + void (OPENVR_FNTABLE_CALLTYPE *ReleaseInputFocus)(); + bool (OPENVR_FNTABLE_CALLTYPE *IsInputFocusCapturedByAnotherProcess)(); + uint32_t (OPENVR_FNTABLE_CALLTYPE *DriverDebugRequest)(TrackedDeviceIndex_t unDeviceIndex, char * pchRequest, char * pchResponseBuffer, uint32_t unResponseBufferSize); + EVRFirmwareError (OPENVR_FNTABLE_CALLTYPE *PerformFirmwareUpdate)(TrackedDeviceIndex_t unDeviceIndex); + void (OPENVR_FNTABLE_CALLTYPE *AcknowledgeQuit_Exiting)(); + void (OPENVR_FNTABLE_CALLTYPE *AcknowledgeQuit_UserPrompt)(); +}; + +struct VR_IVRExtendedDisplay_FnTable +{ + void (OPENVR_FNTABLE_CALLTYPE *GetWindowBounds)(int32_t * pnX, int32_t * pnY, uint32_t * pnWidth, uint32_t * pnHeight); + void (OPENVR_FNTABLE_CALLTYPE *GetEyeOutputViewport)(EVREye eEye, uint32_t * pnX, uint32_t * pnY, uint32_t * pnWidth, uint32_t * pnHeight); + void (OPENVR_FNTABLE_CALLTYPE *GetDXGIOutputInfo)(int32_t * pnAdapterIndex, int32_t * pnAdapterOutputIndex); +}; + +struct VR_IVRTrackedCamera_FnTable +{ + char * (OPENVR_FNTABLE_CALLTYPE *GetCameraErrorNameFromEnum)(EVRTrackedCameraError eCameraError); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *HasCamera)(TrackedDeviceIndex_t nDeviceIndex, bool * pHasCamera); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *GetCameraFrameSize)(TrackedDeviceIndex_t nDeviceIndex, EVRTrackedCameraFrameType eFrameType, uint32_t * pnWidth, uint32_t * pnHeight, uint32_t * pnFrameBufferSize); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *GetCameraIntrinsics)(TrackedDeviceIndex_t nDeviceIndex, EVRTrackedCameraFrameType eFrameType, HmdVector2_t * pFocalLength, HmdVector2_t * pCenter); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *GetCameraProjection)(TrackedDeviceIndex_t nDeviceIndex, EVRTrackedCameraFrameType eFrameType, float flZNear, float flZFar, HmdMatrix44_t * pProjection); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *AcquireVideoStreamingService)(TrackedDeviceIndex_t nDeviceIndex, TrackedCameraHandle_t * pHandle); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *ReleaseVideoStreamingService)(TrackedCameraHandle_t hTrackedCamera); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *GetVideoStreamFrameBuffer)(TrackedCameraHandle_t hTrackedCamera, EVRTrackedCameraFrameType eFrameType, void * pFrameBuffer, uint32_t nFrameBufferSize, CameraVideoStreamFrameHeader_t * pFrameHeader, uint32_t nFrameHeaderSize); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *GetVideoStreamTextureSize)(TrackedDeviceIndex_t nDeviceIndex, EVRTrackedCameraFrameType eFrameType, VRTextureBounds_t * pTextureBounds, uint32_t * pnWidth, uint32_t * pnHeight); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *GetVideoStreamTextureD3D11)(TrackedCameraHandle_t hTrackedCamera, EVRTrackedCameraFrameType eFrameType, void * pD3D11DeviceOrResource, void ** ppD3D11ShaderResourceView, CameraVideoStreamFrameHeader_t * pFrameHeader, uint32_t nFrameHeaderSize); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *GetVideoStreamTextureGL)(TrackedCameraHandle_t hTrackedCamera, EVRTrackedCameraFrameType eFrameType, glUInt_t * pglTextureId, CameraVideoStreamFrameHeader_t * pFrameHeader, uint32_t nFrameHeaderSize); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *ReleaseVideoStreamTextureGL)(TrackedCameraHandle_t hTrackedCamera, glUInt_t glTextureId); +}; + +struct VR_IVRApplications_FnTable +{ + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *AddApplicationManifest)(char * pchApplicationManifestFullPath, bool bTemporary); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *RemoveApplicationManifest)(char * pchApplicationManifestFullPath); + bool (OPENVR_FNTABLE_CALLTYPE *IsApplicationInstalled)(char * pchAppKey); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetApplicationCount)(); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *GetApplicationKeyByIndex)(uint32_t unApplicationIndex, char * pchAppKeyBuffer, uint32_t unAppKeyBufferLen); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *GetApplicationKeyByProcessId)(uint32_t unProcessId, char * pchAppKeyBuffer, uint32_t unAppKeyBufferLen); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *LaunchApplication)(char * pchAppKey); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *LaunchTemplateApplication)(char * pchTemplateAppKey, char * pchNewAppKey, struct AppOverrideKeys_t * pKeys, uint32_t unKeys); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *LaunchApplicationFromMimeType)(char * pchMimeType, char * pchArgs); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *LaunchDashboardOverlay)(char * pchAppKey); + bool (OPENVR_FNTABLE_CALLTYPE *CancelApplicationLaunch)(char * pchAppKey); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *IdentifyApplication)(uint32_t unProcessId, char * pchAppKey); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetApplicationProcessId)(char * pchAppKey); + char * (OPENVR_FNTABLE_CALLTYPE *GetApplicationsErrorNameFromEnum)(EVRApplicationError error); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetApplicationPropertyString)(char * pchAppKey, EVRApplicationProperty eProperty, char * pchPropertyValueBuffer, uint32_t unPropertyValueBufferLen, EVRApplicationError * peError); + bool (OPENVR_FNTABLE_CALLTYPE *GetApplicationPropertyBool)(char * pchAppKey, EVRApplicationProperty eProperty, EVRApplicationError * peError); + uint64_t (OPENVR_FNTABLE_CALLTYPE *GetApplicationPropertyUint64)(char * pchAppKey, EVRApplicationProperty eProperty, EVRApplicationError * peError); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *SetApplicationAutoLaunch)(char * pchAppKey, bool bAutoLaunch); + bool (OPENVR_FNTABLE_CALLTYPE *GetApplicationAutoLaunch)(char * pchAppKey); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *SetDefaultApplicationForMimeType)(char * pchAppKey, char * pchMimeType); + bool (OPENVR_FNTABLE_CALLTYPE *GetDefaultApplicationForMimeType)(char * pchMimeType, char * pchAppKeyBuffer, uint32_t unAppKeyBufferLen); + bool (OPENVR_FNTABLE_CALLTYPE *GetApplicationSupportedMimeTypes)(char * pchAppKey, char * pchMimeTypesBuffer, uint32_t unMimeTypesBuffer); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetApplicationsThatSupportMimeType)(char * pchMimeType, char * pchAppKeysThatSupportBuffer, uint32_t unAppKeysThatSupportBuffer); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetApplicationLaunchArguments)(uint32_t unHandle, char * pchArgs, uint32_t unArgs); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *GetStartingApplication)(char * pchAppKeyBuffer, uint32_t unAppKeyBufferLen); + EVRApplicationTransitionState (OPENVR_FNTABLE_CALLTYPE *GetTransitionState)(); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *PerformApplicationPrelaunchCheck)(char * pchAppKey); + char * (OPENVR_FNTABLE_CALLTYPE *GetApplicationsTransitionStateNameFromEnum)(EVRApplicationTransitionState state); + bool (OPENVR_FNTABLE_CALLTYPE *IsQuitUserPromptRequested)(); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *LaunchInternalProcess)(char * pchBinaryPath, char * pchArguments, char * pchWorkingDirectory); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetCurrentSceneProcessId)(); +}; + +struct VR_IVRChaperone_FnTable +{ + ChaperoneCalibrationState (OPENVR_FNTABLE_CALLTYPE *GetCalibrationState)(); + bool (OPENVR_FNTABLE_CALLTYPE *GetPlayAreaSize)(float * pSizeX, float * pSizeZ); + bool (OPENVR_FNTABLE_CALLTYPE *GetPlayAreaRect)(struct HmdQuad_t * rect); + void (OPENVR_FNTABLE_CALLTYPE *ReloadInfo)(); + void (OPENVR_FNTABLE_CALLTYPE *SetSceneColor)(struct HmdColor_t color); + void (OPENVR_FNTABLE_CALLTYPE *GetBoundsColor)(struct HmdColor_t * pOutputColorArray, int nNumOutputColors, float flCollisionBoundsFadeDistance, struct HmdColor_t * pOutputCameraColor); + bool (OPENVR_FNTABLE_CALLTYPE *AreBoundsVisible)(); + void (OPENVR_FNTABLE_CALLTYPE *ForceBoundsVisible)(bool bForce); +}; + +struct VR_IVRChaperoneSetup_FnTable +{ + bool (OPENVR_FNTABLE_CALLTYPE *CommitWorkingCopy)(EChaperoneConfigFile configFile); + void (OPENVR_FNTABLE_CALLTYPE *RevertWorkingCopy)(); + bool (OPENVR_FNTABLE_CALLTYPE *GetWorkingPlayAreaSize)(float * pSizeX, float * pSizeZ); + bool (OPENVR_FNTABLE_CALLTYPE *GetWorkingPlayAreaRect)(struct HmdQuad_t * rect); + bool (OPENVR_FNTABLE_CALLTYPE *GetWorkingCollisionBoundsInfo)(struct HmdQuad_t * pQuadsBuffer, uint32_t * punQuadsCount); + bool (OPENVR_FNTABLE_CALLTYPE *GetLiveCollisionBoundsInfo)(struct HmdQuad_t * pQuadsBuffer, uint32_t * punQuadsCount); + bool (OPENVR_FNTABLE_CALLTYPE *GetWorkingSeatedZeroPoseToRawTrackingPose)(struct HmdMatrix34_t * pmatSeatedZeroPoseToRawTrackingPose); + bool (OPENVR_FNTABLE_CALLTYPE *GetWorkingStandingZeroPoseToRawTrackingPose)(struct HmdMatrix34_t * pmatStandingZeroPoseToRawTrackingPose); + void (OPENVR_FNTABLE_CALLTYPE *SetWorkingPlayAreaSize)(float sizeX, float sizeZ); + void (OPENVR_FNTABLE_CALLTYPE *SetWorkingCollisionBoundsInfo)(struct HmdQuad_t * pQuadsBuffer, uint32_t unQuadsCount); + void (OPENVR_FNTABLE_CALLTYPE *SetWorkingSeatedZeroPoseToRawTrackingPose)(struct HmdMatrix34_t * pMatSeatedZeroPoseToRawTrackingPose); + void (OPENVR_FNTABLE_CALLTYPE *SetWorkingStandingZeroPoseToRawTrackingPose)(struct HmdMatrix34_t * pMatStandingZeroPoseToRawTrackingPose); + void (OPENVR_FNTABLE_CALLTYPE *ReloadFromDisk)(EChaperoneConfigFile configFile); + bool (OPENVR_FNTABLE_CALLTYPE *GetLiveSeatedZeroPoseToRawTrackingPose)(struct HmdMatrix34_t * pmatSeatedZeroPoseToRawTrackingPose); + void (OPENVR_FNTABLE_CALLTYPE *SetWorkingCollisionBoundsTagsInfo)(uint8_t * pTagsBuffer, uint32_t unTagCount); + bool (OPENVR_FNTABLE_CALLTYPE *GetLiveCollisionBoundsTagsInfo)(uint8_t * pTagsBuffer, uint32_t * punTagCount); + bool (OPENVR_FNTABLE_CALLTYPE *SetWorkingPhysicalBoundsInfo)(struct HmdQuad_t * pQuadsBuffer, uint32_t unQuadsCount); + bool (OPENVR_FNTABLE_CALLTYPE *GetLivePhysicalBoundsInfo)(struct HmdQuad_t * pQuadsBuffer, uint32_t * punQuadsCount); + bool (OPENVR_FNTABLE_CALLTYPE *ExportLiveToBuffer)(char * pBuffer, uint32_t * pnBufferLength); + bool (OPENVR_FNTABLE_CALLTYPE *ImportFromBufferToWorking)(char * pBuffer, uint32_t nImportFlags); +}; + +struct VR_IVRCompositor_FnTable +{ + void (OPENVR_FNTABLE_CALLTYPE *SetTrackingSpace)(ETrackingUniverseOrigin eOrigin); + ETrackingUniverseOrigin (OPENVR_FNTABLE_CALLTYPE *GetTrackingSpace)(); + EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *WaitGetPoses)(struct TrackedDevicePose_t * pRenderPoseArray, uint32_t unRenderPoseArrayCount, struct TrackedDevicePose_t * pGamePoseArray, uint32_t unGamePoseArrayCount); + EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *GetLastPoses)(struct TrackedDevicePose_t * pRenderPoseArray, uint32_t unRenderPoseArrayCount, struct TrackedDevicePose_t * pGamePoseArray, uint32_t unGamePoseArrayCount); + EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *GetLastPoseForTrackedDeviceIndex)(TrackedDeviceIndex_t unDeviceIndex, struct TrackedDevicePose_t * pOutputPose, struct TrackedDevicePose_t * pOutputGamePose); + EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *Submit)(EVREye eEye, struct Texture_t * pTexture, struct VRTextureBounds_t * pBounds, EVRSubmitFlags nSubmitFlags); + void (OPENVR_FNTABLE_CALLTYPE *ClearLastSubmittedFrame)(); + void (OPENVR_FNTABLE_CALLTYPE *PostPresentHandoff)(); + bool (OPENVR_FNTABLE_CALLTYPE *GetFrameTiming)(struct Compositor_FrameTiming * pTiming, uint32_t unFramesAgo); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetFrameTimings)(struct Compositor_FrameTiming * pTiming, uint32_t nFrames); + float (OPENVR_FNTABLE_CALLTYPE *GetFrameTimeRemaining)(); + void (OPENVR_FNTABLE_CALLTYPE *GetCumulativeStats)(struct Compositor_CumulativeStats * pStats, uint32_t nStatsSizeInBytes); + void (OPENVR_FNTABLE_CALLTYPE *FadeToColor)(float fSeconds, float fRed, float fGreen, float fBlue, float fAlpha, bool bBackground); + struct HmdColor_t (OPENVR_FNTABLE_CALLTYPE *GetCurrentFadeColor)(bool bBackground); + void (OPENVR_FNTABLE_CALLTYPE *FadeGrid)(float fSeconds, bool bFadeIn); + float (OPENVR_FNTABLE_CALLTYPE *GetCurrentGridAlpha)(); + EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *SetSkyboxOverride)(struct Texture_t * pTextures, uint32_t unTextureCount); + void (OPENVR_FNTABLE_CALLTYPE *ClearSkyboxOverride)(); + void (OPENVR_FNTABLE_CALLTYPE *CompositorBringToFront)(); + void (OPENVR_FNTABLE_CALLTYPE *CompositorGoToBack)(); + void (OPENVR_FNTABLE_CALLTYPE *CompositorQuit)(); + bool (OPENVR_FNTABLE_CALLTYPE *IsFullscreen)(); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetCurrentSceneFocusProcess)(); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetLastFrameRenderer)(); + bool (OPENVR_FNTABLE_CALLTYPE *CanRenderScene)(); + void (OPENVR_FNTABLE_CALLTYPE *ShowMirrorWindow)(); + void (OPENVR_FNTABLE_CALLTYPE *HideMirrorWindow)(); + bool (OPENVR_FNTABLE_CALLTYPE *IsMirrorWindowVisible)(); + void (OPENVR_FNTABLE_CALLTYPE *CompositorDumpImages)(); + bool (OPENVR_FNTABLE_CALLTYPE *ShouldAppRenderWithLowResources)(); + void (OPENVR_FNTABLE_CALLTYPE *ForceInterleavedReprojectionOn)(bool bOverride); + void (OPENVR_FNTABLE_CALLTYPE *ForceReconnectProcess)(); + void (OPENVR_FNTABLE_CALLTYPE *SuspendRendering)(bool bSuspend); + EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *GetMirrorTextureD3D11)(EVREye eEye, void * pD3D11DeviceOrResource, void ** ppD3D11ShaderResourceView); + void (OPENVR_FNTABLE_CALLTYPE *ReleaseMirrorTextureD3D11)(void * pD3D11ShaderResourceView); + EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *GetMirrorTextureGL)(EVREye eEye, glUInt_t * pglTextureId, glSharedTextureHandle_t * pglSharedTextureHandle); + bool (OPENVR_FNTABLE_CALLTYPE *ReleaseSharedGLTexture)(glUInt_t glTextureId, glSharedTextureHandle_t glSharedTextureHandle); + void (OPENVR_FNTABLE_CALLTYPE *LockGLSharedTextureForAccess)(glSharedTextureHandle_t glSharedTextureHandle); + void (OPENVR_FNTABLE_CALLTYPE *UnlockGLSharedTextureForAccess)(glSharedTextureHandle_t glSharedTextureHandle); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetVulkanInstanceExtensionsRequired)(char * pchValue, uint32_t unBufferSize); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetVulkanDeviceExtensionsRequired)(struct VkPhysicalDevice_T * pPhysicalDevice, char * pchValue, uint32_t unBufferSize); +}; + +struct VR_IVROverlay_FnTable +{ + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *FindOverlay)(char * pchOverlayKey, VROverlayHandle_t * pOverlayHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *CreateOverlay)(char * pchOverlayKey, char * pchOverlayName, VROverlayHandle_t * pOverlayHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *DestroyOverlay)(VROverlayHandle_t ulOverlayHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetHighQualityOverlay)(VROverlayHandle_t ulOverlayHandle); + VROverlayHandle_t (OPENVR_FNTABLE_CALLTYPE *GetHighQualityOverlay)(); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetOverlayKey)(VROverlayHandle_t ulOverlayHandle, char * pchValue, uint32_t unBufferSize, EVROverlayError * pError); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetOverlayName)(VROverlayHandle_t ulOverlayHandle, char * pchValue, uint32_t unBufferSize, EVROverlayError * pError); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayName)(VROverlayHandle_t ulOverlayHandle, char * pchName); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayImageData)(VROverlayHandle_t ulOverlayHandle, void * pvBuffer, uint32_t unBufferSize, uint32_t * punWidth, uint32_t * punHeight); + char * (OPENVR_FNTABLE_CALLTYPE *GetOverlayErrorNameFromEnum)(EVROverlayError error); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayRenderingPid)(VROverlayHandle_t ulOverlayHandle, uint32_t unPID); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetOverlayRenderingPid)(VROverlayHandle_t ulOverlayHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayFlag)(VROverlayHandle_t ulOverlayHandle, VROverlayFlags eOverlayFlag, bool bEnabled); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayFlag)(VROverlayHandle_t ulOverlayHandle, VROverlayFlags eOverlayFlag, bool * pbEnabled); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayColor)(VROverlayHandle_t ulOverlayHandle, float fRed, float fGreen, float fBlue); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayColor)(VROverlayHandle_t ulOverlayHandle, float * pfRed, float * pfGreen, float * pfBlue); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayAlpha)(VROverlayHandle_t ulOverlayHandle, float fAlpha); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayAlpha)(VROverlayHandle_t ulOverlayHandle, float * pfAlpha); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayTexelAspect)(VROverlayHandle_t ulOverlayHandle, float fTexelAspect); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTexelAspect)(VROverlayHandle_t ulOverlayHandle, float * pfTexelAspect); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlaySortOrder)(VROverlayHandle_t ulOverlayHandle, uint32_t unSortOrder); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlaySortOrder)(VROverlayHandle_t ulOverlayHandle, uint32_t * punSortOrder); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayWidthInMeters)(VROverlayHandle_t ulOverlayHandle, float fWidthInMeters); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayWidthInMeters)(VROverlayHandle_t ulOverlayHandle, float * pfWidthInMeters); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayAutoCurveDistanceRangeInMeters)(VROverlayHandle_t ulOverlayHandle, float fMinDistanceInMeters, float fMaxDistanceInMeters); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayAutoCurveDistanceRangeInMeters)(VROverlayHandle_t ulOverlayHandle, float * pfMinDistanceInMeters, float * pfMaxDistanceInMeters); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayTextureColorSpace)(VROverlayHandle_t ulOverlayHandle, EColorSpace eTextureColorSpace); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTextureColorSpace)(VROverlayHandle_t ulOverlayHandle, EColorSpace * peTextureColorSpace); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayTextureBounds)(VROverlayHandle_t ulOverlayHandle, struct VRTextureBounds_t * pOverlayTextureBounds); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTextureBounds)(VROverlayHandle_t ulOverlayHandle, struct VRTextureBounds_t * pOverlayTextureBounds); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetOverlayRenderModel)(VROverlayHandle_t ulOverlayHandle, char * pchValue, uint32_t unBufferSize, struct HmdColor_t * pColor, EVROverlayError * pError); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayRenderModel)(VROverlayHandle_t ulOverlayHandle, char * pchRenderModel, struct HmdColor_t * pColor); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTransformType)(VROverlayHandle_t ulOverlayHandle, VROverlayTransformType * peTransformType); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayTransformAbsolute)(VROverlayHandle_t ulOverlayHandle, ETrackingUniverseOrigin eTrackingOrigin, struct HmdMatrix34_t * pmatTrackingOriginToOverlayTransform); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTransformAbsolute)(VROverlayHandle_t ulOverlayHandle, ETrackingUniverseOrigin * peTrackingOrigin, struct HmdMatrix34_t * pmatTrackingOriginToOverlayTransform); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayTransformTrackedDeviceRelative)(VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t unTrackedDevice, struct HmdMatrix34_t * pmatTrackedDeviceToOverlayTransform); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTransformTrackedDeviceRelative)(VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t * punTrackedDevice, struct HmdMatrix34_t * pmatTrackedDeviceToOverlayTransform); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayTransformTrackedDeviceComponent)(VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t unDeviceIndex, char * pchComponentName); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTransformTrackedDeviceComponent)(VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t * punDeviceIndex, char * pchComponentName, uint32_t unComponentNameSize); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTransformOverlayRelative)(VROverlayHandle_t ulOverlayHandle, VROverlayHandle_t * ulOverlayHandleParent, struct HmdMatrix34_t * pmatParentOverlayToOverlayTransform); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayTransformOverlayRelative)(VROverlayHandle_t ulOverlayHandle, VROverlayHandle_t ulOverlayHandleParent, struct HmdMatrix34_t * pmatParentOverlayToOverlayTransform); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *ShowOverlay)(VROverlayHandle_t ulOverlayHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *HideOverlay)(VROverlayHandle_t ulOverlayHandle); + bool (OPENVR_FNTABLE_CALLTYPE *IsOverlayVisible)(VROverlayHandle_t ulOverlayHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetTransformForOverlayCoordinates)(VROverlayHandle_t ulOverlayHandle, ETrackingUniverseOrigin eTrackingOrigin, struct HmdVector2_t coordinatesInOverlay, struct HmdMatrix34_t * pmatTransform); + bool (OPENVR_FNTABLE_CALLTYPE *PollNextOverlayEvent)(VROverlayHandle_t ulOverlayHandle, struct VREvent_t * pEvent, uint32_t uncbVREvent); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayInputMethod)(VROverlayHandle_t ulOverlayHandle, VROverlayInputMethod * peInputMethod); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayInputMethod)(VROverlayHandle_t ulOverlayHandle, VROverlayInputMethod eInputMethod); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayMouseScale)(VROverlayHandle_t ulOverlayHandle, struct HmdVector2_t * pvecMouseScale); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayMouseScale)(VROverlayHandle_t ulOverlayHandle, struct HmdVector2_t * pvecMouseScale); + bool (OPENVR_FNTABLE_CALLTYPE *ComputeOverlayIntersection)(VROverlayHandle_t ulOverlayHandle, struct VROverlayIntersectionParams_t * pParams, struct VROverlayIntersectionResults_t * pResults); + bool (OPENVR_FNTABLE_CALLTYPE *HandleControllerOverlayInteractionAsMouse)(VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t unControllerDeviceIndex); + bool (OPENVR_FNTABLE_CALLTYPE *IsHoverTargetOverlay)(VROverlayHandle_t ulOverlayHandle); + VROverlayHandle_t (OPENVR_FNTABLE_CALLTYPE *GetGamepadFocusOverlay)(); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetGamepadFocusOverlay)(VROverlayHandle_t ulNewFocusOverlay); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayNeighbor)(EOverlayDirection eDirection, VROverlayHandle_t ulFrom, VROverlayHandle_t ulTo); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *MoveGamepadFocusToNeighbor)(EOverlayDirection eDirection, VROverlayHandle_t ulFrom); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayTexture)(VROverlayHandle_t ulOverlayHandle, struct Texture_t * pTexture); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *ClearOverlayTexture)(VROverlayHandle_t ulOverlayHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayRaw)(VROverlayHandle_t ulOverlayHandle, void * pvBuffer, uint32_t unWidth, uint32_t unHeight, uint32_t unDepth); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayFromFile)(VROverlayHandle_t ulOverlayHandle, char * pchFilePath); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTexture)(VROverlayHandle_t ulOverlayHandle, void ** pNativeTextureHandle, void * pNativeTextureRef, uint32_t * pWidth, uint32_t * pHeight, uint32_t * pNativeFormat, ETextureType * pAPIType, EColorSpace * pColorSpace, struct VRTextureBounds_t * pTextureBounds); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *ReleaseNativeOverlayHandle)(VROverlayHandle_t ulOverlayHandle, void * pNativeTextureHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTextureSize)(VROverlayHandle_t ulOverlayHandle, uint32_t * pWidth, uint32_t * pHeight); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *CreateDashboardOverlay)(char * pchOverlayKey, char * pchOverlayFriendlyName, VROverlayHandle_t * pMainHandle, VROverlayHandle_t * pThumbnailHandle); + bool (OPENVR_FNTABLE_CALLTYPE *IsDashboardVisible)(); + bool (OPENVR_FNTABLE_CALLTYPE *IsActiveDashboardOverlay)(VROverlayHandle_t ulOverlayHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetDashboardOverlaySceneProcess)(VROverlayHandle_t ulOverlayHandle, uint32_t unProcessId); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetDashboardOverlaySceneProcess)(VROverlayHandle_t ulOverlayHandle, uint32_t * punProcessId); + void (OPENVR_FNTABLE_CALLTYPE *ShowDashboard)(char * pchOverlayToShow); + TrackedDeviceIndex_t (OPENVR_FNTABLE_CALLTYPE *GetPrimaryDashboardDevice)(); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *ShowKeyboard)(EGamepadTextInputMode eInputMode, EGamepadTextInputLineMode eLineInputMode, char * pchDescription, uint32_t unCharMax, char * pchExistingText, bool bUseMinimalMode, uint64_t uUserValue); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *ShowKeyboardForOverlay)(VROverlayHandle_t ulOverlayHandle, EGamepadTextInputMode eInputMode, EGamepadTextInputLineMode eLineInputMode, char * pchDescription, uint32_t unCharMax, char * pchExistingText, bool bUseMinimalMode, uint64_t uUserValue); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetKeyboardText)(char * pchText, uint32_t cchText); + void (OPENVR_FNTABLE_CALLTYPE *HideKeyboard)(); + void (OPENVR_FNTABLE_CALLTYPE *SetKeyboardTransformAbsolute)(ETrackingUniverseOrigin eTrackingOrigin, struct HmdMatrix34_t * pmatTrackingOriginToKeyboardTransform); + void (OPENVR_FNTABLE_CALLTYPE *SetKeyboardPositionForOverlay)(VROverlayHandle_t ulOverlayHandle, struct HmdRect2_t avoidRect); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayIntersectionMask)(VROverlayHandle_t ulOverlayHandle, struct VROverlayIntersectionMaskPrimitive_t * pMaskPrimitives, uint32_t unNumMaskPrimitives, uint32_t unPrimitiveSize); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayFlags)(VROverlayHandle_t ulOverlayHandle, uint32_t * pFlags); + VRMessageOverlayResponse (OPENVR_FNTABLE_CALLTYPE *ShowMessageOverlay)(char * pchText, char * pchCaption, char * pchButton0Text, char * pchButton1Text, char * pchButton2Text, char * pchButton3Text); +}; + +struct VR_IVRRenderModels_FnTable +{ + EVRRenderModelError (OPENVR_FNTABLE_CALLTYPE *LoadRenderModel_Async)(char * pchRenderModelName, struct RenderModel_t ** ppRenderModel); + void (OPENVR_FNTABLE_CALLTYPE *FreeRenderModel)(struct RenderModel_t * pRenderModel); + EVRRenderModelError (OPENVR_FNTABLE_CALLTYPE *LoadTexture_Async)(TextureID_t textureId, struct RenderModel_TextureMap_t ** ppTexture); + void (OPENVR_FNTABLE_CALLTYPE *FreeTexture)(struct RenderModel_TextureMap_t * pTexture); + EVRRenderModelError (OPENVR_FNTABLE_CALLTYPE *LoadTextureD3D11_Async)(TextureID_t textureId, void * pD3D11Device, void ** ppD3D11Texture2D); + EVRRenderModelError (OPENVR_FNTABLE_CALLTYPE *LoadIntoTextureD3D11_Async)(TextureID_t textureId, void * pDstTexture); + void (OPENVR_FNTABLE_CALLTYPE *FreeTextureD3D11)(void * pD3D11Texture2D); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetRenderModelName)(uint32_t unRenderModelIndex, char * pchRenderModelName, uint32_t unRenderModelNameLen); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetRenderModelCount)(); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetComponentCount)(char * pchRenderModelName); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetComponentName)(char * pchRenderModelName, uint32_t unComponentIndex, char * pchComponentName, uint32_t unComponentNameLen); + uint64_t (OPENVR_FNTABLE_CALLTYPE *GetComponentButtonMask)(char * pchRenderModelName, char * pchComponentName); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetComponentRenderModelName)(char * pchRenderModelName, char * pchComponentName, char * pchComponentRenderModelName, uint32_t unComponentRenderModelNameLen); + bool (OPENVR_FNTABLE_CALLTYPE *GetComponentState)(char * pchRenderModelName, char * pchComponentName, VRControllerState_t * pControllerState, struct RenderModel_ControllerMode_State_t * pState, struct RenderModel_ComponentState_t * pComponentState); + bool (OPENVR_FNTABLE_CALLTYPE *RenderModelHasComponent)(char * pchRenderModelName, char * pchComponentName); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetRenderModelThumbnailURL)(char * pchRenderModelName, char * pchThumbnailURL, uint32_t unThumbnailURLLen, EVRRenderModelError * peError); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetRenderModelOriginalPath)(char * pchRenderModelName, char * pchOriginalPath, uint32_t unOriginalPathLen, EVRRenderModelError * peError); + char * (OPENVR_FNTABLE_CALLTYPE *GetRenderModelErrorNameFromEnum)(EVRRenderModelError error); +}; + +struct VR_IVRNotifications_FnTable +{ + EVRNotificationError (OPENVR_FNTABLE_CALLTYPE *CreateNotification)(VROverlayHandle_t ulOverlayHandle, uint64_t ulUserValue, EVRNotificationType type, char * pchText, EVRNotificationStyle style, struct NotificationBitmap_t * pImage, VRNotificationId * pNotificationId); + EVRNotificationError (OPENVR_FNTABLE_CALLTYPE *RemoveNotification)(VRNotificationId notificationId); +}; + +struct VR_IVRSettings_FnTable +{ + char * (OPENVR_FNTABLE_CALLTYPE *GetSettingsErrorNameFromEnum)(EVRSettingsError eError); + bool (OPENVR_FNTABLE_CALLTYPE *Sync)(bool bForce, EVRSettingsError * peError); + void (OPENVR_FNTABLE_CALLTYPE *SetBool)(char * pchSection, char * pchSettingsKey, bool bValue, EVRSettingsError * peError); + void (OPENVR_FNTABLE_CALLTYPE *SetInt32)(char * pchSection, char * pchSettingsKey, int32_t nValue, EVRSettingsError * peError); + void (OPENVR_FNTABLE_CALLTYPE *SetFloat)(char * pchSection, char * pchSettingsKey, float flValue, EVRSettingsError * peError); + void (OPENVR_FNTABLE_CALLTYPE *SetString)(char * pchSection, char * pchSettingsKey, char * pchValue, EVRSettingsError * peError); + bool (OPENVR_FNTABLE_CALLTYPE *GetBool)(char * pchSection, char * pchSettingsKey, EVRSettingsError * peError); + int32_t (OPENVR_FNTABLE_CALLTYPE *GetInt32)(char * pchSection, char * pchSettingsKey, EVRSettingsError * peError); + float (OPENVR_FNTABLE_CALLTYPE *GetFloat)(char * pchSection, char * pchSettingsKey, EVRSettingsError * peError); + void (OPENVR_FNTABLE_CALLTYPE *GetString)(char * pchSection, char * pchSettingsKey, char * pchValue, uint32_t unValueLen, EVRSettingsError * peError); + void (OPENVR_FNTABLE_CALLTYPE *RemoveSection)(char * pchSection, EVRSettingsError * peError); + void (OPENVR_FNTABLE_CALLTYPE *RemoveKeyInSection)(char * pchSection, char * pchSettingsKey, EVRSettingsError * peError); +}; + +struct VR_IVRScreenshots_FnTable +{ + EVRScreenshotError (OPENVR_FNTABLE_CALLTYPE *RequestScreenshot)(ScreenshotHandle_t * pOutScreenshotHandle, EVRScreenshotType type, char * pchPreviewFilename, char * pchVRFilename); + EVRScreenshotError (OPENVR_FNTABLE_CALLTYPE *HookScreenshot)(EVRScreenshotType * pSupportedTypes, int numTypes); + EVRScreenshotType (OPENVR_FNTABLE_CALLTYPE *GetScreenshotPropertyType)(ScreenshotHandle_t screenshotHandle, EVRScreenshotError * pError); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetScreenshotPropertyFilename)(ScreenshotHandle_t screenshotHandle, EVRScreenshotPropertyFilenames filenameType, char * pchFilename, uint32_t cchFilename, EVRScreenshotError * pError); + EVRScreenshotError (OPENVR_FNTABLE_CALLTYPE *UpdateScreenshotProgress)(ScreenshotHandle_t screenshotHandle, float flProgress); + EVRScreenshotError (OPENVR_FNTABLE_CALLTYPE *TakeStereoScreenshot)(ScreenshotHandle_t * pOutScreenshotHandle, char * pchPreviewFilename, char * pchVRFilename); + EVRScreenshotError (OPENVR_FNTABLE_CALLTYPE *SubmitScreenshot)(ScreenshotHandle_t screenshotHandle, EVRScreenshotType type, char * pchSourcePreviewFilename, char * pchSourceVRFilename); +}; + +struct VR_IVRResources_FnTable +{ + uint32_t (OPENVR_FNTABLE_CALLTYPE *LoadSharedResource)(char * pchResourceName, char * pchBuffer, uint32_t unBufferLen); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetResourceFullPath)(char * pchResourceName, char * pchResourceTypeDirectory, char * pchPathBuffer, uint32_t unBufferLen); +}; + +struct VR_IVRDriverManager_FnTable +{ + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetDriverCount)(); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetDriverName)(DriverId_t nDriver, char * pchValue, uint32_t unBufferSize); +}; + + +#if 0 +// Global entry points +S_API intptr_t VR_InitInternal( EVRInitError *peError, EVRApplicationType eType ); +S_API void VR_ShutdownInternal(); +S_API bool VR_IsHmdPresent(); +S_API intptr_t VR_GetGenericInterface( const char *pchInterfaceVersion, EVRInitError *peError ); +S_API bool VR_IsRuntimeInstalled(); +S_API const char * VR_GetVRInitErrorAsSymbol( EVRInitError error ); +S_API const char * VR_GetVRInitErrorAsEnglishDescription( EVRInitError error ); +#endif + +#endif // __OPENVR_API_FLAT_H__ + + diff --git a/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_driver.h b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_driver.h new file mode 100644 index 000000000..bfe24c003 --- /dev/null +++ b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_driver.h @@ -0,0 +1,2677 @@ +#pragma once + +// openvr_driver.h +//========= Copyright Valve Corporation ============// +// Dynamically generated file. Do not modify this file directly. + +#ifndef _OPENVR_DRIVER_API +#define _OPENVR_DRIVER_API + +#include + + + +// vrtypes.h +#ifndef _INCLUDE_VRTYPES_H +#define _INCLUDE_VRTYPES_H + +// Forward declarations to avoid requiring vulkan.h +struct VkDevice_T; +struct VkPhysicalDevice_T; +struct VkInstance_T; +struct VkQueue_T; + +// Forward declarations to avoid requiring d3d12.h +struct ID3D12Resource; +struct ID3D12CommandQueue; + +namespace vr +{ +#pragma pack( push, 8 ) + +typedef void* glSharedTextureHandle_t; +typedef int32_t glInt_t; +typedef uint32_t glUInt_t; + +// right-handed system +// +y is up +// +x is to the right +// -z is going away from you +// Distance unit is meters +struct HmdMatrix34_t +{ + float m[3][4]; +}; + +struct HmdMatrix44_t +{ + float m[4][4]; +}; + +struct HmdVector3_t +{ + float v[3]; +}; + +struct HmdVector4_t +{ + float v[4]; +}; + +struct HmdVector3d_t +{ + double v[3]; +}; + +struct HmdVector2_t +{ + float v[2]; +}; + +struct HmdQuaternion_t +{ + double w, x, y, z; +}; + +struct HmdColor_t +{ + float r, g, b, a; +}; + +struct HmdQuad_t +{ + HmdVector3_t vCorners[ 4 ]; +}; + +struct HmdRect2_t +{ + HmdVector2_t vTopLeft; + HmdVector2_t vBottomRight; +}; + +/** Used to return the post-distortion UVs for each color channel. +* UVs range from 0 to 1 with 0,0 in the upper left corner of the +* source render target. The 0,0 to 1,1 range covers a single eye. */ +struct DistortionCoordinates_t +{ + float rfRed[2]; + float rfGreen[2]; + float rfBlue[2]; +}; + +enum EVREye +{ + Eye_Left = 0, + Eye_Right = 1 +}; + +enum ETextureType +{ + TextureType_DirectX = 0, // Handle is an ID3D11Texture + TextureType_OpenGL = 1, // Handle is an OpenGL texture name or an OpenGL render buffer name, depending on submit flags + TextureType_Vulkan = 2, // Handle is a pointer to a VRVulkanTextureData_t structure + TextureType_IOSurface = 3, // Handle is a macOS cross-process-sharable IOSurfaceRef + TextureType_DirectX12 = 4, // Handle is a pointer to a D3D12TextureData_t structure +}; + +enum EColorSpace +{ + ColorSpace_Auto = 0, // Assumes 'gamma' for 8-bit per component formats, otherwise 'linear'. This mirrors the DXGI formats which have _SRGB variants. + ColorSpace_Gamma = 1, // Texture data can be displayed directly on the display without any conversion (a.k.a. display native format). + ColorSpace_Linear = 2, // Same as gamma but has been converted to a linear representation using DXGI's sRGB conversion algorithm. +}; + +struct Texture_t +{ + void* handle; // See ETextureType definition above + ETextureType eType; + EColorSpace eColorSpace; +}; + +// Handle to a shared texture (HANDLE on Windows obtained using OpenSharedResource). +typedef uint64_t SharedTextureHandle_t; +#define INVALID_SHARED_TEXTURE_HANDLE ((vr::SharedTextureHandle_t)0) + +enum ETrackingResult +{ + TrackingResult_Uninitialized = 1, + + TrackingResult_Calibrating_InProgress = 100, + TrackingResult_Calibrating_OutOfRange = 101, + + TrackingResult_Running_OK = 200, + TrackingResult_Running_OutOfRange = 201, +}; + +typedef uint32_t DriverId_t; +static const uint32_t k_nDriverNone = 0xFFFFFFFF; + +static const uint32_t k_unMaxDriverDebugResponseSize = 32768; + +/** Used to pass device IDs to API calls */ +typedef uint32_t TrackedDeviceIndex_t; +static const uint32_t k_unTrackedDeviceIndex_Hmd = 0; +static const uint32_t k_unMaxTrackedDeviceCount = 16; +static const uint32_t k_unTrackedDeviceIndexOther = 0xFFFFFFFE; +static const uint32_t k_unTrackedDeviceIndexInvalid = 0xFFFFFFFF; + +/** Describes what kind of object is being tracked at a given ID */ +enum ETrackedDeviceClass +{ + TrackedDeviceClass_Invalid = 0, // the ID was not valid. + TrackedDeviceClass_HMD = 1, // Head-Mounted Displays + TrackedDeviceClass_Controller = 2, // Tracked controllers + TrackedDeviceClass_GenericTracker = 3, // Generic trackers, similar to controllers + TrackedDeviceClass_TrackingReference = 4, // Camera and base stations that serve as tracking reference points + TrackedDeviceClass_DisplayRedirect = 5, // Accessories that aren't necessarily tracked themselves, but may redirect video output from other tracked devices +}; + + +/** Describes what specific role associated with a tracked device */ +enum ETrackedControllerRole +{ + TrackedControllerRole_Invalid = 0, // Invalid value for controller type + TrackedControllerRole_LeftHand = 1, // Tracked device associated with the left hand + TrackedControllerRole_RightHand = 2, // Tracked device associated with the right hand +}; + + +/** describes a single pose for a tracked object */ +struct TrackedDevicePose_t +{ + HmdMatrix34_t mDeviceToAbsoluteTracking; + HmdVector3_t vVelocity; // velocity in tracker space in m/s + HmdVector3_t vAngularVelocity; // angular velocity in radians/s (?) + ETrackingResult eTrackingResult; + bool bPoseIsValid; + + // This indicates that there is a device connected for this spot in the pose array. + // It could go from true to false if the user unplugs the device. + bool bDeviceIsConnected; +}; + +/** Identifies which style of tracking origin the application wants to use +* for the poses it is requesting */ +enum ETrackingUniverseOrigin +{ + TrackingUniverseSeated = 0, // Poses are provided relative to the seated zero pose + TrackingUniverseStanding = 1, // Poses are provided relative to the safe bounds configured by the user + 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. +}; + +// Refers to a single container of properties +typedef uint64_t PropertyContainerHandle_t; +typedef uint32_t PropertyTypeTag_t; + +static const PropertyContainerHandle_t k_ulInvalidPropertyContainer = 0; +static const PropertyTypeTag_t k_unInvalidPropertyTag = 0; + +// Use these tags to set/get common types as struct properties +static const PropertyTypeTag_t k_unFloatPropertyTag = 1; +static const PropertyTypeTag_t k_unInt32PropertyTag = 2; +static const PropertyTypeTag_t k_unUint64PropertyTag = 3; +static const PropertyTypeTag_t k_unBoolPropertyTag = 4; +static const PropertyTypeTag_t k_unStringPropertyTag = 5; + +static const PropertyTypeTag_t k_unHmdMatrix34PropertyTag = 20; +static const PropertyTypeTag_t k_unHmdMatrix44PropertyTag = 21; +static const PropertyTypeTag_t k_unHmdVector3PropertyTag = 22; +static const PropertyTypeTag_t k_unHmdVector4PropertyTag = 23; + +static const PropertyTypeTag_t k_unHiddenAreaPropertyTag = 30; + +static const PropertyTypeTag_t k_unOpenVRInternalReserved_Start = 1000; +static const PropertyTypeTag_t k_unOpenVRInternalReserved_End = 10000; + + +/** Each entry in this enum represents a property that can be retrieved about a +* tracked device. Many fields are only valid for one ETrackedDeviceClass. */ +enum ETrackedDeviceProperty +{ + Prop_Invalid = 0, + + // general properties that apply to all device classes + Prop_TrackingSystemName_String = 1000, + Prop_ModelNumber_String = 1001, + Prop_SerialNumber_String = 1002, + Prop_RenderModelName_String = 1003, + Prop_WillDriftInYaw_Bool = 1004, + Prop_ManufacturerName_String = 1005, + Prop_TrackingFirmwareVersion_String = 1006, + Prop_HardwareRevision_String = 1007, + Prop_AllWirelessDongleDescriptions_String = 1008, + Prop_ConnectedWirelessDongle_String = 1009, + Prop_DeviceIsWireless_Bool = 1010, + Prop_DeviceIsCharging_Bool = 1011, + Prop_DeviceBatteryPercentage_Float = 1012, // 0 is empty, 1 is full + Prop_StatusDisplayTransform_Matrix34 = 1013, + Prop_Firmware_UpdateAvailable_Bool = 1014, + Prop_Firmware_ManualUpdate_Bool = 1015, + Prop_Firmware_ManualUpdateURL_String = 1016, + Prop_HardwareRevision_Uint64 = 1017, + Prop_FirmwareVersion_Uint64 = 1018, + Prop_FPGAVersion_Uint64 = 1019, + Prop_VRCVersion_Uint64 = 1020, + Prop_RadioVersion_Uint64 = 1021, + Prop_DongleVersion_Uint64 = 1022, + Prop_BlockServerShutdown_Bool = 1023, + Prop_CanUnifyCoordinateSystemWithHmd_Bool = 1024, + Prop_ContainsProximitySensor_Bool = 1025, + Prop_DeviceProvidesBatteryStatus_Bool = 1026, + Prop_DeviceCanPowerOff_Bool = 1027, + Prop_Firmware_ProgrammingTarget_String = 1028, + Prop_DeviceClass_Int32 = 1029, + Prop_HasCamera_Bool = 1030, + Prop_DriverVersion_String = 1031, + Prop_Firmware_ForceUpdateRequired_Bool = 1032, + Prop_ViveSystemButtonFixRequired_Bool = 1033, + Prop_ParentDriver_Uint64 = 1034, + Prop_ResourceRoot_String = 1035, + + // Properties that are unique to TrackedDeviceClass_HMD + Prop_ReportsTimeSinceVSync_Bool = 2000, + Prop_SecondsFromVsyncToPhotons_Float = 2001, + Prop_DisplayFrequency_Float = 2002, + Prop_UserIpdMeters_Float = 2003, + Prop_CurrentUniverseId_Uint64 = 2004, + Prop_PreviousUniverseId_Uint64 = 2005, + Prop_DisplayFirmwareVersion_Uint64 = 2006, + Prop_IsOnDesktop_Bool = 2007, + Prop_DisplayMCType_Int32 = 2008, + Prop_DisplayMCOffset_Float = 2009, + Prop_DisplayMCScale_Float = 2010, + Prop_EdidVendorID_Int32 = 2011, + Prop_DisplayMCImageLeft_String = 2012, + Prop_DisplayMCImageRight_String = 2013, + Prop_DisplayGCBlackClamp_Float = 2014, + Prop_EdidProductID_Int32 = 2015, + Prop_CameraToHeadTransform_Matrix34 = 2016, + Prop_DisplayGCType_Int32 = 2017, + Prop_DisplayGCOffset_Float = 2018, + Prop_DisplayGCScale_Float = 2019, + Prop_DisplayGCPrescale_Float = 2020, + Prop_DisplayGCImage_String = 2021, + Prop_LensCenterLeftU_Float = 2022, + Prop_LensCenterLeftV_Float = 2023, + Prop_LensCenterRightU_Float = 2024, + Prop_LensCenterRightV_Float = 2025, + Prop_UserHeadToEyeDepthMeters_Float = 2026, + Prop_CameraFirmwareVersion_Uint64 = 2027, + Prop_CameraFirmwareDescription_String = 2028, + Prop_DisplayFPGAVersion_Uint64 = 2029, + Prop_DisplayBootloaderVersion_Uint64 = 2030, + Prop_DisplayHardwareVersion_Uint64 = 2031, + Prop_AudioFirmwareVersion_Uint64 = 2032, + Prop_CameraCompatibilityMode_Int32 = 2033, + Prop_ScreenshotHorizontalFieldOfViewDegrees_Float = 2034, + Prop_ScreenshotVerticalFieldOfViewDegrees_Float = 2035, + Prop_DisplaySuppressed_Bool = 2036, + Prop_DisplayAllowNightMode_Bool = 2037, + Prop_DisplayMCImageWidth_Int32 = 2038, + Prop_DisplayMCImageHeight_Int32 = 2039, + Prop_DisplayMCImageNumChannels_Int32 = 2040, + Prop_DisplayMCImageData_Binary = 2041, + Prop_SecondsFromPhotonsToVblank_Float = 2042, + Prop_DriverDirectModeSendsVsyncEvents_Bool = 2043, + Prop_DisplayDebugMode_Bool = 2044, + Prop_GraphicsAdapterLuid_Uint64 = 2045, + + // Properties that are unique to TrackedDeviceClass_Controller + Prop_AttachedDeviceId_String = 3000, + Prop_SupportedButtons_Uint64 = 3001, + Prop_Axis0Type_Int32 = 3002, // Return value is of type EVRControllerAxisType + Prop_Axis1Type_Int32 = 3003, // Return value is of type EVRControllerAxisType + Prop_Axis2Type_Int32 = 3004, // Return value is of type EVRControllerAxisType + Prop_Axis3Type_Int32 = 3005, // Return value is of type EVRControllerAxisType + Prop_Axis4Type_Int32 = 3006, // Return value is of type EVRControllerAxisType + Prop_ControllerRoleHint_Int32 = 3007, // Return value is of type ETrackedControllerRole + + // Properties that are unique to TrackedDeviceClass_TrackingReference + Prop_FieldOfViewLeftDegrees_Float = 4000, + Prop_FieldOfViewRightDegrees_Float = 4001, + Prop_FieldOfViewTopDegrees_Float = 4002, + Prop_FieldOfViewBottomDegrees_Float = 4003, + Prop_TrackingRangeMinimumMeters_Float = 4004, + Prop_TrackingRangeMaximumMeters_Float = 4005, + Prop_ModeLabel_String = 4006, + + // Properties that are used for user interface like icons names + Prop_IconPathName_String = 5000, // DEPRECATED. Value not referenced. Now expected to be part of icon path properties. + Prop_NamedIconPathDeviceOff_String = 5001, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceSearching_String = 5002, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceSearchingAlert_String = 5003, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceReady_String = 5004, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceReadyAlert_String = 5005, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceNotReady_String = 5006, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceStandby_String = 5007, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceAlertLow_String = 5008, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + + // Properties that are used by helpers, but are opaque to applications + Prop_DisplayHiddenArea_Binary_Start = 5100, + Prop_DisplayHiddenArea_Binary_End = 5150, + + // Properties that are unique to drivers + Prop_UserConfigPath_String = 6000, + Prop_InstallPath_String = 6001, + Prop_HasDisplayComponent_Bool = 6002, + Prop_HasControllerComponent_Bool = 6003, + Prop_HasCameraComponent_Bool = 6004, + Prop_HasDriverDirectModeComponent_Bool = 6005, + Prop_HasVirtualDisplayComponent_Bool = 6006, + + // Vendors are free to expose private debug data in this reserved region + Prop_VendorSpecific_Reserved_Start = 10000, + Prop_VendorSpecific_Reserved_End = 10999, +}; + +/** No string property will ever be longer than this length */ +static const uint32_t k_unMaxPropertyStringSize = 32 * 1024; + +/** Used to return errors that occur when reading properties. */ +enum ETrackedPropertyError +{ + TrackedProp_Success = 0, + TrackedProp_WrongDataType = 1, + TrackedProp_WrongDeviceClass = 2, + TrackedProp_BufferTooSmall = 3, + TrackedProp_UnknownProperty = 4, // Driver has not set the property (and may not ever). + TrackedProp_InvalidDevice = 5, + TrackedProp_CouldNotContactServer = 6, + TrackedProp_ValueNotProvidedByDevice = 7, + TrackedProp_StringExceedsMaximumLength = 8, + TrackedProp_NotYetAvailable = 9, // The property value isn't known yet, but is expected soon. Call again later. + TrackedProp_PermissionDenied = 10, + TrackedProp_InvalidOperation = 11, +}; + +/** Allows the application to control what part of the provided texture will be used in the +* frame buffer. */ +struct VRTextureBounds_t +{ + float uMin, vMin; + float uMax, vMax; +}; + + +/** Allows the application to control how scene textures are used by the compositor when calling Submit. */ +enum EVRSubmitFlags +{ + // Simple render path. App submits rendered left and right eye images with no lens distortion correction applied. + Submit_Default = 0x00, + + // App submits final left and right eye images with lens distortion already applied (lens distortion makes the images appear + // barrel distorted with chromatic aberration correction applied). The app would have used the data returned by + // vr::IVRSystem::ComputeDistortion() to apply the correct distortion to the rendered images before calling Submit(). + Submit_LensDistortionAlreadyApplied = 0x01, + + // If the texture pointer passed in is actually a renderbuffer (e.g. for MSAA in OpenGL) then set this flag. + Submit_GlRenderBuffer = 0x02, + + // Do not use + Submit_Reserved = 0x04, +}; + +/** Data required for passing Vulkan textures to IVRCompositor::Submit. +* Be sure to call OpenVR_Shutdown before destroying these resources. */ +struct VRVulkanTextureData_t +{ + uint64_t m_nImage; // VkImage + VkDevice_T *m_pDevice; + VkPhysicalDevice_T *m_pPhysicalDevice; + VkInstance_T *m_pInstance; + VkQueue_T *m_pQueue; + uint32_t m_nQueueFamilyIndex; + uint32_t m_nWidth, m_nHeight, m_nFormat, m_nSampleCount; +}; + +/** Data required for passing D3D12 textures to IVRCompositor::Submit. +* Be sure to call OpenVR_Shutdown before destroying these resources. */ +struct D3D12TextureData_t +{ + ID3D12Resource *m_pResource; + ID3D12CommandQueue *m_pCommandQueue; + uint32_t m_nNodeMask; +}; + +/** Status of the overall system or tracked objects */ +enum EVRState +{ + VRState_Undefined = -1, + VRState_Off = 0, + VRState_Searching = 1, + VRState_Searching_Alert = 2, + VRState_Ready = 3, + VRState_Ready_Alert = 4, + VRState_NotReady = 5, + VRState_Standby = 6, + VRState_Ready_Alert_Low = 7, +}; + +/** The types of events that could be posted (and what the parameters mean for each event type) */ +enum EVREventType +{ + VREvent_None = 0, + + VREvent_TrackedDeviceActivated = 100, + VREvent_TrackedDeviceDeactivated = 101, + VREvent_TrackedDeviceUpdated = 102, + VREvent_TrackedDeviceUserInteractionStarted = 103, + VREvent_TrackedDeviceUserInteractionEnded = 104, + VREvent_IpdChanged = 105, + VREvent_EnterStandbyMode = 106, + VREvent_LeaveStandbyMode = 107, + VREvent_TrackedDeviceRoleChanged = 108, + VREvent_WatchdogWakeUpRequested = 109, + VREvent_LensDistortionChanged = 110, + VREvent_PropertyChanged = 111, + + VREvent_ButtonPress = 200, // data is controller + VREvent_ButtonUnpress = 201, // data is controller + VREvent_ButtonTouch = 202, // data is controller + VREvent_ButtonUntouch = 203, // data is controller + + VREvent_MouseMove = 300, // data is mouse + VREvent_MouseButtonDown = 301, // data is mouse + VREvent_MouseButtonUp = 302, // data is mouse + VREvent_FocusEnter = 303, // data is overlay + VREvent_FocusLeave = 304, // data is overlay + VREvent_Scroll = 305, // data is mouse + VREvent_TouchPadMove = 306, // data is mouse + VREvent_OverlayFocusChanged = 307, // data is overlay, global event + + VREvent_InputFocusCaptured = 400, // data is process DEPRECATED + VREvent_InputFocusReleased = 401, // data is process DEPRECATED + VREvent_SceneFocusLost = 402, // data is process + VREvent_SceneFocusGained = 403, // data is process + VREvent_SceneApplicationChanged = 404, // data is process - The App actually drawing the scene changed (usually to or from the compositor) + VREvent_SceneFocusChanged = 405, // data is process - New app got access to draw the scene + VREvent_InputFocusChanged = 406, // data is process + VREvent_SceneApplicationSecondaryRenderingStarted = 407, // data is process + + VREvent_HideRenderModels = 410, // Sent to the scene application to request hiding render models temporarily + VREvent_ShowRenderModels = 411, // Sent to the scene application to request restoring render model visibility + + VREvent_OverlayShown = 500, + VREvent_OverlayHidden = 501, + VREvent_DashboardActivated = 502, + VREvent_DashboardDeactivated = 503, + VREvent_DashboardThumbSelected = 504, // Sent to the overlay manager - data is overlay + VREvent_DashboardRequested = 505, // Sent to the overlay manager - data is overlay + VREvent_ResetDashboard = 506, // Send to the overlay manager + VREvent_RenderToast = 507, // Send to the dashboard to render a toast - data is the notification ID + VREvent_ImageLoaded = 508, // Sent to overlays when a SetOverlayRaw or SetOverlayFromFile call finishes loading + VREvent_ShowKeyboard = 509, // Sent to keyboard renderer in the dashboard to invoke it + VREvent_HideKeyboard = 510, // Sent to keyboard renderer in the dashboard to hide it + VREvent_OverlayGamepadFocusGained = 511, // Sent to an overlay when IVROverlay::SetFocusOverlay is called on it + VREvent_OverlayGamepadFocusLost = 512, // Send to an overlay when it previously had focus and IVROverlay::SetFocusOverlay is called on something else + VREvent_OverlaySharedTextureChanged = 513, + VREvent_DashboardGuideButtonDown = 514, + VREvent_DashboardGuideButtonUp = 515, + VREvent_ScreenshotTriggered = 516, // Screenshot button combo was pressed, Dashboard should request a screenshot + VREvent_ImageFailed = 517, // Sent to overlays when a SetOverlayRaw or SetOverlayfromFail fails to load + VREvent_DashboardOverlayCreated = 518, + + // Screenshot API + VREvent_RequestScreenshot = 520, // Sent by vrclient application to compositor to take a screenshot + VREvent_ScreenshotTaken = 521, // Sent by compositor to the application that the screenshot has been taken + VREvent_ScreenshotFailed = 522, // Sent by compositor to the application that the screenshot failed to be taken + VREvent_SubmitScreenshotToDashboard = 523, // Sent by compositor to the dashboard that a completed screenshot was submitted + VREvent_ScreenshotProgressToDashboard = 524, // Sent by compositor to the dashboard that a completed screenshot was submitted + + VREvent_PrimaryDashboardDeviceChanged = 525, + + VREvent_Notification_Shown = 600, + VREvent_Notification_Hidden = 601, + VREvent_Notification_BeginInteraction = 602, + VREvent_Notification_Destroyed = 603, + + VREvent_Quit = 700, // data is process + VREvent_ProcessQuit = 701, // data is process + VREvent_QuitAborted_UserPrompt = 702, // data is process + VREvent_QuitAcknowledged = 703, // data is process + VREvent_DriverRequestedQuit = 704, // The driver has requested that SteamVR shut down + + VREvent_ChaperoneDataHasChanged = 800, + VREvent_ChaperoneUniverseHasChanged = 801, + VREvent_ChaperoneTempDataHasChanged = 802, + VREvent_ChaperoneSettingsHaveChanged = 803, + VREvent_SeatedZeroPoseReset = 804, + + VREvent_AudioSettingsHaveChanged = 820, + + VREvent_BackgroundSettingHasChanged = 850, + VREvent_CameraSettingsHaveChanged = 851, + VREvent_ReprojectionSettingHasChanged = 852, + VREvent_ModelSkinSettingsHaveChanged = 853, + VREvent_EnvironmentSettingsHaveChanged = 854, + VREvent_PowerSettingsHaveChanged = 855, + VREvent_EnableHomeAppSettingsHaveChanged = 856, + + VREvent_StatusUpdate = 900, + + VREvent_MCImageUpdated = 1000, + + VREvent_FirmwareUpdateStarted = 1100, + VREvent_FirmwareUpdateFinished = 1101, + + VREvent_KeyboardClosed = 1200, + VREvent_KeyboardCharInput = 1201, + VREvent_KeyboardDone = 1202, // Sent when DONE button clicked on keyboard + + VREvent_ApplicationTransitionStarted = 1300, + VREvent_ApplicationTransitionAborted = 1301, + VREvent_ApplicationTransitionNewAppStarted = 1302, + VREvent_ApplicationListUpdated = 1303, + VREvent_ApplicationMimeTypeLoad = 1304, + VREvent_ApplicationTransitionNewAppLaunchComplete = 1305, + VREvent_ProcessConnected = 1306, + VREvent_ProcessDisconnected = 1307, + + VREvent_Compositor_MirrorWindowShown = 1400, + VREvent_Compositor_MirrorWindowHidden = 1401, + VREvent_Compositor_ChaperoneBoundsShown = 1410, + VREvent_Compositor_ChaperoneBoundsHidden = 1411, + + VREvent_TrackedCamera_StartVideoStream = 1500, + VREvent_TrackedCamera_StopVideoStream = 1501, + VREvent_TrackedCamera_PauseVideoStream = 1502, + VREvent_TrackedCamera_ResumeVideoStream = 1503, + VREvent_TrackedCamera_EditingSurface = 1550, + + VREvent_PerformanceTest_EnableCapture = 1600, + VREvent_PerformanceTest_DisableCapture = 1601, + VREvent_PerformanceTest_FidelityLevel = 1602, + + VREvent_MessageOverlay_Closed = 1650, + + // Vendors are free to expose private events in this reserved region + VREvent_VendorSpecific_Reserved_Start = 10000, + VREvent_VendorSpecific_Reserved_End = 19999, +}; + + +/** Level of Hmd activity */ +// UserInteraction_Timeout means the device is in the process of timing out. +// InUse = ( k_EDeviceActivityLevel_UserInteraction || k_EDeviceActivityLevel_UserInteraction_Timeout ) +// VREvent_TrackedDeviceUserInteractionStarted fires when the devices transitions from Standby -> UserInteraction or Idle -> UserInteraction. +// VREvent_TrackedDeviceUserInteractionEnded fires when the devices transitions from UserInteraction_Timeout -> Idle +enum EDeviceActivityLevel +{ + k_EDeviceActivityLevel_Unknown = -1, + k_EDeviceActivityLevel_Idle = 0, // No activity for the last 10 seconds + k_EDeviceActivityLevel_UserInteraction = 1, // Activity (movement or prox sensor) is happening now + k_EDeviceActivityLevel_UserInteraction_Timeout = 2, // No activity for the last 0.5 seconds + k_EDeviceActivityLevel_Standby = 3, // Idle for at least 5 seconds (configurable in Settings -> Power Management) +}; + + +/** VR controller button and axis IDs */ +enum EVRButtonId +{ + k_EButton_System = 0, + k_EButton_ApplicationMenu = 1, + k_EButton_Grip = 2, + k_EButton_DPad_Left = 3, + k_EButton_DPad_Up = 4, + k_EButton_DPad_Right = 5, + k_EButton_DPad_Down = 6, + k_EButton_A = 7, + + k_EButton_ProximitySensor = 31, + + k_EButton_Axis0 = 32, + k_EButton_Axis1 = 33, + k_EButton_Axis2 = 34, + k_EButton_Axis3 = 35, + k_EButton_Axis4 = 36, + + // aliases for well known controllers + k_EButton_SteamVR_Touchpad = k_EButton_Axis0, + k_EButton_SteamVR_Trigger = k_EButton_Axis1, + + k_EButton_Dashboard_Back = k_EButton_Grip, + + k_EButton_Max = 64 +}; + +inline uint64_t ButtonMaskFromId( EVRButtonId id ) { return 1ull << id; } + +/** used for controller button events */ +struct VREvent_Controller_t +{ + uint32_t button; // EVRButtonId enum +}; + + +/** used for simulated mouse events in overlay space */ +enum EVRMouseButton +{ + VRMouseButton_Left = 0x0001, + VRMouseButton_Right = 0x0002, + VRMouseButton_Middle = 0x0004, +}; + + +/** used for simulated mouse events in overlay space */ +struct VREvent_Mouse_t +{ + float x, y; // co-ords are in GL space, bottom left of the texture is 0,0 + uint32_t button; // EVRMouseButton enum +}; + +/** used for simulated mouse wheel scroll in overlay space */ +struct VREvent_Scroll_t +{ + float xdelta, ydelta; // movement in fraction of the pad traversed since last delta, 1.0 for a full swipe + uint32_t repeatCount; +}; + +/** when in mouse input mode you can receive data from the touchpad, these events are only sent if the users finger + is on the touchpad (or just released from it) +**/ +struct VREvent_TouchPadMove_t +{ + // true if the users finger is detected on the touch pad + bool bFingerDown; + + // How long the finger has been down in seconds + float flSecondsFingerDown; + + // These values indicate the starting finger position (so you can do some basic swipe stuff) + float fValueXFirst; + float fValueYFirst; + + // This is the raw sampled coordinate without deadzoning + float fValueXRaw; + float fValueYRaw; +}; + +/** notification related events. Details will still change at this point */ +struct VREvent_Notification_t +{ + uint64_t ulUserValue; + uint32_t notificationId; +}; + +/** Used for events about processes */ +struct VREvent_Process_t +{ + uint32_t pid; + uint32_t oldPid; + bool bForced; +}; + + +/** Used for a few events about overlays */ +struct VREvent_Overlay_t +{ + uint64_t overlayHandle; +}; + + +/** Used for a few events about overlays */ +struct VREvent_Status_t +{ + uint32_t statusState; // EVRState enum +}; + +/** Used for keyboard events **/ +struct VREvent_Keyboard_t +{ + char cNewInput[8]; // Up to 11 bytes of new input + uint64_t uUserValue; // Possible flags about the new input +}; + +struct VREvent_Ipd_t +{ + float ipdMeters; +}; + +struct VREvent_Chaperone_t +{ + uint64_t m_nPreviousUniverse; + uint64_t m_nCurrentUniverse; +}; + +/** Not actually used for any events */ +struct VREvent_Reserved_t +{ + uint64_t reserved0; + uint64_t reserved1; +}; + +struct VREvent_PerformanceTest_t +{ + uint32_t m_nFidelityLevel; +}; + +struct VREvent_SeatedZeroPoseReset_t +{ + bool bResetBySystemMenu; +}; + +struct VREvent_Screenshot_t +{ + uint32_t handle; + uint32_t type; +}; + +struct VREvent_ScreenshotProgress_t +{ + float progress; +}; + +struct VREvent_ApplicationLaunch_t +{ + uint32_t pid; + uint32_t unArgsHandle; +}; + +struct VREvent_EditingCameraSurface_t +{ + uint64_t overlayHandle; + uint32_t nVisualMode; +}; + +struct VREvent_MessageOverlay_t +{ + uint32_t unVRMessageOverlayResponse; // vr::VRMessageOverlayResponse enum +}; + +struct VREvent_Property_t +{ + PropertyContainerHandle_t container; + ETrackedDeviceProperty prop; +}; + +/** NOTE!!! If you change this you MUST manually update openvr_interop.cs.py */ +typedef union +{ + VREvent_Reserved_t reserved; + VREvent_Controller_t controller; + VREvent_Mouse_t mouse; + VREvent_Scroll_t scroll; + VREvent_Process_t process; + VREvent_Notification_t notification; + VREvent_Overlay_t overlay; + VREvent_Status_t status; + VREvent_Keyboard_t keyboard; + VREvent_Ipd_t ipd; + VREvent_Chaperone_t chaperone; + VREvent_PerformanceTest_t performanceTest; + VREvent_TouchPadMove_t touchPadMove; + VREvent_SeatedZeroPoseReset_t seatedZeroPoseReset; + VREvent_Screenshot_t screenshot; + VREvent_ScreenshotProgress_t screenshotProgress; + VREvent_ApplicationLaunch_t applicationLaunch; + VREvent_EditingCameraSurface_t cameraSurface; + VREvent_MessageOverlay_t messageOverlay; + VREvent_Property_t property; +} VREvent_Data_t; + + +#if defined(__linux__) || defined(__APPLE__) +// This structure was originally defined mis-packed on Linux, preserved for +// compatibility. +#pragma pack( push, 4 ) +#endif + +/** An event posted by the server to all running applications */ +struct VREvent_t +{ + uint32_t eventType; // EVREventType enum + TrackedDeviceIndex_t trackedDeviceIndex; + float eventAgeSeconds; + // event data must be the end of the struct as its size is variable + VREvent_Data_t data; +}; + +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( pop ) +#endif + +/** The mesh to draw into the stencil (or depth) buffer to perform +* early stencil (or depth) kills of pixels that will never appear on the HMD. +* This mesh draws on all the pixels that will be hidden after distortion. +* +* If the HMD does not provide a visible area mesh pVertexData will be +* NULL and unTriangleCount will be 0. */ +struct HiddenAreaMesh_t +{ + const HmdVector2_t *pVertexData; + uint32_t unTriangleCount; +}; + + +enum EHiddenAreaMeshType +{ + k_eHiddenAreaMesh_Standard = 0, + k_eHiddenAreaMesh_Inverse = 1, + k_eHiddenAreaMesh_LineLoop = 2, + + k_eHiddenAreaMesh_Max = 3, +}; + + +/** Identifies what kind of axis is on the controller at index n. Read this type +* with pVRSystem->Get( nControllerDeviceIndex, Prop_Axis0Type_Int32 + n ); +*/ +enum EVRControllerAxisType +{ + k_eControllerAxis_None = 0, + k_eControllerAxis_TrackPad = 1, + k_eControllerAxis_Joystick = 2, + k_eControllerAxis_Trigger = 3, // Analog trigger data is in the X axis +}; + + +/** contains information about one axis on the controller */ +struct VRControllerAxis_t +{ + 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. + float y; // Ranges from -1.0 to 1.0 for joysticks and track pads. Is always 0.0 for triggers. +}; + + +/** the number of axes in the controller state */ +static const uint32_t k_unControllerStateAxisCount = 5; + + +#if defined(__linux__) || defined(__APPLE__) +// This structure was originally defined mis-packed on Linux, preserved for +// compatibility. +#pragma pack( push, 4 ) +#endif + +/** Holds all the state of a controller at one moment in time. */ +struct VRControllerState001_t +{ + // If packet num matches that on your prior call, then the controller state hasn't been changed since + // your last call and there is no need to process it + uint32_t unPacketNum; + + // bit flags for each of the buttons. Use ButtonMaskFromId to turn an ID into a mask + uint64_t ulButtonPressed; + uint64_t ulButtonTouched; + + // Axis data for the controller's analog inputs + VRControllerAxis_t rAxis[ k_unControllerStateAxisCount ]; +}; +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( pop ) +#endif + + +typedef VRControllerState001_t VRControllerState_t; + + +/** determines how to provide output to the application of various event processing functions. */ +enum EVRControllerEventOutputType +{ + ControllerEventOutput_OSEvents = 0, + ControllerEventOutput_VREvents = 1, +}; + + + +/** Collision Bounds Style */ +enum ECollisionBoundsStyle +{ + COLLISION_BOUNDS_STYLE_BEGINNER = 0, + COLLISION_BOUNDS_STYLE_INTERMEDIATE, + COLLISION_BOUNDS_STYLE_SQUARES, + COLLISION_BOUNDS_STYLE_ADVANCED, + COLLISION_BOUNDS_STYLE_NONE, + + COLLISION_BOUNDS_STYLE_COUNT +}; + +/** Allows the application to customize how the overlay appears in the compositor */ +struct Compositor_OverlaySettings +{ + uint32_t size; // sizeof(Compositor_OverlaySettings) + bool curved, antialias; + float scale, distance, alpha; + float uOffset, vOffset, uScale, vScale; + float gridDivs, gridWidth, gridScale; + HmdMatrix44_t transform; +}; + +/** used to refer to a single VR overlay */ +typedef uint64_t VROverlayHandle_t; + +static const VROverlayHandle_t k_ulOverlayHandleInvalid = 0; + +/** Errors that can occur around VR overlays */ +enum EVROverlayError +{ + VROverlayError_None = 0, + + VROverlayError_UnknownOverlay = 10, + VROverlayError_InvalidHandle = 11, + VROverlayError_PermissionDenied = 12, + VROverlayError_OverlayLimitExceeded = 13, // No more overlays could be created because the maximum number already exist + VROverlayError_WrongVisibilityType = 14, + VROverlayError_KeyTooLong = 15, + VROverlayError_NameTooLong = 16, + VROverlayError_KeyInUse = 17, + VROverlayError_WrongTransformType = 18, + VROverlayError_InvalidTrackedDevice = 19, + VROverlayError_InvalidParameter = 20, + VROverlayError_ThumbnailCantBeDestroyed = 21, + VROverlayError_ArrayTooSmall = 22, + VROverlayError_RequestFailed = 23, + VROverlayError_InvalidTexture = 24, + VROverlayError_UnableToLoadFile = 25, + VROverlayError_KeyboardAlreadyInUse = 26, + VROverlayError_NoNeighbor = 27, + VROverlayError_TooManyMaskPrimitives = 29, + VROverlayError_BadMaskPrimitive = 30, +}; + +/** enum values to pass in to VR_Init to identify whether the application will +* draw a 3D scene. */ +enum EVRApplicationType +{ + VRApplication_Other = 0, // Some other kind of application that isn't covered by the other entries + VRApplication_Scene = 1, // Application will submit 3D frames + VRApplication_Overlay = 2, // Application only interacts with overlays + VRApplication_Background = 3, // Application should not start SteamVR if it's not already running, and should not + // keep it running if everything else quits. + VRApplication_Utility = 4, // Init should not try to load any drivers. The application needs access to utility + // interfaces (like IVRSettings and IVRApplications) but not hardware. + VRApplication_VRMonitor = 5, // Reserved for vrmonitor + VRApplication_SteamWatchdog = 6,// Reserved for Steam + VRApplication_Bootstrapper = 7, // Start up SteamVR + + VRApplication_Max +}; + + +/** error codes for firmware */ +enum EVRFirmwareError +{ + VRFirmwareError_None = 0, + VRFirmwareError_Success = 1, + VRFirmwareError_Fail = 2, +}; + + +/** error codes for notifications */ +enum EVRNotificationError +{ + VRNotificationError_OK = 0, + VRNotificationError_InvalidNotificationId = 100, + VRNotificationError_NotificationQueueFull = 101, + VRNotificationError_InvalidOverlayHandle = 102, + VRNotificationError_SystemWithUserValueAlreadyExists = 103, +}; + + +/** error codes returned by Vr_Init */ + +// Please add adequate error description to https://developer.valvesoftware.com/w/index.php?title=Category:SteamVRHelp +enum EVRInitError +{ + VRInitError_None = 0, + VRInitError_Unknown = 1, + + VRInitError_Init_InstallationNotFound = 100, + VRInitError_Init_InstallationCorrupt = 101, + VRInitError_Init_VRClientDLLNotFound = 102, + VRInitError_Init_FileNotFound = 103, + VRInitError_Init_FactoryNotFound = 104, + VRInitError_Init_InterfaceNotFound = 105, + VRInitError_Init_InvalidInterface = 106, + VRInitError_Init_UserConfigDirectoryInvalid = 107, + VRInitError_Init_HmdNotFound = 108, + VRInitError_Init_NotInitialized = 109, + VRInitError_Init_PathRegistryNotFound = 110, + VRInitError_Init_NoConfigPath = 111, + VRInitError_Init_NoLogPath = 112, + VRInitError_Init_PathRegistryNotWritable = 113, + VRInitError_Init_AppInfoInitFailed = 114, + VRInitError_Init_Retry = 115, // Used internally to cause retries to vrserver + VRInitError_Init_InitCanceledByUser = 116, // The calling application should silently exit. The user canceled app startup + VRInitError_Init_AnotherAppLaunching = 117, + VRInitError_Init_SettingsInitFailed = 118, + VRInitError_Init_ShuttingDown = 119, + VRInitError_Init_TooManyObjects = 120, + VRInitError_Init_NoServerForBackgroundApp = 121, + VRInitError_Init_NotSupportedWithCompositor = 122, + VRInitError_Init_NotAvailableToUtilityApps = 123, + VRInitError_Init_Internal = 124, + VRInitError_Init_HmdDriverIdIsNone = 125, + VRInitError_Init_HmdNotFoundPresenceFailed = 126, + VRInitError_Init_VRMonitorNotFound = 127, + VRInitError_Init_VRMonitorStartupFailed = 128, + VRInitError_Init_LowPowerWatchdogNotSupported = 129, + VRInitError_Init_InvalidApplicationType = 130, + VRInitError_Init_NotAvailableToWatchdogApps = 131, + VRInitError_Init_WatchdogDisabledInSettings = 132, + VRInitError_Init_VRDashboardNotFound = 133, + VRInitError_Init_VRDashboardStartupFailed = 134, + VRInitError_Init_VRHomeNotFound = 135, + VRInitError_Init_VRHomeStartupFailed = 136, + + VRInitError_Driver_Failed = 200, + VRInitError_Driver_Unknown = 201, + VRInitError_Driver_HmdUnknown = 202, + VRInitError_Driver_NotLoaded = 203, + VRInitError_Driver_RuntimeOutOfDate = 204, + VRInitError_Driver_HmdInUse = 205, + VRInitError_Driver_NotCalibrated = 206, + VRInitError_Driver_CalibrationInvalid = 207, + VRInitError_Driver_HmdDisplayNotFound = 208, + VRInitError_Driver_TrackedDeviceInterfaceUnknown = 209, + // VRInitError_Driver_HmdDisplayNotFoundAfterFix = 210, // not needed: here for historic reasons + VRInitError_Driver_HmdDriverIdOutOfBounds = 211, + VRInitError_Driver_HmdDisplayMirrored = 212, + + VRInitError_IPC_ServerInitFailed = 300, + VRInitError_IPC_ConnectFailed = 301, + VRInitError_IPC_SharedStateInitFailed = 302, + VRInitError_IPC_CompositorInitFailed = 303, + VRInitError_IPC_MutexInitFailed = 304, + VRInitError_IPC_Failed = 305, + VRInitError_IPC_CompositorConnectFailed = 306, + VRInitError_IPC_CompositorInvalidConnectResponse = 307, + VRInitError_IPC_ConnectFailedAfterMultipleAttempts = 308, + + VRInitError_Compositor_Failed = 400, + VRInitError_Compositor_D3D11HardwareRequired = 401, + VRInitError_Compositor_FirmwareRequiresUpdate = 402, + VRInitError_Compositor_OverlayInitFailed = 403, + VRInitError_Compositor_ScreenshotsInitFailed = 404, + VRInitError_Compositor_UnableToCreateDevice = 405, + + VRInitError_VendorSpecific_UnableToConnectToOculusRuntime = 1000, + + VRInitError_VendorSpecific_HmdFound_CantOpenDevice = 1101, + VRInitError_VendorSpecific_HmdFound_UnableToRequestConfigStart = 1102, + VRInitError_VendorSpecific_HmdFound_NoStoredConfig = 1103, + VRInitError_VendorSpecific_HmdFound_ConfigTooBig = 1104, + VRInitError_VendorSpecific_HmdFound_ConfigTooSmall = 1105, + VRInitError_VendorSpecific_HmdFound_UnableToInitZLib = 1106, + VRInitError_VendorSpecific_HmdFound_CantReadFirmwareVersion = 1107, + VRInitError_VendorSpecific_HmdFound_UnableToSendUserDataStart = 1108, + VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataStart = 1109, + VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataNext = 1110, + VRInitError_VendorSpecific_HmdFound_UserDataAddressRange = 1111, + VRInitError_VendorSpecific_HmdFound_UserDataError = 1112, + VRInitError_VendorSpecific_HmdFound_ConfigFailedSanityCheck = 1113, + + VRInitError_Steam_SteamInstallationNotFound = 2000, +}; + +enum EVRScreenshotType +{ + VRScreenshotType_None = 0, + VRScreenshotType_Mono = 1, // left eye only + VRScreenshotType_Stereo = 2, + VRScreenshotType_Cubemap = 3, + VRScreenshotType_MonoPanorama = 4, + VRScreenshotType_StereoPanorama = 5 +}; + +enum EVRScreenshotPropertyFilenames +{ + VRScreenshotPropertyFilenames_Preview = 0, + VRScreenshotPropertyFilenames_VR = 1, +}; + +enum EVRTrackedCameraError +{ + VRTrackedCameraError_None = 0, + VRTrackedCameraError_OperationFailed = 100, + VRTrackedCameraError_InvalidHandle = 101, + VRTrackedCameraError_InvalidFrameHeaderVersion = 102, + VRTrackedCameraError_OutOfHandles = 103, + VRTrackedCameraError_IPCFailure = 104, + VRTrackedCameraError_NotSupportedForThisDevice = 105, + VRTrackedCameraError_SharedMemoryFailure = 106, + VRTrackedCameraError_FrameBufferingFailure = 107, + VRTrackedCameraError_StreamSetupFailure = 108, + VRTrackedCameraError_InvalidGLTextureId = 109, + VRTrackedCameraError_InvalidSharedTextureHandle = 110, + VRTrackedCameraError_FailedToGetGLTextureId = 111, + VRTrackedCameraError_SharedTextureFailure = 112, + VRTrackedCameraError_NoFrameAvailable = 113, + VRTrackedCameraError_InvalidArgument = 114, + VRTrackedCameraError_InvalidFrameBufferSize = 115, +}; + +enum EVRTrackedCameraFrameType +{ + VRTrackedCameraFrameType_Distorted = 0, // This is the camera video frame size in pixels, still distorted. + VRTrackedCameraFrameType_Undistorted, // In pixels, an undistorted inscribed rectangle region without invalid regions. This size is subject to changes shortly. + VRTrackedCameraFrameType_MaximumUndistorted, // In pixels, maximum undistorted with invalid regions. Non zero alpha component identifies valid regions. + MAX_CAMERA_FRAME_TYPES +}; + +typedef uint64_t TrackedCameraHandle_t; +#define INVALID_TRACKED_CAMERA_HANDLE ((vr::TrackedCameraHandle_t)0) + +struct CameraVideoStreamFrameHeader_t +{ + EVRTrackedCameraFrameType eFrameType; + + uint32_t nWidth; + uint32_t nHeight; + uint32_t nBytesPerPixel; + + uint32_t nFrameSequence; + + TrackedDevicePose_t standingTrackedDevicePose; +}; + +// Screenshot types +typedef uint32_t ScreenshotHandle_t; + +static const uint32_t k_unScreenshotHandleInvalid = 0; + +#pragma pack( pop ) + +// figure out how to import from the VR API dll +#if defined(_WIN32) + +#ifdef VR_API_EXPORT +#define VR_INTERFACE extern "C" __declspec( dllexport ) +#else +#define VR_INTERFACE extern "C" __declspec( dllimport ) +#endif + +#elif defined(__GNUC__) || defined(COMPILER_GCC) || defined(__APPLE__) + +#ifdef VR_API_EXPORT +#define VR_INTERFACE extern "C" __attribute__((visibility("default"))) +#else +#define VR_INTERFACE extern "C" +#endif + +#else +#error "Unsupported Platform." +#endif + + +#if defined( _WIN32 ) +#define VR_CALLTYPE __cdecl +#else +#define VR_CALLTYPE +#endif + +} // namespace vr + +#endif // _INCLUDE_VRTYPES_H + + +// vrannotation.h +#ifdef API_GEN +# define VR_CLANG_ATTR(ATTR) __attribute__((annotate( ATTR ))) +#else +# define VR_CLANG_ATTR(ATTR) +#endif + +#define VR_METHOD_DESC(DESC) VR_CLANG_ATTR( "desc:" #DESC ";" ) +#define VR_IGNOREATTR() VR_CLANG_ATTR( "ignore" ) +#define VR_OUT_STRUCT() VR_CLANG_ATTR( "out_struct: ;" ) +#define VR_OUT_STRING() VR_CLANG_ATTR( "out_string: ;" ) +#define VR_OUT_ARRAY_CALL(COUNTER,FUNCTION,PARAMS) VR_CLANG_ATTR( "out_array_call:" #COUNTER "," #FUNCTION "," #PARAMS ";" ) +#define VR_OUT_ARRAY_COUNT(COUNTER) VR_CLANG_ATTR( "out_array_count:" #COUNTER ";" ) +#define VR_ARRAY_COUNT(COUNTER) VR_CLANG_ATTR( "array_count:" #COUNTER ";" ) +#define VR_ARRAY_COUNT_D(COUNTER, DESC) VR_CLANG_ATTR( "array_count:" #COUNTER ";desc:" #DESC ) +#define VR_BUFFER_COUNT(COUNTER) VR_CLANG_ATTR( "buffer_count:" #COUNTER ";" ) +#define VR_OUT_BUFFER_COUNT(COUNTER) VR_CLANG_ATTR( "out_buffer_count:" #COUNTER ";" ) +#define VR_OUT_STRING_COUNT(COUNTER) VR_CLANG_ATTR( "out_string_count:" #COUNTER ";" ) + +// vrtrackedcameratypes.h +#ifndef _VRTRACKEDCAMERATYPES_H +#define _VRTRACKEDCAMERATYPES_H + +namespace vr +{ + +#pragma pack( push, 8 ) + +enum ECameraVideoStreamFormat +{ + CVS_FORMAT_UNKNOWN = 0, + CVS_FORMAT_RAW10 = 1, // 10 bits per pixel + CVS_FORMAT_NV12 = 2, // 12 bits per pixel + CVS_FORMAT_RGB24 = 3, // 24 bits per pixel + CVS_MAX_FORMATS +}; + +enum ECameraCompatibilityMode +{ + CAMERA_COMPAT_MODE_BULK_DEFAULT = 0, + CAMERA_COMPAT_MODE_BULK_64K_DMA, + CAMERA_COMPAT_MODE_BULK_16K_DMA, + CAMERA_COMPAT_MODE_BULK_8K_DMA, + CAMERA_COMPAT_MODE_ISO_52FPS, + CAMERA_COMPAT_MODE_ISO_50FPS, + CAMERA_COMPAT_MODE_ISO_48FPS, + CAMERA_COMPAT_MODE_ISO_46FPS, + CAMERA_COMPAT_MODE_ISO_44FPS, + CAMERA_COMPAT_MODE_ISO_42FPS, + CAMERA_COMPAT_MODE_ISO_40FPS, + CAMERA_COMPAT_MODE_ISO_35FPS, + CAMERA_COMPAT_MODE_ISO_30FPS, + MAX_CAMERA_COMPAT_MODES +}; + +#ifdef _MSC_VER +#define VR_CAMERA_DECL_ALIGN( x ) __declspec( align( x ) ) +#else +#define VR_CAMERA_DECL_ALIGN( x ) // +#endif + +#define MAX_CAMERA_FRAME_SHARED_HANDLES 4 + +VR_CAMERA_DECL_ALIGN( 8 ) struct CameraVideoStreamFrame_t +{ + ECameraVideoStreamFormat m_nStreamFormat; + + uint32_t m_nWidth; + uint32_t m_nHeight; + + uint32_t m_nImageDataSize; // Based on stream format, width, height + + uint32_t m_nFrameSequence; // Starts from 0 when stream starts. + + uint32_t m_nBufferIndex; // Identifies which buffer the image data is hosted + uint32_t m_nBufferCount; // Total number of configured buffers + + uint32_t m_nExposureTime; + + uint32_t m_nISPFrameTimeStamp; // Driver provided time stamp per driver centric time base + uint32_t m_nISPReferenceTimeStamp; + uint32_t m_nSyncCounter; + + uint32_t m_nCamSyncEvents; + uint32_t m_nISPSyncEvents; + + double m_flReferenceCamSyncTime; + + double m_flFrameElapsedTime; // Starts from 0 when stream starts. In seconds. + double m_flFrameDeliveryRate; + + double m_flFrameCaptureTime_DriverAbsolute; // In USB time, via AuxEvent + double m_flFrameCaptureTime_ServerRelative; // In System time within the server + uint64_t m_nFrameCaptureTicks_ServerAbsolute; // In system ticks within the server + double m_flFrameCaptureTime_ClientRelative; // At the client, relative to when the frame was exposed/captured. + + double m_flSyncMarkerError; + + TrackedDevicePose_t m_StandingTrackedDevicePose; // Supplied by HMD layer when used as a tracked camera + + uint64_t m_pImageData; +}; + +#pragma pack( pop ) + +} + +#endif // _VRTRACKEDCAMERATYPES_H +// ivrsettings.h +namespace vr +{ + enum EVRSettingsError + { + VRSettingsError_None = 0, + VRSettingsError_IPCFailed = 1, + VRSettingsError_WriteFailed = 2, + VRSettingsError_ReadFailed = 3, + VRSettingsError_JsonParseFailed = 4, + VRSettingsError_UnsetSettingHasNoDefault = 5, // This will be returned if the setting does not appear in the appropriate default file and has not been set + }; + + // The maximum length of a settings key + static const uint32_t k_unMaxSettingsKeyLength = 128; + + class IVRSettings + { + public: + virtual const char *GetSettingsErrorNameFromEnum( EVRSettingsError eError ) = 0; + + // Returns true if file sync occurred (force or settings dirty) + virtual bool Sync( bool bForce = false, EVRSettingsError *peError = nullptr ) = 0; + + virtual void SetBool( const char *pchSection, const char *pchSettingsKey, bool bValue, EVRSettingsError *peError = nullptr ) = 0; + virtual void SetInt32( const char *pchSection, const char *pchSettingsKey, int32_t nValue, EVRSettingsError *peError = nullptr ) = 0; + virtual void SetFloat( const char *pchSection, const char *pchSettingsKey, float flValue, EVRSettingsError *peError = nullptr ) = 0; + virtual void SetString( const char *pchSection, const char *pchSettingsKey, const char *pchValue, EVRSettingsError *peError = nullptr ) = 0; + + // Users of the system need to provide a proper default in default.vrsettings in the resources/settings/ directory + // of either the runtime or the driver_xxx directory. Otherwise the default will be false, 0, 0.0 or "" + virtual bool GetBool( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0; + virtual int32_t GetInt32( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0; + virtual float GetFloat( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0; + virtual void GetString( const char *pchSection, const char *pchSettingsKey, VR_OUT_STRING() char *pchValue, uint32_t unValueLen, EVRSettingsError *peError = nullptr ) = 0; + + virtual void RemoveSection( const char *pchSection, EVRSettingsError *peError = nullptr ) = 0; + virtual void RemoveKeyInSection( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0; + }; + + //----------------------------------------------------------------------------- + static const char * const IVRSettings_Version = "IVRSettings_002"; + + //----------------------------------------------------------------------------- + // steamvr keys + static const char * const k_pch_SteamVR_Section = "steamvr"; + static const char * const k_pch_SteamVR_RequireHmd_String = "requireHmd"; + static const char * const k_pch_SteamVR_ForcedDriverKey_String = "forcedDriver"; + static const char * const k_pch_SteamVR_ForcedHmdKey_String = "forcedHmd"; + static const char * const k_pch_SteamVR_DisplayDebug_Bool = "displayDebug"; + static const char * const k_pch_SteamVR_DebugProcessPipe_String = "debugProcessPipe"; + static const char * const k_pch_SteamVR_DisplayDebugX_Int32 = "displayDebugX"; + static const char * const k_pch_SteamVR_DisplayDebugY_Int32 = "displayDebugY"; + static const char * const k_pch_SteamVR_SendSystemButtonToAllApps_Bool= "sendSystemButtonToAllApps"; + static const char * const k_pch_SteamVR_LogLevel_Int32 = "loglevel"; + static const char * const k_pch_SteamVR_IPD_Float = "ipd"; + static const char * const k_pch_SteamVR_Background_String = "background"; + static const char * const k_pch_SteamVR_BackgroundUseDomeProjection_Bool = "backgroundUseDomeProjection"; + static const char * const k_pch_SteamVR_BackgroundCameraHeight_Float = "backgroundCameraHeight"; + static const char * const k_pch_SteamVR_BackgroundDomeRadius_Float = "backgroundDomeRadius"; + static const char * const k_pch_SteamVR_GridColor_String = "gridColor"; + static const char * const k_pch_SteamVR_PlayAreaColor_String = "playAreaColor"; + static const char * const k_pch_SteamVR_ShowStage_Bool = "showStage"; + static const char * const k_pch_SteamVR_ActivateMultipleDrivers_Bool = "activateMultipleDrivers"; + static const char * const k_pch_SteamVR_DirectMode_Bool = "directMode"; + static const char * const k_pch_SteamVR_DirectModeEdidVid_Int32 = "directModeEdidVid"; + static const char * const k_pch_SteamVR_DirectModeEdidPid_Int32 = "directModeEdidPid"; + static const char * const k_pch_SteamVR_UsingSpeakers_Bool = "usingSpeakers"; + static const char * const k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float = "speakersForwardYawOffsetDegrees"; + static const char * const k_pch_SteamVR_BaseStationPowerManagement_Bool = "basestationPowerManagement"; + static const char * const k_pch_SteamVR_NeverKillProcesses_Bool = "neverKillProcesses"; + static const char * const k_pch_SteamVR_SupersampleScale_Float = "supersampleScale"; + static const char * const k_pch_SteamVR_AllowAsyncReprojection_Bool = "allowAsyncReprojection"; + static const char * const k_pch_SteamVR_AllowReprojection_Bool = "allowInterleavedReprojection"; + static const char * const k_pch_SteamVR_ForceReprojection_Bool = "forceReprojection"; + static const char * const k_pch_SteamVR_ForceFadeOnBadTracking_Bool = "forceFadeOnBadTracking"; + static const char * const k_pch_SteamVR_DefaultMirrorView_Int32 = "defaultMirrorView"; + static const char * const k_pch_SteamVR_ShowMirrorView_Bool = "showMirrorView"; + static const char * const k_pch_SteamVR_MirrorViewGeometry_String = "mirrorViewGeometry"; + static const char * const k_pch_SteamVR_StartMonitorFromAppLaunch = "startMonitorFromAppLaunch"; + static const char * const k_pch_SteamVR_StartCompositorFromAppLaunch_Bool = "startCompositorFromAppLaunch"; + static const char * const k_pch_SteamVR_StartDashboardFromAppLaunch_Bool = "startDashboardFromAppLaunch"; + static const char * const k_pch_SteamVR_StartOverlayAppsFromDashboard_Bool = "startOverlayAppsFromDashboard"; + static const char * const k_pch_SteamVR_EnableHomeApp = "enableHomeApp"; + static const char * const k_pch_SteamVR_CycleBackgroundImageTimeSec_Int32 = "CycleBackgroundImageTimeSec"; + static const char * const k_pch_SteamVR_RetailDemo_Bool = "retailDemo"; + static const char * const k_pch_SteamVR_IpdOffset_Float = "ipdOffset"; + static const char * const k_pch_SteamVR_AllowSupersampleFiltering_Bool = "allowSupersampleFiltering"; + + //----------------------------------------------------------------------------- + // lighthouse keys + static const char * const k_pch_Lighthouse_Section = "driver_lighthouse"; + static const char * const k_pch_Lighthouse_DisableIMU_Bool = "disableimu"; + static const char * const k_pch_Lighthouse_UseDisambiguation_String = "usedisambiguation"; + static const char * const k_pch_Lighthouse_DisambiguationDebug_Int32 = "disambiguationdebug"; + static const char * const k_pch_Lighthouse_PrimaryBasestation_Int32 = "primarybasestation"; + static const char * const k_pch_Lighthouse_DBHistory_Bool = "dbhistory"; + + //----------------------------------------------------------------------------- + // null keys + static const char * const k_pch_Null_Section = "driver_null"; + static const char * const k_pch_Null_SerialNumber_String = "serialNumber"; + static const char * const k_pch_Null_ModelNumber_String = "modelNumber"; + static const char * const k_pch_Null_WindowX_Int32 = "windowX"; + static const char * const k_pch_Null_WindowY_Int32 = "windowY"; + static const char * const k_pch_Null_WindowWidth_Int32 = "windowWidth"; + static const char * const k_pch_Null_WindowHeight_Int32 = "windowHeight"; + static const char * const k_pch_Null_RenderWidth_Int32 = "renderWidth"; + static const char * const k_pch_Null_RenderHeight_Int32 = "renderHeight"; + static const char * const k_pch_Null_SecondsFromVsyncToPhotons_Float = "secondsFromVsyncToPhotons"; + static const char * const k_pch_Null_DisplayFrequency_Float = "displayFrequency"; + + //----------------------------------------------------------------------------- + // user interface keys + static const char * const k_pch_UserInterface_Section = "userinterface"; + static const char * const k_pch_UserInterface_StatusAlwaysOnTop_Bool = "StatusAlwaysOnTop"; + static const char * const k_pch_UserInterface_MinimizeToTray_Bool = "MinimizeToTray"; + static const char * const k_pch_UserInterface_Screenshots_Bool = "screenshots"; + static const char * const k_pch_UserInterface_ScreenshotType_Int = "screenshotType"; + + //----------------------------------------------------------------------------- + // notification keys + static const char * const k_pch_Notifications_Section = "notifications"; + static const char * const k_pch_Notifications_DoNotDisturb_Bool = "DoNotDisturb"; + + //----------------------------------------------------------------------------- + // keyboard keys + static const char * const k_pch_Keyboard_Section = "keyboard"; + static const char * const k_pch_Keyboard_TutorialCompletions = "TutorialCompletions"; + static const char * const k_pch_Keyboard_ScaleX = "ScaleX"; + static const char * const k_pch_Keyboard_ScaleY = "ScaleY"; + static const char * const k_pch_Keyboard_OffsetLeftX = "OffsetLeftX"; + static const char * const k_pch_Keyboard_OffsetRightX = "OffsetRightX"; + static const char * const k_pch_Keyboard_OffsetY = "OffsetY"; + static const char * const k_pch_Keyboard_Smoothing = "Smoothing"; + + //----------------------------------------------------------------------------- + // perf keys + static const char * const k_pch_Perf_Section = "perfcheck"; + static const char * const k_pch_Perf_HeuristicActive_Bool = "heuristicActive"; + static const char * const k_pch_Perf_NotifyInHMD_Bool = "warnInHMD"; + static const char * const k_pch_Perf_NotifyOnlyOnce_Bool = "warnOnlyOnce"; + static const char * const k_pch_Perf_AllowTimingStore_Bool = "allowTimingStore"; + static const char * const k_pch_Perf_SaveTimingsOnExit_Bool = "saveTimingsOnExit"; + static const char * const k_pch_Perf_TestData_Float = "perfTestData"; + static const char * const k_pch_Perf_LinuxGPUProfiling_Bool = "linuxGPUProfiling"; + + //----------------------------------------------------------------------------- + // collision bounds keys + static const char * const k_pch_CollisionBounds_Section = "collisionBounds"; + static const char * const k_pch_CollisionBounds_Style_Int32 = "CollisionBoundsStyle"; + static const char * const k_pch_CollisionBounds_GroundPerimeterOn_Bool = "CollisionBoundsGroundPerimeterOn"; + static const char * const k_pch_CollisionBounds_CenterMarkerOn_Bool = "CollisionBoundsCenterMarkerOn"; + static const char * const k_pch_CollisionBounds_PlaySpaceOn_Bool = "CollisionBoundsPlaySpaceOn"; + static const char * const k_pch_CollisionBounds_FadeDistance_Float = "CollisionBoundsFadeDistance"; + static const char * const k_pch_CollisionBounds_ColorGammaR_Int32 = "CollisionBoundsColorGammaR"; + static const char * const k_pch_CollisionBounds_ColorGammaG_Int32 = "CollisionBoundsColorGammaG"; + static const char * const k_pch_CollisionBounds_ColorGammaB_Int32 = "CollisionBoundsColorGammaB"; + static const char * const k_pch_CollisionBounds_ColorGammaA_Int32 = "CollisionBoundsColorGammaA"; + + //----------------------------------------------------------------------------- + // camera keys + static const char * const k_pch_Camera_Section = "camera"; + static const char * const k_pch_Camera_EnableCamera_Bool = "enableCamera"; + static const char * const k_pch_Camera_EnableCameraInDashboard_Bool = "enableCameraInDashboard"; + static const char * const k_pch_Camera_EnableCameraForCollisionBounds_Bool = "enableCameraForCollisionBounds"; + static const char * const k_pch_Camera_EnableCameraForRoomView_Bool = "enableCameraForRoomView"; + static const char * const k_pch_Camera_BoundsColorGammaR_Int32 = "cameraBoundsColorGammaR"; + static const char * const k_pch_Camera_BoundsColorGammaG_Int32 = "cameraBoundsColorGammaG"; + static const char * const k_pch_Camera_BoundsColorGammaB_Int32 = "cameraBoundsColorGammaB"; + static const char * const k_pch_Camera_BoundsColorGammaA_Int32 = "cameraBoundsColorGammaA"; + static const char * const k_pch_Camera_BoundsStrength_Int32 = "cameraBoundsStrength"; + + //----------------------------------------------------------------------------- + // audio keys + static const char * const k_pch_audio_Section = "audio"; + static const char * const k_pch_audio_OnPlaybackDevice_String = "onPlaybackDevice"; + static const char * const k_pch_audio_OnRecordDevice_String = "onRecordDevice"; + static const char * const k_pch_audio_OnPlaybackMirrorDevice_String = "onPlaybackMirrorDevice"; + static const char * const k_pch_audio_OffPlaybackDevice_String = "offPlaybackDevice"; + static const char * const k_pch_audio_OffRecordDevice_String = "offRecordDevice"; + static const char * const k_pch_audio_VIVEHDMIGain = "viveHDMIGain"; + + //----------------------------------------------------------------------------- + // power management keys + static const char * const k_pch_Power_Section = "power"; + static const char * const k_pch_Power_PowerOffOnExit_Bool = "powerOffOnExit"; + static const char * const k_pch_Power_TurnOffScreensTimeout_Float = "turnOffScreensTimeout"; + static const char * const k_pch_Power_TurnOffControllersTimeout_Float = "turnOffControllersTimeout"; + static const char * const k_pch_Power_ReturnToWatchdogTimeout_Float = "returnToWatchdogTimeout"; + static const char * const k_pch_Power_AutoLaunchSteamVROnButtonPress = "autoLaunchSteamVROnButtonPress"; + + //----------------------------------------------------------------------------- + // dashboard keys + static const char * const k_pch_Dashboard_Section = "dashboard"; + static const char * const k_pch_Dashboard_EnableDashboard_Bool = "enableDashboard"; + static const char * const k_pch_Dashboard_ArcadeMode_Bool = "arcadeMode"; + + //----------------------------------------------------------------------------- + // model skin keys + static const char * const k_pch_modelskin_Section = "modelskins"; + + //----------------------------------------------------------------------------- + // driver keys - These could be checked in any driver_ section + static const char * const k_pch_Driver_Enable_Bool = "enable"; + +} // namespace vr + +// iservertrackeddevicedriver.h +namespace vr +{ + + +struct DriverPoseQuaternion_t +{ + double w, x, y, z; +}; + +struct DriverPose_t +{ + /* Time offset of this pose, in seconds from the actual time of the pose, + * relative to the time of the PoseUpdated() call made by the driver. + */ + double poseTimeOffset; + + /* Generally, the pose maintained by a driver + * is in an inertial coordinate system different + * from the world system of x+ right, y+ up, z+ back. + * Also, the driver is not usually tracking the "head" position, + * but instead an internal IMU or another reference point in the HMD. + * The following two transforms transform positions and orientations + * to app world space from driver world space, + * and to HMD head space from driver local body space. + * + * We maintain the driver pose state in its internal coordinate system, + * so we can do the pose prediction math without having to + * use angular acceleration. A driver's angular acceleration is generally not measured, + * and is instead calculated from successive samples of angular velocity. + * This leads to a noisy angular acceleration values, which are also + * lagged due to the filtering required to reduce noise to an acceptable level. + */ + vr::HmdQuaternion_t qWorldFromDriverRotation; + double vecWorldFromDriverTranslation[ 3 ]; + + vr::HmdQuaternion_t qDriverFromHeadRotation; + double vecDriverFromHeadTranslation[ 3 ]; + + /* State of driver pose, in meters and radians. */ + /* Position of the driver tracking reference in driver world space + * +[0] (x) is right + * +[1] (y) is up + * -[2] (z) is forward + */ + double vecPosition[ 3 ]; + + /* Velocity of the pose in meters/second */ + double vecVelocity[ 3 ]; + + /* Acceleration of the pose in meters/second */ + double vecAcceleration[ 3 ]; + + /* Orientation of the tracker, represented as a quaternion */ + vr::HmdQuaternion_t qRotation; + + /* Angular velocity of the pose in axis-angle + * representation. The direction is the angle of + * rotation and the magnitude is the angle around + * that axis in radians/second. */ + double vecAngularVelocity[ 3 ]; + + /* Angular acceleration of the pose in axis-angle + * representation. The direction is the angle of + * rotation and the magnitude is the angle around + * that axis in radians/second^2. */ + double vecAngularAcceleration[ 3 ]; + + ETrackingResult result; + + bool poseIsValid; + bool willDriftInYaw; + bool shouldApplyHeadModel; + bool deviceIsConnected; +}; + + +// ---------------------------------------------------------------------------------------------- +// Purpose: Represents a single tracked device in a driver +// ---------------------------------------------------------------------------------------------- +class ITrackedDeviceServerDriver +{ +public: + + // ------------------------------------ + // Management Methods + // ------------------------------------ + /** This is called before an HMD is returned to the application. It will always be + * called before any display or tracking methods. Memory and processor use by the + * ITrackedDeviceServerDriver object should be kept to a minimum until it is activated. + * The pose listener is guaranteed to be valid until Deactivate is called, but + * should not be used after that point. */ + virtual EVRInitError Activate( uint32_t unObjectId ) = 0; + + /** This is called when The VR system is switching from this Hmd being the active display + * to another Hmd being the active display. The driver should clean whatever memory + * and thread use it can when it is deactivated */ + virtual void Deactivate() = 0; + + /** Handles a request from the system to put this device into standby mode. What that means is defined per-device. */ + virtual void EnterStandby() = 0; + + /** Requests a component interface of the driver for device-specific functionality. The driver should return NULL + * if the requested interface or version is not supported. */ + virtual void *GetComponent( const char *pchComponentNameAndVersion ) = 0; + + /** A VR Client has made this debug request of the driver. The set of valid requests is entirely + * up to the driver and the client to figure out, as is the format of the response. Responses that + * exceed the length of the supplied buffer should be truncated and null terminated */ + virtual void DebugRequest( const char *pchRequest, char *pchResponseBuffer, uint32_t unResponseBufferSize ) = 0; + + // ------------------------------------ + // Tracking Methods + // ------------------------------------ + virtual DriverPose_t GetPose() = 0; +}; + + + +static const char *ITrackedDeviceServerDriver_Version = "ITrackedDeviceServerDriver_005"; + +} +// ivrdisplaycomponent.h +namespace vr +{ + + + // ---------------------------------------------------------------------------------------------- + // Purpose: The display component on a single tracked device + // ---------------------------------------------------------------------------------------------- + class IVRDisplayComponent + { + public: + + // ------------------------------------ + // Display Methods + // ------------------------------------ + + /** Size and position that the window needs to be on the VR display. */ + virtual void GetWindowBounds( int32_t *pnX, int32_t *pnY, uint32_t *pnWidth, uint32_t *pnHeight ) = 0; + + /** Returns true if the display is extending the desktop. */ + virtual bool IsDisplayOnDesktop( ) = 0; + + /** Returns true if the display is real and not a fictional display. */ + virtual bool IsDisplayRealDisplay( ) = 0; + + /** Suggested size for the intermediate render target that the distortion pulls from. */ + virtual void GetRecommendedRenderTargetSize( uint32_t *pnWidth, uint32_t *pnHeight ) = 0; + + /** Gets the viewport in the frame buffer to draw the output of the distortion into */ + virtual void GetEyeOutputViewport( EVREye eEye, uint32_t *pnX, uint32_t *pnY, uint32_t *pnWidth, uint32_t *pnHeight ) = 0; + + /** The components necessary to build your own projection matrix in case your + * application is doing something fancy like infinite Z */ + virtual void GetProjectionRaw( EVREye eEye, float *pfLeft, float *pfRight, float *pfTop, float *pfBottom ) = 0; + + /** Returns the result of the distortion function for the specified eye and input UVs. UVs go from 0,0 in + * the upper left of that eye's viewport and 1,1 in the lower right of that eye's viewport. */ + virtual DistortionCoordinates_t ComputeDistortion( EVREye eEye, float fU, float fV ) = 0; + + }; + + static const char *IVRDisplayComponent_Version = "IVRDisplayComponent_002"; + +} + +// ivrdriverdirectmodecomponent.h +namespace vr +{ + + + // ---------------------------------------------------------------------------------------------- + // Purpose: This component is used for drivers that implement direct mode entirely on their own + // without allowing the VR Compositor to own the window/device. Chances are you don't + // need to implement this component in your driver. + // ---------------------------------------------------------------------------------------------- + class IVRDriverDirectModeComponent + { + public: + + // ----------------------------------- + // Direct mode methods + // ----------------------------------- + + /** Specific to Oculus compositor support, textures supplied must be created using this method. */ + virtual void CreateSwapTextureSet( uint32_t unPid, uint32_t unFormat, uint32_t unWidth, uint32_t unHeight, vr::SharedTextureHandle_t( *pSharedTextureHandles )[ 3 ] ) {} + + /** Used to textures created using CreateSwapTextureSet. Only one of the set's handles needs to be used to destroy the entire set. */ + virtual void DestroySwapTextureSet( vr::SharedTextureHandle_t sharedTextureHandle ) {} + + /** Used to purge all texture sets for a given process. */ + virtual void DestroyAllSwapTextureSets( uint32_t unPid ) {} + + /** After Present returns, calls this to get the next index to use for rendering. */ + virtual void GetNextSwapTextureSetIndex( vr::SharedTextureHandle_t sharedTextureHandles[ 2 ], uint32_t( *pIndices )[ 2 ] ) {} + + /** Call once per layer to draw for this frame. One shared texture handle per eye. Textures must be created + * using CreateSwapTextureSet and should be alternated per frame. Call Present once all layers have been submitted. */ + virtual void SubmitLayer( vr::SharedTextureHandle_t sharedTextureHandles[ 2 ], const vr::VRTextureBounds_t( &bounds )[ 2 ], const vr::HmdMatrix34_t *pPose ) {} + + /** Submits queued layers for display. */ + virtual void Present( vr::SharedTextureHandle_t syncTexture ) {} + + }; + + static const char *IVRDriverDirectModeComponent_Version = "IVRDriverDirectModeComponent_002"; + +} + +// ivrcontrollercomponent.h +namespace vr +{ + + + // ---------------------------------------------------------------------------------------------- + // Purpose: Controller access on a single tracked device. + // ---------------------------------------------------------------------------------------------- + class IVRControllerComponent + { + public: + + // ------------------------------------ + // Controller Methods + // ------------------------------------ + + /** Gets the current state of a controller. */ + virtual VRControllerState_t GetControllerState( ) = 0; + + /** Returns a uint64 property. If the property is not available this function will return 0. */ + virtual bool TriggerHapticPulse( uint32_t unAxisId, uint16_t usPulseDurationMicroseconds ) = 0; + + }; + + + + static const char *IVRControllerComponent_Version = "IVRControllerComponent_001"; + +} +// ivrcameracomponent.h +namespace vr +{ + //----------------------------------------------------------------------------- + //----------------------------------------------------------------------------- + class ICameraVideoSinkCallback + { + public: + virtual void OnCameraVideoSinkCallback() = 0; + }; + + // ---------------------------------------------------------------------------------------------- + // Purpose: The camera on a single tracked device + // ---------------------------------------------------------------------------------------------- + class IVRCameraComponent + { + public: + // ------------------------------------ + // Camera Methods + // ------------------------------------ + virtual bool GetCameraFrameDimensions( vr::ECameraVideoStreamFormat nVideoStreamFormat, uint32_t *pWidth, uint32_t *pHeight ) = 0; + virtual bool GetCameraFrameBufferingRequirements( int *pDefaultFrameQueueSize, uint32_t *pFrameBufferDataSize ) = 0; + virtual bool SetCameraFrameBuffering( int nFrameBufferCount, void **ppFrameBuffers, uint32_t nFrameBufferDataSize ) = 0; + virtual bool SetCameraVideoStreamFormat( vr::ECameraVideoStreamFormat nVideoStreamFormat ) = 0; + virtual vr::ECameraVideoStreamFormat GetCameraVideoStreamFormat() = 0; + virtual bool StartVideoStream() = 0; + virtual void StopVideoStream() = 0; + virtual bool IsVideoStreamActive( bool *pbPaused, float *pflElapsedTime ) = 0; + virtual const vr::CameraVideoStreamFrame_t *GetVideoStreamFrame() = 0; + virtual void ReleaseVideoStreamFrame( const vr::CameraVideoStreamFrame_t *pFrameImage ) = 0; + virtual bool SetAutoExposure( bool bEnable ) = 0; + virtual bool PauseVideoStream() = 0; + virtual bool ResumeVideoStream() = 0; + virtual bool GetCameraDistortion( float flInputU, float flInputV, float *pflOutputU, float *pflOutputV ) = 0; + virtual bool GetCameraProjection( vr::EVRTrackedCameraFrameType eFrameType, float flZNear, float flZFar, vr::HmdMatrix44_t *pProjection ) = 0; + virtual bool SetFrameRate( int nISPFrameRate, int nSensorFrameRate ) = 0; + virtual bool SetCameraVideoSinkCallback( vr::ICameraVideoSinkCallback *pCameraVideoSinkCallback ) = 0; + virtual bool GetCameraCompatibilityMode( vr::ECameraCompatibilityMode *pCameraCompatibilityMode ) = 0; + virtual bool SetCameraCompatibilityMode( vr::ECameraCompatibilityMode nCameraCompatibilityMode ) = 0; + virtual bool GetCameraFrameBounds( vr::EVRTrackedCameraFrameType eFrameType, uint32_t *pLeft, uint32_t *pTop, uint32_t *pWidth, uint32_t *pHeight ) = 0; + virtual bool GetCameraIntrinsics( vr::EVRTrackedCameraFrameType eFrameType, HmdVector2_t *pFocalLength, HmdVector2_t *pCenter ) = 0; + }; + + static const char *IVRCameraComponent_Version = "IVRCameraComponent_002"; +} +// itrackeddevicedriverprovider.h +namespace vr +{ + +class ITrackedDeviceServerDriver; +struct TrackedDeviceDriverInfo_t; +struct DriverPose_t; +typedef PropertyContainerHandle_t DriverHandle_t; + +/** This interface is provided by vrserver to allow the driver to notify +* the system when something changes about a device. These changes must +* not change the serial number or class of the device because those values +* are permanently associated with the device's index. */ +class IVRDriverContext +{ +public: + /** Returns the requested interface. If the interface was not available it will return NULL and fill + * out the error. */ + virtual void *GetGenericInterface( const char *pchInterfaceVersion, EVRInitError *peError = nullptr ) = 0; + + /** Returns the property container handle for this driver */ + virtual DriverHandle_t GetDriverHandle() = 0; +}; + + +/** This interface must be implemented in each driver. It will be loaded in vrserver.exe */ +class IServerTrackedDeviceProvider +{ +public: + /** initializes the driver. This will be called before any other methods are called. + * If Init returns anything other than VRInitError_None the driver DLL will be unloaded. + * + * pDriverHost will never be NULL, and will always be a pointer to a IServerDriverHost interface + * + * pchUserDriverConfigDir - The absolute path of the directory where the driver should store user + * config files. + * pchDriverInstallDir - The absolute path of the root directory for the driver. + */ + virtual EVRInitError Init( IVRDriverContext *pDriverContext ) = 0; + + /** cleans up the driver right before it is unloaded */ + virtual void Cleanup() = 0; + + /** Returns the version of the ITrackedDeviceServerDriver interface used by this driver */ + virtual const char * const *GetInterfaceVersions() = 0; + + /** Allows the driver do to some work in the main loop of the server. */ + virtual void RunFrame() = 0; + + + // ------------ Power State Functions ----------------------- // + + /** Returns true if the driver wants to block Standby mode. */ + virtual bool ShouldBlockStandbyMode() = 0; + + /** Called when the system is entering Standby mode. The driver should switch itself into whatever sort of low-power + * state it has. */ + virtual void EnterStandby() = 0; + + /** Called when the system is leaving Standby mode. The driver should switch itself back to + full operation. */ + virtual void LeaveStandby() = 0; + +}; + + +static const char *IServerTrackedDeviceProvider_Version = "IServerTrackedDeviceProvider_004"; + + + + +/** This interface must be implemented in each driver. It will be loaded in vrclient.dll */ +class IVRWatchdogProvider +{ +public: + /** initializes the driver in watchdog mode. */ + virtual EVRInitError Init( IVRDriverContext *pDriverContext ) = 0; + + /** cleans up the driver right before it is unloaded */ + virtual void Cleanup() = 0; +}; + +static const char *IVRWatchdogProvider_Version = "IVRWatchdogProvider_001"; + +} +// ivrproperties.h +#include + +namespace vr +{ + + enum EPropertyWriteType + { + PropertyWrite_Set = 0, + PropertyWrite_Erase = 1, + PropertyWrite_SetError = 2 + }; + + struct PropertyWrite_t + { + ETrackedDeviceProperty prop; + EPropertyWriteType writeType; + ETrackedPropertyError eSetError; + void *pvBuffer; + uint32_t unBufferSize; + PropertyTypeTag_t unTag; + ETrackedPropertyError eError; + }; + + struct PropertyRead_t + { + ETrackedDeviceProperty prop; + void *pvBuffer; + uint32_t unBufferSize; + PropertyTypeTag_t unTag; + uint32_t unRequiredBufferSize; + ETrackedPropertyError eError; + }; + + +class IVRProperties +{ +public: + + /** Reads a set of properties atomically. See the PropertyReadBatch_t struct for more information. */ + virtual ETrackedPropertyError ReadPropertyBatch( PropertyContainerHandle_t ulContainerHandle, PropertyRead_t *pBatch, uint32_t unBatchEntryCount ) = 0; + + /** Writes a set of properties atomically. See the PropertyWriteBatch_t struct for more information. */ + virtual ETrackedPropertyError WritePropertyBatch( PropertyContainerHandle_t ulContainerHandle, PropertyWrite_t *pBatch, uint32_t unBatchEntryCount ) = 0; + + /** returns a string that corresponds with the specified property error. The string will be the name + * of the error enum value for all valid error codes */ + virtual const char *GetPropErrorNameFromEnum( ETrackedPropertyError error ) = 0; + + /** Returns a container handle given a tracked device index */ + virtual PropertyContainerHandle_t TrackedDeviceToPropertyContainer( TrackedDeviceIndex_t nDevice ) = 0; + +}; + +static const char * const IVRProperties_Version = "IVRProperties_001"; + +class CVRPropertyHelpers +{ +public: + CVRPropertyHelpers( IVRProperties * pProperties ) : m_pProperties( pProperties ) {} + + /** Returns a scaler property. If the device index is not valid or the property value type does not match, + * this function will return false. */ + bool GetBoolProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ); + float GetFloatProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ); + int32_t GetInt32Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ); + uint64_t GetUint64Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ); + + /** Returns a single typed property. If the device index is not valid or the property is not a string type this function will + * return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing + * null. Strings will always fit in buffers of k_unMaxPropertyStringSize characters. */ + uint32_t GetProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, VR_OUT_STRING() void *pvBuffer, uint32_t unBufferSize, PropertyTypeTag_t *punTag, ETrackedPropertyError *pError = 0L ); + + + /** Returns a string property. If the device index is not valid or the property is not a string type this function will + * return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing + * null. Strings will always fit in buffers of k_unMaxPropertyStringSize characters. */ + uint32_t GetStringProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize, ETrackedPropertyError *pError = 0L ); + + /** Returns a string property as a std::string. If the device index is not valid or the property is not a string type this function will + * return an empty string. */ + std::string GetStringProperty( vr::PropertyContainerHandle_t ulContainer, vr::ETrackedDeviceProperty prop, vr::ETrackedPropertyError *peError = nullptr ); + + /** Sets a scaler property. The new value will be returned on any subsequent call to get this property in any process. */ + ETrackedPropertyError SetBoolProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, bool bNewValue ); + ETrackedPropertyError SetFloatProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, float fNewValue ); + ETrackedPropertyError SetInt32Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, int32_t nNewValue ); + ETrackedPropertyError SetUint64Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, uint64_t ulNewValue ); + + /** Sets a string property. The new value will be returned on any subsequent call to get this property in any process. */ + ETrackedPropertyError SetStringProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, const char *pchNewValue ); + + /** Sets a single typed property. The new value will be returned on any subsequent call to get this property in any process. */ + ETrackedPropertyError SetProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, void *pvNewValue, uint32_t unNewValueSize, PropertyTypeTag_t unTag ); + + /** Sets the error return value for a property. This value will be returned on all subsequent requests to get the property */ + ETrackedPropertyError SetPropertyError( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError eError ); + + /** Clears any value or error set for the property. */ + ETrackedPropertyError EraseProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop ); + + /* Turns a device index into a property container handle. */ + PropertyContainerHandle_t TrackedDeviceToPropertyContainer( TrackedDeviceIndex_t nDevice ) { return m_pProperties->TrackedDeviceToPropertyContainer( nDevice ); } + +private: + template + T GetPropertyHelper( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError, T bDefault, PropertyTypeTag_t unTypeTag ); + + IVRProperties *m_pProperties; +}; + + +inline uint32_t CVRPropertyHelpers::GetProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, VR_OUT_STRING() void *pvBuffer, uint32_t unBufferSize, PropertyTypeTag_t *punTag, ETrackedPropertyError *pError ) +{ + PropertyRead_t batch; + batch.prop = prop; + batch.pvBuffer = pvBuffer; + batch.unBufferSize = unBufferSize; + + m_pProperties->ReadPropertyBatch( ulContainerHandle, &batch, 1 ); + + if ( pError ) + { + *pError = batch.eError; + } + + if ( punTag ) + { + *punTag = batch.unTag; + } + + return batch.unRequiredBufferSize; +} + + +/** Sets a single typed property. The new value will be returned on any subsequent call to get this property in any process. */ +inline ETrackedPropertyError CVRPropertyHelpers::SetProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, void *pvNewValue, uint32_t unNewValueSize, PropertyTypeTag_t unTag ) +{ + PropertyWrite_t batch; + batch.writeType = PropertyWrite_Set; + batch.prop = prop; + batch.pvBuffer = pvNewValue; + batch.unBufferSize = unNewValueSize; + batch.unTag = unTag; + + m_pProperties->WritePropertyBatch( ulContainerHandle, &batch, 1 ); + + return batch.eError; +} + + +/** Returns a string property. If the device index is not valid or the property is not a string type this function will +* return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing +* null. Strings will always fit in buffers of k_unMaxPropertyStringSize characters. */ +inline uint32_t CVRPropertyHelpers::GetStringProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize, ETrackedPropertyError *pError ) +{ + PropertyTypeTag_t unTag; + ETrackedPropertyError error; + uint32_t unRequiredSize = GetProperty( ulContainerHandle, prop, pchValue, unBufferSize, &unTag, &error ); + if ( unTag != k_unStringPropertyTag && error == TrackedProp_Success ) + { + error = TrackedProp_WrongDataType; + } + + if ( pError ) + { + *pError = error; + } + + if ( error != TrackedProp_Success ) + { + if ( pchValue && unBufferSize ) + { + *pchValue = '\0'; + } + } + + return unRequiredSize; +} + + +/** Returns a string property as a std::string. If the device index is not valid or the property is not a string type this function will +* return an empty string. */ +inline std::string CVRPropertyHelpers::GetStringProperty( vr::PropertyContainerHandle_t ulContainer, vr::ETrackedDeviceProperty prop, vr::ETrackedPropertyError *peError ) +{ + char buf[1024]; + vr::ETrackedPropertyError err; + uint32_t unRequiredBufferLen = GetStringProperty( ulContainer, prop, buf, sizeof(buf), &err ); + + std::string sResult; + + if ( err == TrackedProp_Success ) + { + sResult = buf; + } + else if ( err == TrackedProp_BufferTooSmall ) + { + char *pchBuffer = new char[unRequiredBufferLen]; + unRequiredBufferLen = GetStringProperty( ulContainer, prop, pchBuffer, unRequiredBufferLen, &err ); + sResult = pchBuffer; + delete[] pchBuffer; + } + + if ( peError ) + { + *peError = err; + } + + return sResult; +} + + +/** Sets a string property. The new value will be returned on any subsequent call to get this property in any process. */ +inline ETrackedPropertyError CVRPropertyHelpers::SetStringProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, const char *pchNewValue ) +{ + if ( !pchNewValue ) + return TrackedProp_InvalidOperation; + + // this is strlen without the dependency on string.h + const char *pchCurr = pchNewValue; + while ( *pchCurr ) + { + pchCurr++; + } + + return SetProperty( ulContainerHandle, prop, (void *)pchNewValue, (uint32_t)(pchCurr - pchNewValue) + 1, k_unStringPropertyTag ); +} + + +template +inline T CVRPropertyHelpers::GetPropertyHelper( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError, T bDefault, PropertyTypeTag_t unTypeTag ) +{ + T bValue; + ETrackedPropertyError eError; + PropertyTypeTag_t unReadTag; + GetProperty( ulContainerHandle, prop, &bValue, sizeof( bValue ), &unReadTag, &eError ); + if ( unReadTag != unTypeTag && eError == TrackedProp_Success ) + { + eError = TrackedProp_WrongDataType; + }; + + if ( pError ) + *pError = eError; + if ( eError != TrackedProp_Success ) + { + return bDefault; + } + else + { + return bValue; + } +} + + +inline bool CVRPropertyHelpers::GetBoolProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) +{ + return GetPropertyHelper( ulContainerHandle, prop, pError, false, k_unBoolPropertyTag ); +} + + +inline float CVRPropertyHelpers::GetFloatProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) +{ + return GetPropertyHelper( ulContainerHandle, prop, pError, 0.f, k_unFloatPropertyTag ); +} + +inline int32_t CVRPropertyHelpers::GetInt32Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) +{ + return GetPropertyHelper( ulContainerHandle, prop, pError, 0, k_unInt32PropertyTag ); +} + +inline uint64_t CVRPropertyHelpers::GetUint64Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) +{ + return GetPropertyHelper( ulContainerHandle, prop, pError, 0, k_unUint64PropertyTag ); +} + +inline ETrackedPropertyError CVRPropertyHelpers::SetBoolProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, bool bNewValue ) +{ + return SetProperty( ulContainerHandle, prop, &bNewValue, sizeof( bNewValue ), k_unBoolPropertyTag ); +} + +inline ETrackedPropertyError CVRPropertyHelpers::SetFloatProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, float fNewValue ) +{ + return SetProperty( ulContainerHandle, prop, &fNewValue, sizeof( fNewValue ), k_unFloatPropertyTag ); +} + +inline ETrackedPropertyError CVRPropertyHelpers::SetInt32Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, int32_t nNewValue ) +{ + return SetProperty( ulContainerHandle, prop, &nNewValue, sizeof( nNewValue ), k_unInt32PropertyTag ); +} + +inline ETrackedPropertyError CVRPropertyHelpers::SetUint64Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, uint64_t ulNewValue ) +{ + return SetProperty( ulContainerHandle, prop, &ulNewValue, sizeof( ulNewValue ), k_unUint64PropertyTag ); +} + +/** Sets the error return value for a property. This value will be returned on all subsequent requests to get the property */ +inline ETrackedPropertyError CVRPropertyHelpers::SetPropertyError( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError eError ) +{ + PropertyWrite_t batch; + batch.writeType = PropertyWrite_SetError; + batch.prop = prop; + batch.eSetError = eError; + + m_pProperties->WritePropertyBatch( ulContainerHandle, &batch, 1 ); + + return batch.eError; +} + +/** Clears any value or error set for the property. */ +inline ETrackedPropertyError CVRPropertyHelpers::EraseProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop ) +{ + PropertyWrite_t batch; + batch.writeType = PropertyWrite_Erase; + batch.prop = prop; + + m_pProperties->WritePropertyBatch( ulContainerHandle, &batch, 1 ); + + return batch.eError; + +} + +} + + +// ivrdriverlog.h +namespace vr +{ + +class IVRDriverLog +{ +public: + /** Writes a log message to the log file prefixed with the driver name */ + virtual void Log( const char *pchLogMessage ) = 0; +}; + + +static const char *IVRDriverLog_Version = "IVRDriverLog_001"; + +} +// ivrserverdriverhost.h +namespace vr +{ + +class ITrackedDeviceServerDriver; +struct TrackedDeviceDriverInfo_t; +struct DriverPose_t; + +/** This interface is provided by vrserver to allow the driver to notify +* the system when something changes about a device. These changes must +* not change the serial number or class of the device because those values +* are permanently associated with the device's index. */ +class IVRServerDriverHost +{ +public: + /** Notifies the server that a tracked device has been added. If this function returns true + * the server will call Activate on the device. If it returns false some kind of error + * has occurred and the device will not be activated. */ + virtual bool TrackedDeviceAdded( const char *pchDeviceSerialNumber, ETrackedDeviceClass eDeviceClass, ITrackedDeviceServerDriver *pDriver ) = 0; + + /** Notifies the server that a tracked device's pose has been updated */ + virtual void TrackedDevicePoseUpdated( uint32_t unWhichDevice, const DriverPose_t & newPose, uint32_t unPoseStructSize ) = 0; + + /** Notifies the server that vsync has occurred on the the display attached to the device. This is + * only permitted on devices of the HMD class. */ + virtual void VsyncEvent( double vsyncTimeOffsetSeconds ) = 0; + + /** notifies the server that the button was pressed */ + virtual void TrackedDeviceButtonPressed( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0; + + /** notifies the server that the button was unpressed */ + virtual void TrackedDeviceButtonUnpressed( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0; + + /** notifies the server that the button was pressed */ + virtual void TrackedDeviceButtonTouched( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0; + + /** notifies the server that the button was unpressed */ + virtual void TrackedDeviceButtonUntouched( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0; + + /** notifies the server than a controller axis changed */ + virtual void TrackedDeviceAxisUpdated( uint32_t unWhichDevice, uint32_t unWhichAxis, const VRControllerAxis_t & axisState ) = 0; + + /** Notifies the server that the proximity sensor on the specified device */ + virtual void ProximitySensorState( uint32_t unWhichDevice, bool bProximitySensorTriggered ) = 0; + + /** Sends a vendor specific event (VREvent_VendorSpecific_Reserved_Start..VREvent_VendorSpecific_Reserved_End */ + virtual void VendorSpecificEvent( uint32_t unWhichDevice, vr::EVREventType eventType, const VREvent_Data_t & eventData, double eventTimeOffset ) = 0; + + /** Returns true if SteamVR is exiting */ + virtual bool IsExiting() = 0; + + /** Returns true and fills the event with the next event on the queue if there is one. If there are no events + * this method returns false. uncbVREvent should be the size in bytes of the VREvent_t struct */ + virtual bool PollNextEvent( VREvent_t *pEvent, uint32_t uncbVREvent ) = 0; + + /** Provides access to device poses for drivers. Poses are in their "raw" tracking space which is uniquely + * defined by each driver providing poses for its devices. It is up to clients of this function to correlate + * poses across different drivers. Poses are indexed by their device id, and their associated driver and + * other properties can be looked up via IVRProperties. */ + virtual void GetRawTrackedDevicePoses( float fPredictedSecondsFromNow, TrackedDevicePose_t *pTrackedDevicePoseArray, uint32_t unTrackedDevicePoseArrayCount ) = 0; + + /** Notifies the server that a tracked device's display component transforms have been updated. */ + virtual void TrackedDeviceDisplayTransformUpdated( uint32_t unWhichDevice, HmdMatrix34_t eyeToHeadLeft, HmdMatrix34_t eyeToHeadRight ) = 0; +}; + +static const char *IVRServerDriverHost_Version = "IVRServerDriverHost_004"; + +} + +// ivrhiddenarea.h +namespace vr +{ + +class CVRHiddenAreaHelpers +{ +public: + CVRHiddenAreaHelpers( IVRProperties *pProperties ) : m_pProperties( pProperties ) {} + + /** Stores a hidden area mesh in a property */ + ETrackedPropertyError SetHiddenArea( EVREye eEye, EHiddenAreaMeshType type, HmdVector2_t *pVerts, uint32_t unVertCount ); + + /** retrieves a hidden area mesh from a property. Returns the vert count read out of the property. */ + uint32_t GetHiddenArea( EVREye eEye, EHiddenAreaMeshType type, HmdVector2_t *pVerts, uint32_t unVertCount, ETrackedPropertyError *peError ); + +private: + ETrackedDeviceProperty GetPropertyEnum( EVREye eEye, EHiddenAreaMeshType type ) + { + return (ETrackedDeviceProperty)(Prop_DisplayHiddenArea_Binary_Start + ((int)type * 2) + (int)eEye); + } + + IVRProperties *m_pProperties; +}; + + +inline ETrackedPropertyError CVRHiddenAreaHelpers::SetHiddenArea( EVREye eEye, EHiddenAreaMeshType type, HmdVector2_t *pVerts, uint32_t unVertCount ) +{ + ETrackedDeviceProperty prop = GetPropertyEnum( eEye, type ); + CVRPropertyHelpers propHelpers( m_pProperties ); + return propHelpers.SetProperty( propHelpers.TrackedDeviceToPropertyContainer( k_unTrackedDeviceIndex_Hmd ), prop, pVerts, sizeof( HmdVector2_t ) * unVertCount, k_unHiddenAreaPropertyTag ); +} + + +inline uint32_t CVRHiddenAreaHelpers::GetHiddenArea( EVREye eEye, EHiddenAreaMeshType type, HmdVector2_t *pVerts, uint32_t unVertCount, ETrackedPropertyError *peError ) +{ + ETrackedDeviceProperty prop = GetPropertyEnum( eEye, type ); + CVRPropertyHelpers propHelpers( m_pProperties ); + ETrackedPropertyError propError; + PropertyTypeTag_t unTag; + uint32_t unBytesNeeded = propHelpers.GetProperty( propHelpers.TrackedDeviceToPropertyContainer( k_unTrackedDeviceIndex_Hmd ), prop, pVerts, sizeof( HmdVector2_t )*unVertCount, &unTag, &propError ); + if ( propError == TrackedProp_Success && unTag != k_unHiddenAreaPropertyTag ) + { + propError = TrackedProp_WrongDataType; + unBytesNeeded = 0; + } + + if ( peError ) + { + *peError = propError; + } + + return unBytesNeeded / sizeof( HmdVector2_t ); +} + +} +// ivrwatchdoghost.h +namespace vr +{ + +/** This interface is provided by vrclient to allow the driver to make everything wake up */ +class IVRWatchdogHost +{ +public: + /** Client drivers in watchdog mode should call this when they have received a signal from hardware that should + * cause SteamVR to start */ + virtual void WatchdogWakeUp() = 0; +}; + +static const char *IVRWatchdogHost_Version = "IVRWatchdogHost_001"; + +}; + + + +// ivrvirtualdisplay.h +namespace vr +{ + // ---------------------------------------------------------------------------------------------- + // Purpose: This component is used for drivers that implement a virtual display (e.g. wireless). + // ---------------------------------------------------------------------------------------------- + class IVRVirtualDisplay + { + public: + + /** Submits final backbuffer for display. */ + virtual void Present( vr::SharedTextureHandle_t backbufferTextureHandle ) = 0; + + /** Block until the last presented buffer start scanning out. */ + virtual void WaitForPresent() = 0; + + /** Provides timing data for synchronizing with display. */ + virtual bool GetTimeSinceLastVsync( float *pfSecondsSinceLastVsync, uint64_t *pulFrameCounter ) = 0; + }; + + static const char *IVRVirtualDisplay_Version = "IVRVirtualDisplay_001"; + + /** Returns the current IVRVirtualDisplay pointer or NULL the interface could not be found. */ + VR_INTERFACE vr::IVRVirtualDisplay *VR_CALLTYPE VRVirtualDisplay(); +} + + +// ivrresources.h +namespace vr +{ + +class IVRResources +{ +public: + + // ------------------------------------ + // Shared Resource Methods + // ------------------------------------ + + /** Loads the specified resource into the provided buffer if large enough. + * Returns the size in bytes of the buffer required to hold the specified resource. */ + virtual uint32_t LoadSharedResource( const char *pchResourceName, char *pchBuffer, uint32_t unBufferLen ) = 0; + + /** Provides the full path to the specified resource. Resource names can include named directories for + * drivers and other things, and this resolves all of those and returns the actual physical path. + * pchResourceTypeDirectory is the subdirectory of resources to look in. */ + virtual uint32_t GetResourceFullPath( const char *pchResourceName, const char *pchResourceTypeDirectory, char *pchPathBuffer, uint32_t unBufferLen ) = 0; +}; + +static const char * const IVRResources_Version = "IVRResources_001"; + + +} +// ivrdrivermanager.h +namespace vr +{ + +class IVRDriverManager +{ +public: + virtual uint32_t GetDriverCount() const = 0; + + /** Returns the length of the number of bytes necessary to hold this string including the trailing null. */ + virtual uint32_t GetDriverName( vr::DriverId_t nDriver, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize ) = 0; +}; + +static const char * const IVRDriverManager_Version = "IVRDriverManager_001"; + +} // namespace vr + + + + + +namespace vr +{ + static const char * const k_InterfaceVersions[] = + { + IVRSettings_Version, + ITrackedDeviceServerDriver_Version, + IVRDisplayComponent_Version, + IVRDriverDirectModeComponent_Version, + IVRControllerComponent_Version, + IVRCameraComponent_Version, + IServerTrackedDeviceProvider_Version, + IVRWatchdogProvider_Version, + IVRVirtualDisplay_Version, + IVRDriverManager_Version, + IVRResources_Version, + nullptr + }; + + inline IVRDriverContext *&VRDriverContext() + { + static IVRDriverContext *pHost; + return pHost; + } + + class COpenVRDriverContext + { + public: + COpenVRDriverContext() : m_propertyHelpers(nullptr), m_hiddenAreaHelpers(nullptr) { Clear(); } + void Clear(); + + EVRInitError InitServer(); + EVRInitError InitWatchdog(); + + IVRSettings *VRSettings() + { + if ( m_pVRSettings == nullptr ) + { + EVRInitError eError; + m_pVRSettings = (IVRSettings *)VRDriverContext()->GetGenericInterface( IVRSettings_Version, &eError ); + } + return m_pVRSettings; + } + + IVRProperties *VRPropertiesRaw() + { + if ( m_pVRProperties == nullptr ) + { + EVRInitError eError; + m_pVRProperties = (IVRProperties *)VRDriverContext()->GetGenericInterface( IVRProperties_Version, &eError ); + m_propertyHelpers = CVRPropertyHelpers( m_pVRProperties ); + m_hiddenAreaHelpers = CVRHiddenAreaHelpers( m_pVRProperties ); + } + return m_pVRProperties; + } + + CVRPropertyHelpers *VRProperties() + { + VRPropertiesRaw(); + return &m_propertyHelpers; + } + + CVRHiddenAreaHelpers *VRHiddenArea() + { + VRPropertiesRaw(); + return &m_hiddenAreaHelpers; + } + + IVRServerDriverHost *VRServerDriverHost() + { + if ( m_pVRServerDriverHost == nullptr ) + { + EVRInitError eError; + m_pVRServerDriverHost = (IVRServerDriverHost *)VRDriverContext()->GetGenericInterface( IVRServerDriverHost_Version, &eError ); + } + return m_pVRServerDriverHost; + } + + IVRWatchdogHost *VRWatchdogHost() + { + if ( m_pVRWatchdogHost == nullptr ) + { + EVRInitError eError; + m_pVRWatchdogHost = (IVRWatchdogHost *)VRDriverContext()->GetGenericInterface( IVRWatchdogHost_Version, &eError ); + } + return m_pVRWatchdogHost; + } + + IVRDriverLog *VRDriverLog() + { + if ( m_pVRDriverLog == nullptr ) + { + EVRInitError eError; + m_pVRDriverLog = (IVRDriverLog *)VRDriverContext()->GetGenericInterface( IVRDriverLog_Version, &eError ); + } + return m_pVRDriverLog; + } + + DriverHandle_t VR_CALLTYPE VRDriverHandle() + { + return VRDriverContext()->GetDriverHandle(); + } + + IVRDriverManager *VRDriverManager() + { + if ( !m_pVRDriverManager ) + { + EVRInitError eError; + m_pVRDriverManager = (IVRDriverManager *)VRDriverContext()->GetGenericInterface( IVRDriverManager_Version, &eError ); + } + return m_pVRDriverManager; + } + + IVRResources *VRResources() + { + if ( !m_pVRResources ) + { + EVRInitError eError; + m_pVRResources = (IVRResources *)VRDriverContext()->GetGenericInterface( IVRResources_Version, &eError ); + } + return m_pVRResources; + } + + private: + CVRPropertyHelpers m_propertyHelpers; + CVRHiddenAreaHelpers m_hiddenAreaHelpers; + + IVRSettings *m_pVRSettings; + IVRProperties *m_pVRProperties; + IVRServerDriverHost *m_pVRServerDriverHost; + IVRWatchdogHost *m_pVRWatchdogHost; + IVRDriverLog *m_pVRDriverLog; + IVRDriverManager *m_pVRDriverManager; + IVRResources *m_pVRResources; + }; + + inline COpenVRDriverContext &OpenVRInternal_ModuleServerDriverContext() + { + static void *ctx[sizeof( COpenVRDriverContext ) / sizeof( void * )]; + return *(COpenVRDriverContext *)ctx; // bypass zero-init constructor + } + + inline IVRSettings *VR_CALLTYPE VRSettings() { return OpenVRInternal_ModuleServerDriverContext().VRSettings(); } + inline IVRProperties *VR_CALLTYPE VRPropertiesRaw() { return OpenVRInternal_ModuleServerDriverContext().VRPropertiesRaw(); } + inline CVRPropertyHelpers *VR_CALLTYPE VRProperties() { return OpenVRInternal_ModuleServerDriverContext().VRProperties(); } + inline CVRHiddenAreaHelpers *VR_CALLTYPE VRHiddenArea() { return OpenVRInternal_ModuleServerDriverContext().VRHiddenArea(); } + inline IVRDriverLog *VR_CALLTYPE VRDriverLog() { return OpenVRInternal_ModuleServerDriverContext().VRDriverLog(); } + inline IVRServerDriverHost *VR_CALLTYPE VRServerDriverHost() { return OpenVRInternal_ModuleServerDriverContext().VRServerDriverHost(); } + inline IVRWatchdogHost *VR_CALLTYPE VRWatchdogHost() { return OpenVRInternal_ModuleServerDriverContext().VRWatchdogHost(); } + inline DriverHandle_t VR_CALLTYPE VRDriverHandle() { return OpenVRInternal_ModuleServerDriverContext().VRDriverHandle(); } + inline IVRDriverManager *VR_CALLTYPE VRDriverManager() { return OpenVRInternal_ModuleServerDriverContext().VRDriverManager(); } + inline IVRResources *VR_CALLTYPE VRResources() { return OpenVRInternal_ModuleServerDriverContext().VRResources(); } + + inline void COpenVRDriverContext::Clear() + { + m_pVRSettings = nullptr; + m_pVRProperties = nullptr; + m_pVRServerDriverHost = nullptr; + m_pVRDriverLog = nullptr; + m_pVRWatchdogHost = nullptr; + m_pVRDriverManager = nullptr; + m_pVRResources = nullptr; + } + + inline EVRInitError COpenVRDriverContext::InitServer() + { + Clear(); + if ( !VRServerDriverHost() + || !VRSettings() + || !VRProperties() + || !VRDriverLog() + || !VRDriverManager() + || !VRResources() ) + return VRInitError_Init_InterfaceNotFound; + return VRInitError_None; + } + + inline EVRInitError COpenVRDriverContext::InitWatchdog() + { + Clear(); + if ( !VRWatchdogHost() + || !VRSettings() + || !VRDriverLog() ) + return VRInitError_Init_InterfaceNotFound; + return VRInitError_None; + } + + inline EVRInitError InitServerDriverContext( IVRDriverContext *pContext ) + { + VRDriverContext() = pContext; + return OpenVRInternal_ModuleServerDriverContext().InitServer(); + } + + inline EVRInitError InitWatchdogDriverContext( IVRDriverContext *pContext ) + { + VRDriverContext() = pContext; + return OpenVRInternal_ModuleServerDriverContext().InitWatchdog(); + } + + inline void CleanupDriverContext() + { + VRDriverContext() = nullptr; + OpenVRInternal_ModuleServerDriverContext().Clear(); + } + + #define VR_INIT_SERVER_DRIVER_CONTEXT( pContext ) \ + { \ + vr::EVRInitError eError = vr::InitServerDriverContext( pContext ); \ + if( eError != vr::VRInitError_None ) \ + return eError; \ + } + + #define VR_CLEANUP_SERVER_DRIVER_CONTEXT() \ + vr::CleanupDriverContext(); + + #define VR_INIT_WATCHDOG_DRIVER_CONTEXT( pContext ) \ + { \ + vr::EVRInitError eError = vr::InitWatchdogDriverContext( pContext ); \ + if( eError != vr::VRInitError_None ) \ + return eError; \ + } + + #define VR_CLEANUP_WATCHDOG_DRIVER_CONTEXT() \ + vr::CleanupDriverContext(); +} +// End + +#endif // _OPENVR_DRIVER_API + + diff --git a/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/OpenVR b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/OpenVR new file mode 100755 index 0000000000000000000000000000000000000000..1609501c77fcd0497c6c8d0c2c56a1db2a4b547d GIT binary patch literal 1318196 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%0AV;OAi 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

vHyJ@`%}18k7T>#zvUx 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 literal 0 HcmV?d00001 diff --git a/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Resources/Info.plist b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Resources/Info.plist new file mode 100644 index 000000000..50ff90a2c --- /dev/null +++ b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,18 @@ + + + + + CFBundleIdentifier + com.valvesoftware.OpenVR.framework + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + OpenVR + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1.0 + + diff --git a/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Headers/openvr.h b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Headers/openvr.h new file mode 100644 index 000000000..79abf062a --- /dev/null +++ b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Headers/openvr.h @@ -0,0 +1,3721 @@ +#pragma once + +// openvr.h +//========= Copyright Valve Corporation ============// +// Dynamically generated file. Do not modify this file directly. + +#ifndef _OPENVR_API +#define _OPENVR_API + +#include + + + +// vrtypes.h +#ifndef _INCLUDE_VRTYPES_H +#define _INCLUDE_VRTYPES_H + +// Forward declarations to avoid requiring vulkan.h +struct VkDevice_T; +struct VkPhysicalDevice_T; +struct VkInstance_T; +struct VkQueue_T; + +// Forward declarations to avoid requiring d3d12.h +struct ID3D12Resource; +struct ID3D12CommandQueue; + +namespace vr +{ +#pragma pack( push, 8 ) + +typedef void* glSharedTextureHandle_t; +typedef int32_t glInt_t; +typedef uint32_t glUInt_t; + +// right-handed system +// +y is up +// +x is to the right +// -z is going away from you +// Distance unit is meters +struct HmdMatrix34_t +{ + float m[3][4]; +}; + +struct HmdMatrix44_t +{ + float m[4][4]; +}; + +struct HmdVector3_t +{ + float v[3]; +}; + +struct HmdVector4_t +{ + float v[4]; +}; + +struct HmdVector3d_t +{ + double v[3]; +}; + +struct HmdVector2_t +{ + float v[2]; +}; + +struct HmdQuaternion_t +{ + double w, x, y, z; +}; + +struct HmdColor_t +{ + float r, g, b, a; +}; + +struct HmdQuad_t +{ + HmdVector3_t vCorners[ 4 ]; +}; + +struct HmdRect2_t +{ + HmdVector2_t vTopLeft; + HmdVector2_t vBottomRight; +}; + +/** Used to return the post-distortion UVs for each color channel. +* UVs range from 0 to 1 with 0,0 in the upper left corner of the +* source render target. The 0,0 to 1,1 range covers a single eye. */ +struct DistortionCoordinates_t +{ + float rfRed[2]; + float rfGreen[2]; + float rfBlue[2]; +}; + +enum EVREye +{ + Eye_Left = 0, + Eye_Right = 1 +}; + +enum ETextureType +{ + TextureType_DirectX = 0, // Handle is an ID3D11Texture + TextureType_OpenGL = 1, // Handle is an OpenGL texture name or an OpenGL render buffer name, depending on submit flags + TextureType_Vulkan = 2, // Handle is a pointer to a VRVulkanTextureData_t structure + TextureType_IOSurface = 3, // Handle is a macOS cross-process-sharable IOSurfaceRef + TextureType_DirectX12 = 4, // Handle is a pointer to a D3D12TextureData_t structure +}; + +enum EColorSpace +{ + ColorSpace_Auto = 0, // Assumes 'gamma' for 8-bit per component formats, otherwise 'linear'. This mirrors the DXGI formats which have _SRGB variants. + ColorSpace_Gamma = 1, // Texture data can be displayed directly on the display without any conversion (a.k.a. display native format). + ColorSpace_Linear = 2, // Same as gamma but has been converted to a linear representation using DXGI's sRGB conversion algorithm. +}; + +struct Texture_t +{ + void* handle; // See ETextureType definition above + ETextureType eType; + EColorSpace eColorSpace; +}; + +// Handle to a shared texture (HANDLE on Windows obtained using OpenSharedResource). +typedef uint64_t SharedTextureHandle_t; +#define INVALID_SHARED_TEXTURE_HANDLE ((vr::SharedTextureHandle_t)0) + +enum ETrackingResult +{ + TrackingResult_Uninitialized = 1, + + TrackingResult_Calibrating_InProgress = 100, + TrackingResult_Calibrating_OutOfRange = 101, + + TrackingResult_Running_OK = 200, + TrackingResult_Running_OutOfRange = 201, +}; + +typedef uint32_t DriverId_t; +static const uint32_t k_nDriverNone = 0xFFFFFFFF; + +static const uint32_t k_unMaxDriverDebugResponseSize = 32768; + +/** Used to pass device IDs to API calls */ +typedef uint32_t TrackedDeviceIndex_t; +static const uint32_t k_unTrackedDeviceIndex_Hmd = 0; +static const uint32_t k_unMaxTrackedDeviceCount = 16; +static const uint32_t k_unTrackedDeviceIndexOther = 0xFFFFFFFE; +static const uint32_t k_unTrackedDeviceIndexInvalid = 0xFFFFFFFF; + +/** Describes what kind of object is being tracked at a given ID */ +enum ETrackedDeviceClass +{ + TrackedDeviceClass_Invalid = 0, // the ID was not valid. + TrackedDeviceClass_HMD = 1, // Head-Mounted Displays + TrackedDeviceClass_Controller = 2, // Tracked controllers + TrackedDeviceClass_GenericTracker = 3, // Generic trackers, similar to controllers + TrackedDeviceClass_TrackingReference = 4, // Camera and base stations that serve as tracking reference points + TrackedDeviceClass_DisplayRedirect = 5, // Accessories that aren't necessarily tracked themselves, but may redirect video output from other tracked devices +}; + + +/** Describes what specific role associated with a tracked device */ +enum ETrackedControllerRole +{ + TrackedControllerRole_Invalid = 0, // Invalid value for controller type + TrackedControllerRole_LeftHand = 1, // Tracked device associated with the left hand + TrackedControllerRole_RightHand = 2, // Tracked device associated with the right hand +}; + + +/** describes a single pose for a tracked object */ +struct TrackedDevicePose_t +{ + HmdMatrix34_t mDeviceToAbsoluteTracking; + HmdVector3_t vVelocity; // velocity in tracker space in m/s + HmdVector3_t vAngularVelocity; // angular velocity in radians/s (?) + ETrackingResult eTrackingResult; + bool bPoseIsValid; + + // This indicates that there is a device connected for this spot in the pose array. + // It could go from true to false if the user unplugs the device. + bool bDeviceIsConnected; +}; + +/** Identifies which style of tracking origin the application wants to use +* for the poses it is requesting */ +enum ETrackingUniverseOrigin +{ + TrackingUniverseSeated = 0, // Poses are provided relative to the seated zero pose + TrackingUniverseStanding = 1, // Poses are provided relative to the safe bounds configured by the user + 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. +}; + +// Refers to a single container of properties +typedef uint64_t PropertyContainerHandle_t; +typedef uint32_t PropertyTypeTag_t; + +static const PropertyContainerHandle_t k_ulInvalidPropertyContainer = 0; +static const PropertyTypeTag_t k_unInvalidPropertyTag = 0; + +// Use these tags to set/get common types as struct properties +static const PropertyTypeTag_t k_unFloatPropertyTag = 1; +static const PropertyTypeTag_t k_unInt32PropertyTag = 2; +static const PropertyTypeTag_t k_unUint64PropertyTag = 3; +static const PropertyTypeTag_t k_unBoolPropertyTag = 4; +static const PropertyTypeTag_t k_unStringPropertyTag = 5; + +static const PropertyTypeTag_t k_unHmdMatrix34PropertyTag = 20; +static const PropertyTypeTag_t k_unHmdMatrix44PropertyTag = 21; +static const PropertyTypeTag_t k_unHmdVector3PropertyTag = 22; +static const PropertyTypeTag_t k_unHmdVector4PropertyTag = 23; + +static const PropertyTypeTag_t k_unHiddenAreaPropertyTag = 30; + +static const PropertyTypeTag_t k_unOpenVRInternalReserved_Start = 1000; +static const PropertyTypeTag_t k_unOpenVRInternalReserved_End = 10000; + + +/** Each entry in this enum represents a property that can be retrieved about a +* tracked device. Many fields are only valid for one ETrackedDeviceClass. */ +enum ETrackedDeviceProperty +{ + Prop_Invalid = 0, + + // general properties that apply to all device classes + Prop_TrackingSystemName_String = 1000, + Prop_ModelNumber_String = 1001, + Prop_SerialNumber_String = 1002, + Prop_RenderModelName_String = 1003, + Prop_WillDriftInYaw_Bool = 1004, + Prop_ManufacturerName_String = 1005, + Prop_TrackingFirmwareVersion_String = 1006, + Prop_HardwareRevision_String = 1007, + Prop_AllWirelessDongleDescriptions_String = 1008, + Prop_ConnectedWirelessDongle_String = 1009, + Prop_DeviceIsWireless_Bool = 1010, + Prop_DeviceIsCharging_Bool = 1011, + Prop_DeviceBatteryPercentage_Float = 1012, // 0 is empty, 1 is full + Prop_StatusDisplayTransform_Matrix34 = 1013, + Prop_Firmware_UpdateAvailable_Bool = 1014, + Prop_Firmware_ManualUpdate_Bool = 1015, + Prop_Firmware_ManualUpdateURL_String = 1016, + Prop_HardwareRevision_Uint64 = 1017, + Prop_FirmwareVersion_Uint64 = 1018, + Prop_FPGAVersion_Uint64 = 1019, + Prop_VRCVersion_Uint64 = 1020, + Prop_RadioVersion_Uint64 = 1021, + Prop_DongleVersion_Uint64 = 1022, + Prop_BlockServerShutdown_Bool = 1023, + Prop_CanUnifyCoordinateSystemWithHmd_Bool = 1024, + Prop_ContainsProximitySensor_Bool = 1025, + Prop_DeviceProvidesBatteryStatus_Bool = 1026, + Prop_DeviceCanPowerOff_Bool = 1027, + Prop_Firmware_ProgrammingTarget_String = 1028, + Prop_DeviceClass_Int32 = 1029, + Prop_HasCamera_Bool = 1030, + Prop_DriverVersion_String = 1031, + Prop_Firmware_ForceUpdateRequired_Bool = 1032, + Prop_ViveSystemButtonFixRequired_Bool = 1033, + Prop_ParentDriver_Uint64 = 1034, + Prop_ResourceRoot_String = 1035, + + // Properties that are unique to TrackedDeviceClass_HMD + Prop_ReportsTimeSinceVSync_Bool = 2000, + Prop_SecondsFromVsyncToPhotons_Float = 2001, + Prop_DisplayFrequency_Float = 2002, + Prop_UserIpdMeters_Float = 2003, + Prop_CurrentUniverseId_Uint64 = 2004, + Prop_PreviousUniverseId_Uint64 = 2005, + Prop_DisplayFirmwareVersion_Uint64 = 2006, + Prop_IsOnDesktop_Bool = 2007, + Prop_DisplayMCType_Int32 = 2008, + Prop_DisplayMCOffset_Float = 2009, + Prop_DisplayMCScale_Float = 2010, + Prop_EdidVendorID_Int32 = 2011, + Prop_DisplayMCImageLeft_String = 2012, + Prop_DisplayMCImageRight_String = 2013, + Prop_DisplayGCBlackClamp_Float = 2014, + Prop_EdidProductID_Int32 = 2015, + Prop_CameraToHeadTransform_Matrix34 = 2016, + Prop_DisplayGCType_Int32 = 2017, + Prop_DisplayGCOffset_Float = 2018, + Prop_DisplayGCScale_Float = 2019, + Prop_DisplayGCPrescale_Float = 2020, + Prop_DisplayGCImage_String = 2021, + Prop_LensCenterLeftU_Float = 2022, + Prop_LensCenterLeftV_Float = 2023, + Prop_LensCenterRightU_Float = 2024, + Prop_LensCenterRightV_Float = 2025, + Prop_UserHeadToEyeDepthMeters_Float = 2026, + Prop_CameraFirmwareVersion_Uint64 = 2027, + Prop_CameraFirmwareDescription_String = 2028, + Prop_DisplayFPGAVersion_Uint64 = 2029, + Prop_DisplayBootloaderVersion_Uint64 = 2030, + Prop_DisplayHardwareVersion_Uint64 = 2031, + Prop_AudioFirmwareVersion_Uint64 = 2032, + Prop_CameraCompatibilityMode_Int32 = 2033, + Prop_ScreenshotHorizontalFieldOfViewDegrees_Float = 2034, + Prop_ScreenshotVerticalFieldOfViewDegrees_Float = 2035, + Prop_DisplaySuppressed_Bool = 2036, + Prop_DisplayAllowNightMode_Bool = 2037, + Prop_DisplayMCImageWidth_Int32 = 2038, + Prop_DisplayMCImageHeight_Int32 = 2039, + Prop_DisplayMCImageNumChannels_Int32 = 2040, + Prop_DisplayMCImageData_Binary = 2041, + Prop_SecondsFromPhotonsToVblank_Float = 2042, + Prop_DriverDirectModeSendsVsyncEvents_Bool = 2043, + Prop_DisplayDebugMode_Bool = 2044, + Prop_GraphicsAdapterLuid_Uint64 = 2045, + + // Properties that are unique to TrackedDeviceClass_Controller + Prop_AttachedDeviceId_String = 3000, + Prop_SupportedButtons_Uint64 = 3001, + Prop_Axis0Type_Int32 = 3002, // Return value is of type EVRControllerAxisType + Prop_Axis1Type_Int32 = 3003, // Return value is of type EVRControllerAxisType + Prop_Axis2Type_Int32 = 3004, // Return value is of type EVRControllerAxisType + Prop_Axis3Type_Int32 = 3005, // Return value is of type EVRControllerAxisType + Prop_Axis4Type_Int32 = 3006, // Return value is of type EVRControllerAxisType + Prop_ControllerRoleHint_Int32 = 3007, // Return value is of type ETrackedControllerRole + + // Properties that are unique to TrackedDeviceClass_TrackingReference + Prop_FieldOfViewLeftDegrees_Float = 4000, + Prop_FieldOfViewRightDegrees_Float = 4001, + Prop_FieldOfViewTopDegrees_Float = 4002, + Prop_FieldOfViewBottomDegrees_Float = 4003, + Prop_TrackingRangeMinimumMeters_Float = 4004, + Prop_TrackingRangeMaximumMeters_Float = 4005, + Prop_ModeLabel_String = 4006, + + // Properties that are used for user interface like icons names + Prop_IconPathName_String = 5000, // DEPRECATED. Value not referenced. Now expected to be part of icon path properties. + Prop_NamedIconPathDeviceOff_String = 5001, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceSearching_String = 5002, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceSearchingAlert_String = 5003, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceReady_String = 5004, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceReadyAlert_String = 5005, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceNotReady_String = 5006, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceStandby_String = 5007, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceAlertLow_String = 5008, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + + // Properties that are used by helpers, but are opaque to applications + Prop_DisplayHiddenArea_Binary_Start = 5100, + Prop_DisplayHiddenArea_Binary_End = 5150, + + // Properties that are unique to drivers + Prop_UserConfigPath_String = 6000, + Prop_InstallPath_String = 6001, + Prop_HasDisplayComponent_Bool = 6002, + Prop_HasControllerComponent_Bool = 6003, + Prop_HasCameraComponent_Bool = 6004, + Prop_HasDriverDirectModeComponent_Bool = 6005, + Prop_HasVirtualDisplayComponent_Bool = 6006, + + // Vendors are free to expose private debug data in this reserved region + Prop_VendorSpecific_Reserved_Start = 10000, + Prop_VendorSpecific_Reserved_End = 10999, +}; + +/** No string property will ever be longer than this length */ +static const uint32_t k_unMaxPropertyStringSize = 32 * 1024; + +/** Used to return errors that occur when reading properties. */ +enum ETrackedPropertyError +{ + TrackedProp_Success = 0, + TrackedProp_WrongDataType = 1, + TrackedProp_WrongDeviceClass = 2, + TrackedProp_BufferTooSmall = 3, + TrackedProp_UnknownProperty = 4, // Driver has not set the property (and may not ever). + TrackedProp_InvalidDevice = 5, + TrackedProp_CouldNotContactServer = 6, + TrackedProp_ValueNotProvidedByDevice = 7, + TrackedProp_StringExceedsMaximumLength = 8, + TrackedProp_NotYetAvailable = 9, // The property value isn't known yet, but is expected soon. Call again later. + TrackedProp_PermissionDenied = 10, + TrackedProp_InvalidOperation = 11, +}; + +/** Allows the application to control what part of the provided texture will be used in the +* frame buffer. */ +struct VRTextureBounds_t +{ + float uMin, vMin; + float uMax, vMax; +}; + + +/** Allows the application to control how scene textures are used by the compositor when calling Submit. */ +enum EVRSubmitFlags +{ + // Simple render path. App submits rendered left and right eye images with no lens distortion correction applied. + Submit_Default = 0x00, + + // App submits final left and right eye images with lens distortion already applied (lens distortion makes the images appear + // barrel distorted with chromatic aberration correction applied). The app would have used the data returned by + // vr::IVRSystem::ComputeDistortion() to apply the correct distortion to the rendered images before calling Submit(). + Submit_LensDistortionAlreadyApplied = 0x01, + + // If the texture pointer passed in is actually a renderbuffer (e.g. for MSAA in OpenGL) then set this flag. + Submit_GlRenderBuffer = 0x02, + + // Do not use + Submit_Reserved = 0x04, +}; + +/** Data required for passing Vulkan textures to IVRCompositor::Submit. +* Be sure to call OpenVR_Shutdown before destroying these resources. */ +struct VRVulkanTextureData_t +{ + uint64_t m_nImage; // VkImage + VkDevice_T *m_pDevice; + VkPhysicalDevice_T *m_pPhysicalDevice; + VkInstance_T *m_pInstance; + VkQueue_T *m_pQueue; + uint32_t m_nQueueFamilyIndex; + uint32_t m_nWidth, m_nHeight, m_nFormat, m_nSampleCount; +}; + +/** Data required for passing D3D12 textures to IVRCompositor::Submit. +* Be sure to call OpenVR_Shutdown before destroying these resources. */ +struct D3D12TextureData_t +{ + ID3D12Resource *m_pResource; + ID3D12CommandQueue *m_pCommandQueue; + uint32_t m_nNodeMask; +}; + +/** Status of the overall system or tracked objects */ +enum EVRState +{ + VRState_Undefined = -1, + VRState_Off = 0, + VRState_Searching = 1, + VRState_Searching_Alert = 2, + VRState_Ready = 3, + VRState_Ready_Alert = 4, + VRState_NotReady = 5, + VRState_Standby = 6, + VRState_Ready_Alert_Low = 7, +}; + +/** The types of events that could be posted (and what the parameters mean for each event type) */ +enum EVREventType +{ + VREvent_None = 0, + + VREvent_TrackedDeviceActivated = 100, + VREvent_TrackedDeviceDeactivated = 101, + VREvent_TrackedDeviceUpdated = 102, + VREvent_TrackedDeviceUserInteractionStarted = 103, + VREvent_TrackedDeviceUserInteractionEnded = 104, + VREvent_IpdChanged = 105, + VREvent_EnterStandbyMode = 106, + VREvent_LeaveStandbyMode = 107, + VREvent_TrackedDeviceRoleChanged = 108, + VREvent_WatchdogWakeUpRequested = 109, + VREvent_LensDistortionChanged = 110, + VREvent_PropertyChanged = 111, + + VREvent_ButtonPress = 200, // data is controller + VREvent_ButtonUnpress = 201, // data is controller + VREvent_ButtonTouch = 202, // data is controller + VREvent_ButtonUntouch = 203, // data is controller + + VREvent_MouseMove = 300, // data is mouse + VREvent_MouseButtonDown = 301, // data is mouse + VREvent_MouseButtonUp = 302, // data is mouse + VREvent_FocusEnter = 303, // data is overlay + VREvent_FocusLeave = 304, // data is overlay + VREvent_Scroll = 305, // data is mouse + VREvent_TouchPadMove = 306, // data is mouse + VREvent_OverlayFocusChanged = 307, // data is overlay, global event + + VREvent_InputFocusCaptured = 400, // data is process DEPRECATED + VREvent_InputFocusReleased = 401, // data is process DEPRECATED + VREvent_SceneFocusLost = 402, // data is process + VREvent_SceneFocusGained = 403, // data is process + VREvent_SceneApplicationChanged = 404, // data is process - The App actually drawing the scene changed (usually to or from the compositor) + VREvent_SceneFocusChanged = 405, // data is process - New app got access to draw the scene + VREvent_InputFocusChanged = 406, // data is process + VREvent_SceneApplicationSecondaryRenderingStarted = 407, // data is process + + VREvent_HideRenderModels = 410, // Sent to the scene application to request hiding render models temporarily + VREvent_ShowRenderModels = 411, // Sent to the scene application to request restoring render model visibility + + VREvent_OverlayShown = 500, + VREvent_OverlayHidden = 501, + VREvent_DashboardActivated = 502, + VREvent_DashboardDeactivated = 503, + VREvent_DashboardThumbSelected = 504, // Sent to the overlay manager - data is overlay + VREvent_DashboardRequested = 505, // Sent to the overlay manager - data is overlay + VREvent_ResetDashboard = 506, // Send to the overlay manager + VREvent_RenderToast = 507, // Send to the dashboard to render a toast - data is the notification ID + VREvent_ImageLoaded = 508, // Sent to overlays when a SetOverlayRaw or SetOverlayFromFile call finishes loading + VREvent_ShowKeyboard = 509, // Sent to keyboard renderer in the dashboard to invoke it + VREvent_HideKeyboard = 510, // Sent to keyboard renderer in the dashboard to hide it + VREvent_OverlayGamepadFocusGained = 511, // Sent to an overlay when IVROverlay::SetFocusOverlay is called on it + VREvent_OverlayGamepadFocusLost = 512, // Send to an overlay when it previously had focus and IVROverlay::SetFocusOverlay is called on something else + VREvent_OverlaySharedTextureChanged = 513, + VREvent_DashboardGuideButtonDown = 514, + VREvent_DashboardGuideButtonUp = 515, + VREvent_ScreenshotTriggered = 516, // Screenshot button combo was pressed, Dashboard should request a screenshot + VREvent_ImageFailed = 517, // Sent to overlays when a SetOverlayRaw or SetOverlayfromFail fails to load + VREvent_DashboardOverlayCreated = 518, + + // Screenshot API + VREvent_RequestScreenshot = 520, // Sent by vrclient application to compositor to take a screenshot + VREvent_ScreenshotTaken = 521, // Sent by compositor to the application that the screenshot has been taken + VREvent_ScreenshotFailed = 522, // Sent by compositor to the application that the screenshot failed to be taken + VREvent_SubmitScreenshotToDashboard = 523, // Sent by compositor to the dashboard that a completed screenshot was submitted + VREvent_ScreenshotProgressToDashboard = 524, // Sent by compositor to the dashboard that a completed screenshot was submitted + + VREvent_PrimaryDashboardDeviceChanged = 525, + + VREvent_Notification_Shown = 600, + VREvent_Notification_Hidden = 601, + VREvent_Notification_BeginInteraction = 602, + VREvent_Notification_Destroyed = 603, + + VREvent_Quit = 700, // data is process + VREvent_ProcessQuit = 701, // data is process + VREvent_QuitAborted_UserPrompt = 702, // data is process + VREvent_QuitAcknowledged = 703, // data is process + VREvent_DriverRequestedQuit = 704, // The driver has requested that SteamVR shut down + + VREvent_ChaperoneDataHasChanged = 800, + VREvent_ChaperoneUniverseHasChanged = 801, + VREvent_ChaperoneTempDataHasChanged = 802, + VREvent_ChaperoneSettingsHaveChanged = 803, + VREvent_SeatedZeroPoseReset = 804, + + VREvent_AudioSettingsHaveChanged = 820, + + VREvent_BackgroundSettingHasChanged = 850, + VREvent_CameraSettingsHaveChanged = 851, + VREvent_ReprojectionSettingHasChanged = 852, + VREvent_ModelSkinSettingsHaveChanged = 853, + VREvent_EnvironmentSettingsHaveChanged = 854, + VREvent_PowerSettingsHaveChanged = 855, + VREvent_EnableHomeAppSettingsHaveChanged = 856, + + VREvent_StatusUpdate = 900, + + VREvent_MCImageUpdated = 1000, + + VREvent_FirmwareUpdateStarted = 1100, + VREvent_FirmwareUpdateFinished = 1101, + + VREvent_KeyboardClosed = 1200, + VREvent_KeyboardCharInput = 1201, + VREvent_KeyboardDone = 1202, // Sent when DONE button clicked on keyboard + + VREvent_ApplicationTransitionStarted = 1300, + VREvent_ApplicationTransitionAborted = 1301, + VREvent_ApplicationTransitionNewAppStarted = 1302, + VREvent_ApplicationListUpdated = 1303, + VREvent_ApplicationMimeTypeLoad = 1304, + VREvent_ApplicationTransitionNewAppLaunchComplete = 1305, + VREvent_ProcessConnected = 1306, + VREvent_ProcessDisconnected = 1307, + + VREvent_Compositor_MirrorWindowShown = 1400, + VREvent_Compositor_MirrorWindowHidden = 1401, + VREvent_Compositor_ChaperoneBoundsShown = 1410, + VREvent_Compositor_ChaperoneBoundsHidden = 1411, + + VREvent_TrackedCamera_StartVideoStream = 1500, + VREvent_TrackedCamera_StopVideoStream = 1501, + VREvent_TrackedCamera_PauseVideoStream = 1502, + VREvent_TrackedCamera_ResumeVideoStream = 1503, + VREvent_TrackedCamera_EditingSurface = 1550, + + VREvent_PerformanceTest_EnableCapture = 1600, + VREvent_PerformanceTest_DisableCapture = 1601, + VREvent_PerformanceTest_FidelityLevel = 1602, + + VREvent_MessageOverlay_Closed = 1650, + + // Vendors are free to expose private events in this reserved region + VREvent_VendorSpecific_Reserved_Start = 10000, + VREvent_VendorSpecific_Reserved_End = 19999, +}; + + +/** Level of Hmd activity */ +// UserInteraction_Timeout means the device is in the process of timing out. +// InUse = ( k_EDeviceActivityLevel_UserInteraction || k_EDeviceActivityLevel_UserInteraction_Timeout ) +// VREvent_TrackedDeviceUserInteractionStarted fires when the devices transitions from Standby -> UserInteraction or Idle -> UserInteraction. +// VREvent_TrackedDeviceUserInteractionEnded fires when the devices transitions from UserInteraction_Timeout -> Idle +enum EDeviceActivityLevel +{ + k_EDeviceActivityLevel_Unknown = -1, + k_EDeviceActivityLevel_Idle = 0, // No activity for the last 10 seconds + k_EDeviceActivityLevel_UserInteraction = 1, // Activity (movement or prox sensor) is happening now + k_EDeviceActivityLevel_UserInteraction_Timeout = 2, // No activity for the last 0.5 seconds + k_EDeviceActivityLevel_Standby = 3, // Idle for at least 5 seconds (configurable in Settings -> Power Management) +}; + + +/** VR controller button and axis IDs */ +enum EVRButtonId +{ + k_EButton_System = 0, + k_EButton_ApplicationMenu = 1, + k_EButton_Grip = 2, + k_EButton_DPad_Left = 3, + k_EButton_DPad_Up = 4, + k_EButton_DPad_Right = 5, + k_EButton_DPad_Down = 6, + k_EButton_A = 7, + + k_EButton_ProximitySensor = 31, + + k_EButton_Axis0 = 32, + k_EButton_Axis1 = 33, + k_EButton_Axis2 = 34, + k_EButton_Axis3 = 35, + k_EButton_Axis4 = 36, + + // aliases for well known controllers + k_EButton_SteamVR_Touchpad = k_EButton_Axis0, + k_EButton_SteamVR_Trigger = k_EButton_Axis1, + + k_EButton_Dashboard_Back = k_EButton_Grip, + + k_EButton_Max = 64 +}; + +inline uint64_t ButtonMaskFromId( EVRButtonId id ) { return 1ull << id; } + +/** used for controller button events */ +struct VREvent_Controller_t +{ + uint32_t button; // EVRButtonId enum +}; + + +/** used for simulated mouse events in overlay space */ +enum EVRMouseButton +{ + VRMouseButton_Left = 0x0001, + VRMouseButton_Right = 0x0002, + VRMouseButton_Middle = 0x0004, +}; + + +/** used for simulated mouse events in overlay space */ +struct VREvent_Mouse_t +{ + float x, y; // co-ords are in GL space, bottom left of the texture is 0,0 + uint32_t button; // EVRMouseButton enum +}; + +/** used for simulated mouse wheel scroll in overlay space */ +struct VREvent_Scroll_t +{ + float xdelta, ydelta; // movement in fraction of the pad traversed since last delta, 1.0 for a full swipe + uint32_t repeatCount; +}; + +/** when in mouse input mode you can receive data from the touchpad, these events are only sent if the users finger + is on the touchpad (or just released from it) +**/ +struct VREvent_TouchPadMove_t +{ + // true if the users finger is detected on the touch pad + bool bFingerDown; + + // How long the finger has been down in seconds + float flSecondsFingerDown; + + // These values indicate the starting finger position (so you can do some basic swipe stuff) + float fValueXFirst; + float fValueYFirst; + + // This is the raw sampled coordinate without deadzoning + float fValueXRaw; + float fValueYRaw; +}; + +/** notification related events. Details will still change at this point */ +struct VREvent_Notification_t +{ + uint64_t ulUserValue; + uint32_t notificationId; +}; + +/** Used for events about processes */ +struct VREvent_Process_t +{ + uint32_t pid; + uint32_t oldPid; + bool bForced; +}; + + +/** Used for a few events about overlays */ +struct VREvent_Overlay_t +{ + uint64_t overlayHandle; +}; + + +/** Used for a few events about overlays */ +struct VREvent_Status_t +{ + uint32_t statusState; // EVRState enum +}; + +/** Used for keyboard events **/ +struct VREvent_Keyboard_t +{ + char cNewInput[8]; // Up to 11 bytes of new input + uint64_t uUserValue; // Possible flags about the new input +}; + +struct VREvent_Ipd_t +{ + float ipdMeters; +}; + +struct VREvent_Chaperone_t +{ + uint64_t m_nPreviousUniverse; + uint64_t m_nCurrentUniverse; +}; + +/** Not actually used for any events */ +struct VREvent_Reserved_t +{ + uint64_t reserved0; + uint64_t reserved1; +}; + +struct VREvent_PerformanceTest_t +{ + uint32_t m_nFidelityLevel; +}; + +struct VREvent_SeatedZeroPoseReset_t +{ + bool bResetBySystemMenu; +}; + +struct VREvent_Screenshot_t +{ + uint32_t handle; + uint32_t type; +}; + +struct VREvent_ScreenshotProgress_t +{ + float progress; +}; + +struct VREvent_ApplicationLaunch_t +{ + uint32_t pid; + uint32_t unArgsHandle; +}; + +struct VREvent_EditingCameraSurface_t +{ + uint64_t overlayHandle; + uint32_t nVisualMode; +}; + +struct VREvent_MessageOverlay_t +{ + uint32_t unVRMessageOverlayResponse; // vr::VRMessageOverlayResponse enum +}; + +struct VREvent_Property_t +{ + PropertyContainerHandle_t container; + ETrackedDeviceProperty prop; +}; + +/** NOTE!!! If you change this you MUST manually update openvr_interop.cs.py */ +typedef union +{ + VREvent_Reserved_t reserved; + VREvent_Controller_t controller; + VREvent_Mouse_t mouse; + VREvent_Scroll_t scroll; + VREvent_Process_t process; + VREvent_Notification_t notification; + VREvent_Overlay_t overlay; + VREvent_Status_t status; + VREvent_Keyboard_t keyboard; + VREvent_Ipd_t ipd; + VREvent_Chaperone_t chaperone; + VREvent_PerformanceTest_t performanceTest; + VREvent_TouchPadMove_t touchPadMove; + VREvent_SeatedZeroPoseReset_t seatedZeroPoseReset; + VREvent_Screenshot_t screenshot; + VREvent_ScreenshotProgress_t screenshotProgress; + VREvent_ApplicationLaunch_t applicationLaunch; + VREvent_EditingCameraSurface_t cameraSurface; + VREvent_MessageOverlay_t messageOverlay; + VREvent_Property_t property; +} VREvent_Data_t; + + +#if defined(__linux__) || defined(__APPLE__) +// This structure was originally defined mis-packed on Linux, preserved for +// compatibility. +#pragma pack( push, 4 ) +#endif + +/** An event posted by the server to all running applications */ +struct VREvent_t +{ + uint32_t eventType; // EVREventType enum + TrackedDeviceIndex_t trackedDeviceIndex; + float eventAgeSeconds; + // event data must be the end of the struct as its size is variable + VREvent_Data_t data; +}; + +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( pop ) +#endif + +/** The mesh to draw into the stencil (or depth) buffer to perform +* early stencil (or depth) kills of pixels that will never appear on the HMD. +* This mesh draws on all the pixels that will be hidden after distortion. +* +* If the HMD does not provide a visible area mesh pVertexData will be +* NULL and unTriangleCount will be 0. */ +struct HiddenAreaMesh_t +{ + const HmdVector2_t *pVertexData; + uint32_t unTriangleCount; +}; + + +enum EHiddenAreaMeshType +{ + k_eHiddenAreaMesh_Standard = 0, + k_eHiddenAreaMesh_Inverse = 1, + k_eHiddenAreaMesh_LineLoop = 2, + + k_eHiddenAreaMesh_Max = 3, +}; + + +/** Identifies what kind of axis is on the controller at index n. Read this type +* with pVRSystem->Get( nControllerDeviceIndex, Prop_Axis0Type_Int32 + n ); +*/ +enum EVRControllerAxisType +{ + k_eControllerAxis_None = 0, + k_eControllerAxis_TrackPad = 1, + k_eControllerAxis_Joystick = 2, + k_eControllerAxis_Trigger = 3, // Analog trigger data is in the X axis +}; + + +/** contains information about one axis on the controller */ +struct VRControllerAxis_t +{ + 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. + float y; // Ranges from -1.0 to 1.0 for joysticks and track pads. Is always 0.0 for triggers. +}; + + +/** the number of axes in the controller state */ +static const uint32_t k_unControllerStateAxisCount = 5; + + +#if defined(__linux__) || defined(__APPLE__) +// This structure was originally defined mis-packed on Linux, preserved for +// compatibility. +#pragma pack( push, 4 ) +#endif + +/** Holds all the state of a controller at one moment in time. */ +struct VRControllerState001_t +{ + // If packet num matches that on your prior call, then the controller state hasn't been changed since + // your last call and there is no need to process it + uint32_t unPacketNum; + + // bit flags for each of the buttons. Use ButtonMaskFromId to turn an ID into a mask + uint64_t ulButtonPressed; + uint64_t ulButtonTouched; + + // Axis data for the controller's analog inputs + VRControllerAxis_t rAxis[ k_unControllerStateAxisCount ]; +}; +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( pop ) +#endif + + +typedef VRControllerState001_t VRControllerState_t; + + +/** determines how to provide output to the application of various event processing functions. */ +enum EVRControllerEventOutputType +{ + ControllerEventOutput_OSEvents = 0, + ControllerEventOutput_VREvents = 1, +}; + + + +/** Collision Bounds Style */ +enum ECollisionBoundsStyle +{ + COLLISION_BOUNDS_STYLE_BEGINNER = 0, + COLLISION_BOUNDS_STYLE_INTERMEDIATE, + COLLISION_BOUNDS_STYLE_SQUARES, + COLLISION_BOUNDS_STYLE_ADVANCED, + COLLISION_BOUNDS_STYLE_NONE, + + COLLISION_BOUNDS_STYLE_COUNT +}; + +/** Allows the application to customize how the overlay appears in the compositor */ +struct Compositor_OverlaySettings +{ + uint32_t size; // sizeof(Compositor_OverlaySettings) + bool curved, antialias; + float scale, distance, alpha; + float uOffset, vOffset, uScale, vScale; + float gridDivs, gridWidth, gridScale; + HmdMatrix44_t transform; +}; + +/** used to refer to a single VR overlay */ +typedef uint64_t VROverlayHandle_t; + +static const VROverlayHandle_t k_ulOverlayHandleInvalid = 0; + +/** Errors that can occur around VR overlays */ +enum EVROverlayError +{ + VROverlayError_None = 0, + + VROverlayError_UnknownOverlay = 10, + VROverlayError_InvalidHandle = 11, + VROverlayError_PermissionDenied = 12, + VROverlayError_OverlayLimitExceeded = 13, // No more overlays could be created because the maximum number already exist + VROverlayError_WrongVisibilityType = 14, + VROverlayError_KeyTooLong = 15, + VROverlayError_NameTooLong = 16, + VROverlayError_KeyInUse = 17, + VROverlayError_WrongTransformType = 18, + VROverlayError_InvalidTrackedDevice = 19, + VROverlayError_InvalidParameter = 20, + VROverlayError_ThumbnailCantBeDestroyed = 21, + VROverlayError_ArrayTooSmall = 22, + VROverlayError_RequestFailed = 23, + VROverlayError_InvalidTexture = 24, + VROverlayError_UnableToLoadFile = 25, + VROverlayError_KeyboardAlreadyInUse = 26, + VROverlayError_NoNeighbor = 27, + VROverlayError_TooManyMaskPrimitives = 29, + VROverlayError_BadMaskPrimitive = 30, +}; + +/** enum values to pass in to VR_Init to identify whether the application will +* draw a 3D scene. */ +enum EVRApplicationType +{ + VRApplication_Other = 0, // Some other kind of application that isn't covered by the other entries + VRApplication_Scene = 1, // Application will submit 3D frames + VRApplication_Overlay = 2, // Application only interacts with overlays + VRApplication_Background = 3, // Application should not start SteamVR if it's not already running, and should not + // keep it running if everything else quits. + VRApplication_Utility = 4, // Init should not try to load any drivers. The application needs access to utility + // interfaces (like IVRSettings and IVRApplications) but not hardware. + VRApplication_VRMonitor = 5, // Reserved for vrmonitor + VRApplication_SteamWatchdog = 6,// Reserved for Steam + VRApplication_Bootstrapper = 7, // Start up SteamVR + + VRApplication_Max +}; + + +/** error codes for firmware */ +enum EVRFirmwareError +{ + VRFirmwareError_None = 0, + VRFirmwareError_Success = 1, + VRFirmwareError_Fail = 2, +}; + + +/** error codes for notifications */ +enum EVRNotificationError +{ + VRNotificationError_OK = 0, + VRNotificationError_InvalidNotificationId = 100, + VRNotificationError_NotificationQueueFull = 101, + VRNotificationError_InvalidOverlayHandle = 102, + VRNotificationError_SystemWithUserValueAlreadyExists = 103, +}; + + +/** error codes returned by Vr_Init */ + +// Please add adequate error description to https://developer.valvesoftware.com/w/index.php?title=Category:SteamVRHelp +enum EVRInitError +{ + VRInitError_None = 0, + VRInitError_Unknown = 1, + + VRInitError_Init_InstallationNotFound = 100, + VRInitError_Init_InstallationCorrupt = 101, + VRInitError_Init_VRClientDLLNotFound = 102, + VRInitError_Init_FileNotFound = 103, + VRInitError_Init_FactoryNotFound = 104, + VRInitError_Init_InterfaceNotFound = 105, + VRInitError_Init_InvalidInterface = 106, + VRInitError_Init_UserConfigDirectoryInvalid = 107, + VRInitError_Init_HmdNotFound = 108, + VRInitError_Init_NotInitialized = 109, + VRInitError_Init_PathRegistryNotFound = 110, + VRInitError_Init_NoConfigPath = 111, + VRInitError_Init_NoLogPath = 112, + VRInitError_Init_PathRegistryNotWritable = 113, + VRInitError_Init_AppInfoInitFailed = 114, + VRInitError_Init_Retry = 115, // Used internally to cause retries to vrserver + VRInitError_Init_InitCanceledByUser = 116, // The calling application should silently exit. The user canceled app startup + VRInitError_Init_AnotherAppLaunching = 117, + VRInitError_Init_SettingsInitFailed = 118, + VRInitError_Init_ShuttingDown = 119, + VRInitError_Init_TooManyObjects = 120, + VRInitError_Init_NoServerForBackgroundApp = 121, + VRInitError_Init_NotSupportedWithCompositor = 122, + VRInitError_Init_NotAvailableToUtilityApps = 123, + VRInitError_Init_Internal = 124, + VRInitError_Init_HmdDriverIdIsNone = 125, + VRInitError_Init_HmdNotFoundPresenceFailed = 126, + VRInitError_Init_VRMonitorNotFound = 127, + VRInitError_Init_VRMonitorStartupFailed = 128, + VRInitError_Init_LowPowerWatchdogNotSupported = 129, + VRInitError_Init_InvalidApplicationType = 130, + VRInitError_Init_NotAvailableToWatchdogApps = 131, + VRInitError_Init_WatchdogDisabledInSettings = 132, + VRInitError_Init_VRDashboardNotFound = 133, + VRInitError_Init_VRDashboardStartupFailed = 134, + VRInitError_Init_VRHomeNotFound = 135, + VRInitError_Init_VRHomeStartupFailed = 136, + + VRInitError_Driver_Failed = 200, + VRInitError_Driver_Unknown = 201, + VRInitError_Driver_HmdUnknown = 202, + VRInitError_Driver_NotLoaded = 203, + VRInitError_Driver_RuntimeOutOfDate = 204, + VRInitError_Driver_HmdInUse = 205, + VRInitError_Driver_NotCalibrated = 206, + VRInitError_Driver_CalibrationInvalid = 207, + VRInitError_Driver_HmdDisplayNotFound = 208, + VRInitError_Driver_TrackedDeviceInterfaceUnknown = 209, + // VRInitError_Driver_HmdDisplayNotFoundAfterFix = 210, // not needed: here for historic reasons + VRInitError_Driver_HmdDriverIdOutOfBounds = 211, + VRInitError_Driver_HmdDisplayMirrored = 212, + + VRInitError_IPC_ServerInitFailed = 300, + VRInitError_IPC_ConnectFailed = 301, + VRInitError_IPC_SharedStateInitFailed = 302, + VRInitError_IPC_CompositorInitFailed = 303, + VRInitError_IPC_MutexInitFailed = 304, + VRInitError_IPC_Failed = 305, + VRInitError_IPC_CompositorConnectFailed = 306, + VRInitError_IPC_CompositorInvalidConnectResponse = 307, + VRInitError_IPC_ConnectFailedAfterMultipleAttempts = 308, + + VRInitError_Compositor_Failed = 400, + VRInitError_Compositor_D3D11HardwareRequired = 401, + VRInitError_Compositor_FirmwareRequiresUpdate = 402, + VRInitError_Compositor_OverlayInitFailed = 403, + VRInitError_Compositor_ScreenshotsInitFailed = 404, + VRInitError_Compositor_UnableToCreateDevice = 405, + + VRInitError_VendorSpecific_UnableToConnectToOculusRuntime = 1000, + + VRInitError_VendorSpecific_HmdFound_CantOpenDevice = 1101, + VRInitError_VendorSpecific_HmdFound_UnableToRequestConfigStart = 1102, + VRInitError_VendorSpecific_HmdFound_NoStoredConfig = 1103, + VRInitError_VendorSpecific_HmdFound_ConfigTooBig = 1104, + VRInitError_VendorSpecific_HmdFound_ConfigTooSmall = 1105, + VRInitError_VendorSpecific_HmdFound_UnableToInitZLib = 1106, + VRInitError_VendorSpecific_HmdFound_CantReadFirmwareVersion = 1107, + VRInitError_VendorSpecific_HmdFound_UnableToSendUserDataStart = 1108, + VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataStart = 1109, + VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataNext = 1110, + VRInitError_VendorSpecific_HmdFound_UserDataAddressRange = 1111, + VRInitError_VendorSpecific_HmdFound_UserDataError = 1112, + VRInitError_VendorSpecific_HmdFound_ConfigFailedSanityCheck = 1113, + + VRInitError_Steam_SteamInstallationNotFound = 2000, +}; + +enum EVRScreenshotType +{ + VRScreenshotType_None = 0, + VRScreenshotType_Mono = 1, // left eye only + VRScreenshotType_Stereo = 2, + VRScreenshotType_Cubemap = 3, + VRScreenshotType_MonoPanorama = 4, + VRScreenshotType_StereoPanorama = 5 +}; + +enum EVRScreenshotPropertyFilenames +{ + VRScreenshotPropertyFilenames_Preview = 0, + VRScreenshotPropertyFilenames_VR = 1, +}; + +enum EVRTrackedCameraError +{ + VRTrackedCameraError_None = 0, + VRTrackedCameraError_OperationFailed = 100, + VRTrackedCameraError_InvalidHandle = 101, + VRTrackedCameraError_InvalidFrameHeaderVersion = 102, + VRTrackedCameraError_OutOfHandles = 103, + VRTrackedCameraError_IPCFailure = 104, + VRTrackedCameraError_NotSupportedForThisDevice = 105, + VRTrackedCameraError_SharedMemoryFailure = 106, + VRTrackedCameraError_FrameBufferingFailure = 107, + VRTrackedCameraError_StreamSetupFailure = 108, + VRTrackedCameraError_InvalidGLTextureId = 109, + VRTrackedCameraError_InvalidSharedTextureHandle = 110, + VRTrackedCameraError_FailedToGetGLTextureId = 111, + VRTrackedCameraError_SharedTextureFailure = 112, + VRTrackedCameraError_NoFrameAvailable = 113, + VRTrackedCameraError_InvalidArgument = 114, + VRTrackedCameraError_InvalidFrameBufferSize = 115, +}; + +enum EVRTrackedCameraFrameType +{ + VRTrackedCameraFrameType_Distorted = 0, // This is the camera video frame size in pixels, still distorted. + VRTrackedCameraFrameType_Undistorted, // In pixels, an undistorted inscribed rectangle region without invalid regions. This size is subject to changes shortly. + VRTrackedCameraFrameType_MaximumUndistorted, // In pixels, maximum undistorted with invalid regions. Non zero alpha component identifies valid regions. + MAX_CAMERA_FRAME_TYPES +}; + +typedef uint64_t TrackedCameraHandle_t; +#define INVALID_TRACKED_CAMERA_HANDLE ((vr::TrackedCameraHandle_t)0) + +struct CameraVideoStreamFrameHeader_t +{ + EVRTrackedCameraFrameType eFrameType; + + uint32_t nWidth; + uint32_t nHeight; + uint32_t nBytesPerPixel; + + uint32_t nFrameSequence; + + TrackedDevicePose_t standingTrackedDevicePose; +}; + +// Screenshot types +typedef uint32_t ScreenshotHandle_t; + +static const uint32_t k_unScreenshotHandleInvalid = 0; + +#pragma pack( pop ) + +// figure out how to import from the VR API dll +#if defined(_WIN32) + +#ifdef VR_API_EXPORT +#define VR_INTERFACE extern "C" __declspec( dllexport ) +#else +#define VR_INTERFACE extern "C" __declspec( dllimport ) +#endif + +#elif defined(__GNUC__) || defined(COMPILER_GCC) || defined(__APPLE__) + +#ifdef VR_API_EXPORT +#define VR_INTERFACE extern "C" __attribute__((visibility("default"))) +#else +#define VR_INTERFACE extern "C" +#endif + +#else +#error "Unsupported Platform." +#endif + + +#if defined( _WIN32 ) +#define VR_CALLTYPE __cdecl +#else +#define VR_CALLTYPE +#endif + +} // namespace vr + +#endif // _INCLUDE_VRTYPES_H + + +// vrannotation.h +#ifdef API_GEN +# define VR_CLANG_ATTR(ATTR) __attribute__((annotate( ATTR ))) +#else +# define VR_CLANG_ATTR(ATTR) +#endif + +#define VR_METHOD_DESC(DESC) VR_CLANG_ATTR( "desc:" #DESC ";" ) +#define VR_IGNOREATTR() VR_CLANG_ATTR( "ignore" ) +#define VR_OUT_STRUCT() VR_CLANG_ATTR( "out_struct: ;" ) +#define VR_OUT_STRING() VR_CLANG_ATTR( "out_string: ;" ) +#define VR_OUT_ARRAY_CALL(COUNTER,FUNCTION,PARAMS) VR_CLANG_ATTR( "out_array_call:" #COUNTER "," #FUNCTION "," #PARAMS ";" ) +#define VR_OUT_ARRAY_COUNT(COUNTER) VR_CLANG_ATTR( "out_array_count:" #COUNTER ";" ) +#define VR_ARRAY_COUNT(COUNTER) VR_CLANG_ATTR( "array_count:" #COUNTER ";" ) +#define VR_ARRAY_COUNT_D(COUNTER, DESC) VR_CLANG_ATTR( "array_count:" #COUNTER ";desc:" #DESC ) +#define VR_BUFFER_COUNT(COUNTER) VR_CLANG_ATTR( "buffer_count:" #COUNTER ";" ) +#define VR_OUT_BUFFER_COUNT(COUNTER) VR_CLANG_ATTR( "out_buffer_count:" #COUNTER ";" ) +#define VR_OUT_STRING_COUNT(COUNTER) VR_CLANG_ATTR( "out_string_count:" #COUNTER ";" ) + +// ivrsystem.h +namespace vr +{ + +class IVRSystem +{ +public: + + + // ------------------------------------ + // Display Methods + // ------------------------------------ + + /** Suggested size for the intermediate render target that the distortion pulls from. */ + virtual void GetRecommendedRenderTargetSize( uint32_t *pnWidth, uint32_t *pnHeight ) = 0; + + /** The projection matrix for the specified eye */ + virtual HmdMatrix44_t GetProjectionMatrix( EVREye eEye, float fNearZ, float fFarZ ) = 0; + + /** The components necessary to build your own projection matrix in case your + * application is doing something fancy like infinite Z */ + virtual void GetProjectionRaw( EVREye eEye, float *pfLeft, float *pfRight, float *pfTop, float *pfBottom ) = 0; + + /** Gets the result of the distortion function for the specified eye and input UVs. UVs go from 0,0 in + * the upper left of that eye's viewport and 1,1 in the lower right of that eye's viewport. + * Returns true for success. Otherwise, returns false, and distortion coordinates are not suitable. */ + virtual bool ComputeDistortion( EVREye eEye, float fU, float fV, DistortionCoordinates_t *pDistortionCoordinates ) = 0; + + /** Returns the transform from eye space to the head space. Eye space is the per-eye flavor of head + * space that provides stereo disparity. Instead of Model * View * Projection the sequence is Model * View * Eye^-1 * Projection. + * Normally View and Eye^-1 will be multiplied together and treated as View in your application. + */ + virtual HmdMatrix34_t GetEyeToHeadTransform( EVREye eEye ) = 0; + + /** Returns the number of elapsed seconds since the last recorded vsync event. This + * will come from a vsync timer event in the timer if possible or from the application-reported + * time if that is not available. If no vsync times are available the function will + * return zero for vsync time and frame counter and return false from the method. */ + virtual bool GetTimeSinceLastVsync( float *pfSecondsSinceLastVsync, uint64_t *pulFrameCounter ) = 0; + + /** [D3D9 Only] + * Returns the adapter index that the user should pass into CreateDevice to set up D3D9 in such + * a way that it can go full screen exclusive on the HMD. Returns -1 if there was an error. + */ + virtual int32_t GetD3D9AdapterIndex() = 0; + + /** [D3D10/11 Only] + * Returns the adapter index that the user should pass into EnumAdapters to create the device + * and swap chain in DX10 and DX11. If an error occurs the index will be set to -1. + */ + virtual void GetDXGIOutputInfo( int32_t *pnAdapterIndex ) = 0; + + /** + * Returns platform- and texture-type specific adapter identification so that applications and the + * compositor are creating textures and swap chains on the same GPU. If an error occurs the device + * will be set to 0. + * [D3D10/11/12 Only (D3D9 Not Supported)] + * Returns the adapter LUID that identifies the GPU attached to the HMD. The user should + * enumerate all adapters using IDXGIFactory::EnumAdapters and IDXGIAdapter::GetDesc to find + * the adapter with the matching LUID, or use IDXGIFactory4::EnumAdapterByLuid. + * The discovered IDXGIAdapter should be used to create the device and swap chain. + * [Vulkan Only] + * Returns the vk::PhysicalDevice that should be used by the application. + * [macOS Only] + * Returns an id that should be used by the application. + */ + virtual void GetOutputDevice( uint64_t *pnDevice, ETextureType textureType ) = 0; + + // ------------------------------------ + // Display Mode methods + // ------------------------------------ + + /** Use to determine if the headset display is part of the desktop (i.e. extended) or hidden (i.e. direct mode). */ + virtual bool IsDisplayOnDesktop() = 0; + + /** Set the display visibility (true = extended, false = direct mode). Return value of true indicates that the change was successful. */ + virtual bool SetDisplayVisibility( bool bIsVisibleOnDesktop ) = 0; + + // ------------------------------------ + // Tracking Methods + // ------------------------------------ + + /** The pose that the tracker thinks that the HMD will be in at the specified number of seconds into the + * future. Pass 0 to get the state at the instant the method is called. Most of the time the application should + * calculate the time until the photons will be emitted from the display and pass that time into the method. + * + * This is roughly analogous to the inverse of the view matrix in most applications, though + * many games will need to do some additional rotation or translation on top of the rotation + * and translation provided by the head pose. + * + * For devices where bPoseIsValid is true the application can use the pose to position the device + * in question. The provided array can be any size up to k_unMaxTrackedDeviceCount. + * + * Seated experiences should call this method with TrackingUniverseSeated and receive poses relative + * to the seated zero pose. Standing experiences should call this method with TrackingUniverseStanding + * and receive poses relative to the Chaperone Play Area. TrackingUniverseRawAndUncalibrated should + * probably not be used unless the application is the Chaperone calibration tool itself, but will provide + * poses relative to the hardware-specific coordinate system in the driver. + */ + virtual void GetDeviceToAbsoluteTrackingPose( ETrackingUniverseOrigin eOrigin, float fPredictedSecondsToPhotonsFromNow, VR_ARRAY_COUNT(unTrackedDevicePoseArrayCount) TrackedDevicePose_t *pTrackedDevicePoseArray, uint32_t unTrackedDevicePoseArrayCount ) = 0; + + /** Sets the zero pose for the seated tracker coordinate system to the current position and yaw of the HMD. After + * ResetSeatedZeroPose all GetDeviceToAbsoluteTrackingPose calls that pass TrackingUniverseSeated as the origin + * will be relative to this new zero pose. The new zero coordinate system will not change the fact that the Y axis + * is up in the real world, so the next pose returned from GetDeviceToAbsoluteTrackingPose after a call to + * ResetSeatedZeroPose may not be exactly an identity matrix. + * + * NOTE: This function overrides the user's previously saved seated zero pose and should only be called as the result of a user action. + * Users are also able to set their seated zero pose via the OpenVR Dashboard. + **/ + virtual void ResetSeatedZeroPose() = 0; + + /** Returns the transform from the seated zero pose to the standing absolute tracking system. This allows + * applications to represent the seated origin to used or transform object positions from one coordinate + * system to the other. + * + * The seated origin may or may not be inside the Play Area or Collision Bounds returned by IVRChaperone. Its position + * depends on what the user has set from the Dashboard settings and previous calls to ResetSeatedZeroPose. */ + virtual HmdMatrix34_t GetSeatedZeroPoseToStandingAbsoluteTrackingPose() = 0; + + /** Returns the transform from the tracking origin to the standing absolute tracking system. This allows + * applications to convert from raw tracking space to the calibrated standing coordinate system. */ + virtual HmdMatrix34_t GetRawZeroPoseToStandingAbsoluteTrackingPose() = 0; + + /** Get a sorted array of device indices of a given class of tracked devices (e.g. controllers). Devices are sorted right to left + * relative to the specified tracked device (default: hmd -- pass in -1 for absolute tracking space). Returns the number of devices + * in the list, or the size of the array needed if not large enough. */ + 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; + + /** Returns the level of activity on the device. */ + virtual EDeviceActivityLevel GetTrackedDeviceActivityLevel( vr::TrackedDeviceIndex_t unDeviceId ) = 0; + + /** Convenience utility to apply the specified transform to the specified pose. + * This properly transforms all pose components, including velocity and angular velocity + */ + virtual void ApplyTransform( TrackedDevicePose_t *pOutputPose, const TrackedDevicePose_t *pTrackedDevicePose, const HmdMatrix34_t *pTransform ) = 0; + + /** Returns the device index associated with a specific role, for example the left hand or the right hand. */ + virtual vr::TrackedDeviceIndex_t GetTrackedDeviceIndexForControllerRole( vr::ETrackedControllerRole unDeviceType ) = 0; + + /** Returns the controller type associated with a device index. */ + virtual vr::ETrackedControllerRole GetControllerRoleForTrackedDeviceIndex( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0; + + // ------------------------------------ + // Property methods + // ------------------------------------ + + /** Returns the device class of a tracked device. If there has not been a device connected in this slot + * since the application started this function will return TrackedDevice_Invalid. For previous detected + * devices the function will return the previously observed device class. + * + * To determine which devices exist on the system, just loop from 0 to k_unMaxTrackedDeviceCount and check + * the device class. Every device with something other than TrackedDevice_Invalid is associated with an + * actual tracked device. */ + virtual ETrackedDeviceClass GetTrackedDeviceClass( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0; + + /** Returns true if there is a device connected in this slot. */ + virtual bool IsTrackedDeviceConnected( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0; + + /** Returns a bool property. If the device index is not valid or the property is not a bool type this function will return false. */ + virtual bool GetBoolTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0; + + /** Returns a float property. If the device index is not valid or the property is not a float type this function will return 0. */ + virtual float GetFloatTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0; + + /** Returns an int property. If the device index is not valid or the property is not a int type this function will return 0. */ + virtual int32_t GetInt32TrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0; + + /** Returns a uint64 property. If the device index is not valid or the property is not a uint64 type this function will return 0. */ + virtual uint64_t GetUint64TrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0; + + /** Returns a matrix property. If the device index is not valid or the property is not a matrix type, this function will return identity. */ + virtual HmdMatrix34_t GetMatrix34TrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0; + + /** Returns a string property. If the device index is not valid or the property is not a string type this function will + * return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing + * null. Strings will always fit in buffers of k_unMaxPropertyStringSize characters. */ + virtual uint32_t GetStringTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize, ETrackedPropertyError *pError = 0L ) = 0; + + /** returns a string that corresponds with the specified property error. The string will be the name + * of the error enum value for all valid error codes */ + virtual const char *GetPropErrorNameFromEnum( ETrackedPropertyError error ) = 0; + + // ------------------------------------ + // Event methods + // ------------------------------------ + + /** Returns true and fills the event with the next event on the queue if there is one. If there are no events + * this method returns false. uncbVREvent should be the size in bytes of the VREvent_t struct */ + virtual bool PollNextEvent( VREvent_t *pEvent, uint32_t uncbVREvent ) = 0; + + /** Returns true and fills the event with the next event on the queue if there is one. If there are no events + * this method returns false. Fills in the pose of the associated tracked device in the provided pose struct. + * This pose will always be older than the call to this function and should not be used to render the device. + uncbVREvent should be the size in bytes of the VREvent_t struct */ + virtual bool PollNextEventWithPose( ETrackingUniverseOrigin eOrigin, VREvent_t *pEvent, uint32_t uncbVREvent, vr::TrackedDevicePose_t *pTrackedDevicePose ) = 0; + + /** returns the name of an EVREvent enum value */ + virtual const char *GetEventTypeNameFromEnum( EVREventType eType ) = 0; + + // ------------------------------------ + // Rendering helper methods + // ------------------------------------ + + /** 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 + * 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. + * This mesh is meant to be rendered into the stencil buffer (or into the depth buffer setting nearz) before rendering each eye's view. + * This will improve performance by letting the GPU early-reject pixels the user will never see before running the pixel shader. + * NOTE: Render this mesh with backface culling disabled since the winding order of the vertices can be different per-HMD or per-eye. + * 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. + * 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. + */ + virtual HiddenAreaMesh_t GetHiddenAreaMesh( EVREye eEye, EHiddenAreaMeshType type = k_eHiddenAreaMesh_Standard ) = 0; + + // ------------------------------------ + // Controller methods + // ------------------------------------ + + /** Fills the supplied struct with the current state of the controller. Returns false if the controller index + * is invalid. */ + virtual bool GetControllerState( vr::TrackedDeviceIndex_t unControllerDeviceIndex, vr::VRControllerState_t *pControllerState, uint32_t unControllerStateSize ) = 0; + + /** fills the supplied struct with the current state of the controller and the provided pose with the pose of + * the controller when the controller state was updated most recently. Use this form if you need a precise controller + * pose as input to your application when the user presses or releases a button. */ + virtual bool GetControllerStateWithPose( ETrackingUniverseOrigin eOrigin, vr::TrackedDeviceIndex_t unControllerDeviceIndex, vr::VRControllerState_t *pControllerState, uint32_t unControllerStateSize, TrackedDevicePose_t *pTrackedDevicePose ) = 0; + + /** Trigger a single haptic pulse on a controller. After this call the application may not trigger another haptic pulse on this controller + * and axis combination for 5ms. */ + virtual void TriggerHapticPulse( vr::TrackedDeviceIndex_t unControllerDeviceIndex, uint32_t unAxisId, unsigned short usDurationMicroSec ) = 0; + + /** returns the name of an EVRButtonId enum value */ + virtual const char *GetButtonIdNameFromEnum( EVRButtonId eButtonId ) = 0; + + /** returns the name of an EVRControllerAxisType enum value */ + virtual const char *GetControllerAxisTypeNameFromEnum( EVRControllerAxisType eAxisType ) = 0; + + /** Tells OpenVR that this process wants exclusive access to controller button states and button events. Other apps will be notified that + * they have lost input focus with a VREvent_InputFocusCaptured event. Returns false if input focus could not be captured for + * some reason. */ + virtual bool CaptureInputFocus() = 0; + + /** Tells OpenVR that this process no longer wants exclusive access to button states and button events. Other apps will be notified + * that input focus has been released with a VREvent_InputFocusReleased event. */ + virtual void ReleaseInputFocus() = 0; + + /** Returns true if input focus is captured by another process. */ + virtual bool IsInputFocusCapturedByAnotherProcess() = 0; + + // ------------------------------------ + // Debug Methods + // ------------------------------------ + + /** Sends a request to the driver for the specified device and returns the response. The maximum response size is 32k, + * but this method can be called with a smaller buffer. If the response exceeds the size of the buffer, it is truncated. + * The size of the response including its terminating null is returned. */ + virtual uint32_t DriverDebugRequest( vr::TrackedDeviceIndex_t unDeviceIndex, const char *pchRequest, char *pchResponseBuffer, uint32_t unResponseBufferSize ) = 0; + + // ------------------------------------ + // Firmware methods + // ------------------------------------ + + /** Performs the actual firmware update if applicable. + * The following events will be sent, if VRFirmwareError_None was returned: VREvent_FirmwareUpdateStarted, VREvent_FirmwareUpdateFinished + * Use the properties Prop_Firmware_UpdateAvailable_Bool, Prop_Firmware_ManualUpdate_Bool, and Prop_Firmware_ManualUpdateURL_String + * to figure our whether a firmware update is available, and to figure out whether its a manual update + * Prop_Firmware_ManualUpdateURL_String should point to an URL describing the manual update process */ + virtual vr::EVRFirmwareError PerformFirmwareUpdate( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0; + + // ------------------------------------ + // Application life cycle methods + // ------------------------------------ + + /** Call this to acknowledge to the system that VREvent_Quit has been received and that the process is exiting. + * This extends the timeout until the process is killed. */ + virtual void AcknowledgeQuit_Exiting() = 0; + + /** Call this to tell the system that the user is being prompted to save data. This + * halts the timeout and dismisses the dashboard (if it was up). Applications should be sure to actually + * prompt the user to save and then exit afterward, otherwise the user will be left in a confusing state. */ + virtual void AcknowledgeQuit_UserPrompt() = 0; + +}; + +static const char * const IVRSystem_Version = "IVRSystem_016"; + +} + + +// ivrapplications.h +namespace vr +{ + + /** Used for all errors reported by the IVRApplications interface */ + enum EVRApplicationError + { + VRApplicationError_None = 0, + + VRApplicationError_AppKeyAlreadyExists = 100, // Only one application can use any given key + VRApplicationError_NoManifest = 101, // the running application does not have a manifest + VRApplicationError_NoApplication = 102, // No application is running + VRApplicationError_InvalidIndex = 103, + VRApplicationError_UnknownApplication = 104, // the application could not be found + VRApplicationError_IPCFailed = 105, // An IPC failure caused the request to fail + VRApplicationError_ApplicationAlreadyRunning = 106, + VRApplicationError_InvalidManifest = 107, + VRApplicationError_InvalidApplication = 108, + VRApplicationError_LaunchFailed = 109, // the process didn't start + VRApplicationError_ApplicationAlreadyStarting = 110, // the system was already starting the same application + VRApplicationError_LaunchInProgress = 111, // The system was already starting a different application + VRApplicationError_OldApplicationQuitting = 112, + VRApplicationError_TransitionAborted = 113, + VRApplicationError_IsTemplate = 114, // error when you try to call LaunchApplication() on a template type app (use LaunchTemplateApplication) + + VRApplicationError_BufferTooSmall = 200, // The provided buffer was too small to fit the requested data + VRApplicationError_PropertyNotSet = 201, // The requested property was not set + VRApplicationError_UnknownProperty = 202, + VRApplicationError_InvalidParameter = 203, + }; + + /** The maximum length of an application key */ + static const uint32_t k_unMaxApplicationKeyLength = 128; + + /** these are the properties available on applications. */ + enum EVRApplicationProperty + { + VRApplicationProperty_Name_String = 0, + + VRApplicationProperty_LaunchType_String = 11, + VRApplicationProperty_WorkingDirectory_String = 12, + VRApplicationProperty_BinaryPath_String = 13, + VRApplicationProperty_Arguments_String = 14, + VRApplicationProperty_URL_String = 15, + + VRApplicationProperty_Description_String = 50, + VRApplicationProperty_NewsURL_String = 51, + VRApplicationProperty_ImagePath_String = 52, + VRApplicationProperty_Source_String = 53, + + VRApplicationProperty_IsDashboardOverlay_Bool = 60, + VRApplicationProperty_IsTemplate_Bool = 61, + VRApplicationProperty_IsInstanced_Bool = 62, + VRApplicationProperty_IsInternal_Bool = 63, + + VRApplicationProperty_LastLaunchTime_Uint64 = 70, + }; + + /** These are states the scene application startup process will go through. */ + enum EVRApplicationTransitionState + { + VRApplicationTransition_None = 0, + + VRApplicationTransition_OldAppQuitSent = 10, + VRApplicationTransition_WaitingForExternalLaunch = 11, + + VRApplicationTransition_NewAppLaunched = 20, + }; + + struct AppOverrideKeys_t + { + const char *pchKey; + const char *pchValue; + }; + + /** Currently recognized mime types */ + static const char * const k_pch_MimeType_HomeApp = "vr/home"; + static const char * const k_pch_MimeType_GameTheater = "vr/game_theater"; + + class IVRApplications + { + public: + + // --------------- Application management --------------- // + + /** Adds an application manifest to the list to load when building the list of installed applications. + * Temporary manifests are not automatically loaded */ + virtual EVRApplicationError AddApplicationManifest( const char *pchApplicationManifestFullPath, bool bTemporary = false ) = 0; + + /** Removes an application manifest from the list to load when building the list of installed applications. */ + virtual EVRApplicationError RemoveApplicationManifest( const char *pchApplicationManifestFullPath ) = 0; + + /** Returns true if an application is installed */ + virtual bool IsApplicationInstalled( const char *pchAppKey ) = 0; + + /** Returns the number of applications available in the list */ + virtual uint32_t GetApplicationCount() = 0; + + /** Returns the key of the specified application. The index is at least 0 and is less than the return + * value of GetApplicationCount(). The buffer should be at least k_unMaxApplicationKeyLength in order to + * fit the key. */ + virtual EVRApplicationError GetApplicationKeyByIndex( uint32_t unApplicationIndex, VR_OUT_STRING() char *pchAppKeyBuffer, uint32_t unAppKeyBufferLen ) = 0; + + /** Returns the key of the application for the specified Process Id. The buffer should be at least + * k_unMaxApplicationKeyLength in order to fit the key. */ + virtual EVRApplicationError GetApplicationKeyByProcessId( uint32_t unProcessId, char *pchAppKeyBuffer, uint32_t unAppKeyBufferLen ) = 0; + + /** Launches the application. The existing scene application will exit and then the new application will start. + * This call is not valid for dashboard overlay applications. */ + virtual EVRApplicationError LaunchApplication( const char *pchAppKey ) = 0; + + /** Launches an instance of an application of type template, with its app key being pchNewAppKey (which must be unique) and optionally override sections + * from the manifest file via AppOverrideKeys_t + */ + virtual EVRApplicationError LaunchTemplateApplication( const char *pchTemplateAppKey, const char *pchNewAppKey, VR_ARRAY_COUNT( unKeys ) const AppOverrideKeys_t *pKeys, uint32_t unKeys ) = 0; + + /** 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 */ + virtual vr::EVRApplicationError LaunchApplicationFromMimeType( const char *pchMimeType, const char *pchArgs ) = 0; + + /** Launches the dashboard overlay application if it is not already running. This call is only valid for + * dashboard overlay applications. */ + virtual EVRApplicationError LaunchDashboardOverlay( const char *pchAppKey ) = 0; + + /** Cancel a pending launch for an application */ + virtual bool CancelApplicationLaunch( const char *pchAppKey ) = 0; + + /** Identifies a running application. OpenVR can't always tell which process started in response + * to a URL. This function allows a URL handler (or the process itself) to identify the app key + * for the now running application. Passing a process ID of 0 identifies the calling process. + * The application must be one that's known to the system via a call to AddApplicationManifest. */ + virtual EVRApplicationError IdentifyApplication( uint32_t unProcessId, const char *pchAppKey ) = 0; + + /** Returns the process ID for an application. Return 0 if the application was not found or is not running. */ + virtual uint32_t GetApplicationProcessId( const char *pchAppKey ) = 0; + + /** Returns a string for an applications error */ + virtual const char *GetApplicationsErrorNameFromEnum( EVRApplicationError error ) = 0; + + // --------------- Application properties --------------- // + + /** Returns a value for an application property. The required buffer size to fit this value will be returned. */ + virtual uint32_t GetApplicationPropertyString( const char *pchAppKey, EVRApplicationProperty eProperty, VR_OUT_STRING() char *pchPropertyValueBuffer, uint32_t unPropertyValueBufferLen, EVRApplicationError *peError = nullptr ) = 0; + + /** Returns a bool value for an application property. Returns false in all error cases. */ + virtual bool GetApplicationPropertyBool( const char *pchAppKey, EVRApplicationProperty eProperty, EVRApplicationError *peError = nullptr ) = 0; + + /** Returns a uint64 value for an application property. Returns 0 in all error cases. */ + virtual uint64_t GetApplicationPropertyUint64( const char *pchAppKey, EVRApplicationProperty eProperty, EVRApplicationError *peError = nullptr ) = 0; + + /** Sets the application auto-launch flag. This is only valid for applications which return true for VRApplicationProperty_IsDashboardOverlay_Bool. */ + virtual EVRApplicationError SetApplicationAutoLaunch( const char *pchAppKey, bool bAutoLaunch ) = 0; + + /** Gets the application auto-launch flag. This is only valid for applications which return true for VRApplicationProperty_IsDashboardOverlay_Bool. */ + virtual bool GetApplicationAutoLaunch( const char *pchAppKey ) = 0; + + /** Adds this mime-type to the list of supported mime types for this application*/ + virtual EVRApplicationError SetDefaultApplicationForMimeType( const char *pchAppKey, const char *pchMimeType ) = 0; + + /** return the app key that will open this mime type */ + virtual bool GetDefaultApplicationForMimeType( const char *pchMimeType, char *pchAppKeyBuffer, uint32_t unAppKeyBufferLen ) = 0; + + /** Get the list of supported mime types for this application, comma-delimited */ + virtual bool GetApplicationSupportedMimeTypes( const char *pchAppKey, char *pchMimeTypesBuffer, uint32_t unMimeTypesBuffer ) = 0; + + /** 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 */ + virtual uint32_t GetApplicationsThatSupportMimeType( const char *pchMimeType, char *pchAppKeysThatSupportBuffer, uint32_t unAppKeysThatSupportBuffer ) = 0; + + /** Get the args list from an app launch that had the process already running, you call this when you get a VREvent_ApplicationMimeTypeLoad */ + virtual uint32_t GetApplicationLaunchArguments( uint32_t unHandle, char *pchArgs, uint32_t unArgs ) = 0; + + // --------------- Transition methods --------------- // + + /** Returns the app key for the application that is starting up */ + virtual EVRApplicationError GetStartingApplication( char *pchAppKeyBuffer, uint32_t unAppKeyBufferLen ) = 0; + + /** Returns the application transition state */ + virtual EVRApplicationTransitionState GetTransitionState() = 0; + + /** Returns errors that would prevent the specified application from launching immediately. Calling this function will + * cause the current scene application to quit, so only call it when you are actually about to launch something else. + * What the caller should do about these failures depends on the failure: + * VRApplicationError_OldApplicationQuitting - An existing application has been told to quit. Wait for a VREvent_ProcessQuit + * and try again. + * VRApplicationError_ApplicationAlreadyStarting - This application is already starting. This is a permanent failure. + * VRApplicationError_LaunchInProgress - A different application is already starting. This is a permanent failure. + * VRApplicationError_None - Go ahead and launch. Everything is clear. + */ + virtual EVRApplicationError PerformApplicationPrelaunchCheck( const char *pchAppKey ) = 0; + + /** Returns a string for an application transition state */ + virtual const char *GetApplicationsTransitionStateNameFromEnum( EVRApplicationTransitionState state ) = 0; + + /** Returns true if the outgoing scene app has requested a save prompt before exiting */ + virtual bool IsQuitUserPromptRequested() = 0; + + /** Starts a subprocess within the calling application. This + * suppresses all application transition UI and automatically identifies the new executable + * as part of the same application. On success the calling process should exit immediately. + * If working directory is NULL or "" the directory portion of the binary path will be + * the working directory. */ + virtual EVRApplicationError LaunchInternalProcess( const char *pchBinaryPath, const char *pchArguments, const char *pchWorkingDirectory ) = 0; + + /** Returns the current scene process ID according to the application system. A scene process will get scene + * focus once it starts rendering, but it will appear here once it calls VR_Init with the Scene application + * type. */ + virtual uint32_t GetCurrentSceneProcessId() = 0; + }; + + static const char * const IVRApplications_Version = "IVRApplications_006"; + +} // namespace vr + +// ivrsettings.h +namespace vr +{ + enum EVRSettingsError + { + VRSettingsError_None = 0, + VRSettingsError_IPCFailed = 1, + VRSettingsError_WriteFailed = 2, + VRSettingsError_ReadFailed = 3, + VRSettingsError_JsonParseFailed = 4, + VRSettingsError_UnsetSettingHasNoDefault = 5, // This will be returned if the setting does not appear in the appropriate default file and has not been set + }; + + // The maximum length of a settings key + static const uint32_t k_unMaxSettingsKeyLength = 128; + + class IVRSettings + { + public: + virtual const char *GetSettingsErrorNameFromEnum( EVRSettingsError eError ) = 0; + + // Returns true if file sync occurred (force or settings dirty) + virtual bool Sync( bool bForce = false, EVRSettingsError *peError = nullptr ) = 0; + + virtual void SetBool( const char *pchSection, const char *pchSettingsKey, bool bValue, EVRSettingsError *peError = nullptr ) = 0; + virtual void SetInt32( const char *pchSection, const char *pchSettingsKey, int32_t nValue, EVRSettingsError *peError = nullptr ) = 0; + virtual void SetFloat( const char *pchSection, const char *pchSettingsKey, float flValue, EVRSettingsError *peError = nullptr ) = 0; + virtual void SetString( const char *pchSection, const char *pchSettingsKey, const char *pchValue, EVRSettingsError *peError = nullptr ) = 0; + + // Users of the system need to provide a proper default in default.vrsettings in the resources/settings/ directory + // of either the runtime or the driver_xxx directory. Otherwise the default will be false, 0, 0.0 or "" + virtual bool GetBool( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0; + virtual int32_t GetInt32( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0; + virtual float GetFloat( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0; + virtual void GetString( const char *pchSection, const char *pchSettingsKey, VR_OUT_STRING() char *pchValue, uint32_t unValueLen, EVRSettingsError *peError = nullptr ) = 0; + + virtual void RemoveSection( const char *pchSection, EVRSettingsError *peError = nullptr ) = 0; + virtual void RemoveKeyInSection( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0; + }; + + //----------------------------------------------------------------------------- + static const char * const IVRSettings_Version = "IVRSettings_002"; + + //----------------------------------------------------------------------------- + // steamvr keys + static const char * const k_pch_SteamVR_Section = "steamvr"; + static const char * const k_pch_SteamVR_RequireHmd_String = "requireHmd"; + static const char * const k_pch_SteamVR_ForcedDriverKey_String = "forcedDriver"; + static const char * const k_pch_SteamVR_ForcedHmdKey_String = "forcedHmd"; + static const char * const k_pch_SteamVR_DisplayDebug_Bool = "displayDebug"; + static const char * const k_pch_SteamVR_DebugProcessPipe_String = "debugProcessPipe"; + static const char * const k_pch_SteamVR_DisplayDebugX_Int32 = "displayDebugX"; + static const char * const k_pch_SteamVR_DisplayDebugY_Int32 = "displayDebugY"; + static const char * const k_pch_SteamVR_SendSystemButtonToAllApps_Bool= "sendSystemButtonToAllApps"; + static const char * const k_pch_SteamVR_LogLevel_Int32 = "loglevel"; + static const char * const k_pch_SteamVR_IPD_Float = "ipd"; + static const char * const k_pch_SteamVR_Background_String = "background"; + static const char * const k_pch_SteamVR_BackgroundUseDomeProjection_Bool = "backgroundUseDomeProjection"; + static const char * const k_pch_SteamVR_BackgroundCameraHeight_Float = "backgroundCameraHeight"; + static const char * const k_pch_SteamVR_BackgroundDomeRadius_Float = "backgroundDomeRadius"; + static const char * const k_pch_SteamVR_GridColor_String = "gridColor"; + static const char * const k_pch_SteamVR_PlayAreaColor_String = "playAreaColor"; + static const char * const k_pch_SteamVR_ShowStage_Bool = "showStage"; + static const char * const k_pch_SteamVR_ActivateMultipleDrivers_Bool = "activateMultipleDrivers"; + static const char * const k_pch_SteamVR_DirectMode_Bool = "directMode"; + static const char * const k_pch_SteamVR_DirectModeEdidVid_Int32 = "directModeEdidVid"; + static const char * const k_pch_SteamVR_DirectModeEdidPid_Int32 = "directModeEdidPid"; + static const char * const k_pch_SteamVR_UsingSpeakers_Bool = "usingSpeakers"; + static const char * const k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float = "speakersForwardYawOffsetDegrees"; + static const char * const k_pch_SteamVR_BaseStationPowerManagement_Bool = "basestationPowerManagement"; + static const char * const k_pch_SteamVR_NeverKillProcesses_Bool = "neverKillProcesses"; + static const char * const k_pch_SteamVR_SupersampleScale_Float = "supersampleScale"; + static const char * const k_pch_SteamVR_AllowAsyncReprojection_Bool = "allowAsyncReprojection"; + static const char * const k_pch_SteamVR_AllowReprojection_Bool = "allowInterleavedReprojection"; + static const char * const k_pch_SteamVR_ForceReprojection_Bool = "forceReprojection"; + static const char * const k_pch_SteamVR_ForceFadeOnBadTracking_Bool = "forceFadeOnBadTracking"; + static const char * const k_pch_SteamVR_DefaultMirrorView_Int32 = "defaultMirrorView"; + static const char * const k_pch_SteamVR_ShowMirrorView_Bool = "showMirrorView"; + static const char * const k_pch_SteamVR_MirrorViewGeometry_String = "mirrorViewGeometry"; + static const char * const k_pch_SteamVR_StartMonitorFromAppLaunch = "startMonitorFromAppLaunch"; + static const char * const k_pch_SteamVR_StartCompositorFromAppLaunch_Bool = "startCompositorFromAppLaunch"; + static const char * const k_pch_SteamVR_StartDashboardFromAppLaunch_Bool = "startDashboardFromAppLaunch"; + static const char * const k_pch_SteamVR_StartOverlayAppsFromDashboard_Bool = "startOverlayAppsFromDashboard"; + static const char * const k_pch_SteamVR_EnableHomeApp = "enableHomeApp"; + static const char * const k_pch_SteamVR_CycleBackgroundImageTimeSec_Int32 = "CycleBackgroundImageTimeSec"; + static const char * const k_pch_SteamVR_RetailDemo_Bool = "retailDemo"; + static const char * const k_pch_SteamVR_IpdOffset_Float = "ipdOffset"; + static const char * const k_pch_SteamVR_AllowSupersampleFiltering_Bool = "allowSupersampleFiltering"; + + //----------------------------------------------------------------------------- + // lighthouse keys + static const char * const k_pch_Lighthouse_Section = "driver_lighthouse"; + static const char * const k_pch_Lighthouse_DisableIMU_Bool = "disableimu"; + static const char * const k_pch_Lighthouse_UseDisambiguation_String = "usedisambiguation"; + static const char * const k_pch_Lighthouse_DisambiguationDebug_Int32 = "disambiguationdebug"; + static const char * const k_pch_Lighthouse_PrimaryBasestation_Int32 = "primarybasestation"; + static const char * const k_pch_Lighthouse_DBHistory_Bool = "dbhistory"; + + //----------------------------------------------------------------------------- + // null keys + static const char * const k_pch_Null_Section = "driver_null"; + static const char * const k_pch_Null_SerialNumber_String = "serialNumber"; + static const char * const k_pch_Null_ModelNumber_String = "modelNumber"; + static const char * const k_pch_Null_WindowX_Int32 = "windowX"; + static const char * const k_pch_Null_WindowY_Int32 = "windowY"; + static const char * const k_pch_Null_WindowWidth_Int32 = "windowWidth"; + static const char * const k_pch_Null_WindowHeight_Int32 = "windowHeight"; + static const char * const k_pch_Null_RenderWidth_Int32 = "renderWidth"; + static const char * const k_pch_Null_RenderHeight_Int32 = "renderHeight"; + static const char * const k_pch_Null_SecondsFromVsyncToPhotons_Float = "secondsFromVsyncToPhotons"; + static const char * const k_pch_Null_DisplayFrequency_Float = "displayFrequency"; + + //----------------------------------------------------------------------------- + // user interface keys + static const char * const k_pch_UserInterface_Section = "userinterface"; + static const char * const k_pch_UserInterface_StatusAlwaysOnTop_Bool = "StatusAlwaysOnTop"; + static const char * const k_pch_UserInterface_MinimizeToTray_Bool = "MinimizeToTray"; + static const char * const k_pch_UserInterface_Screenshots_Bool = "screenshots"; + static const char * const k_pch_UserInterface_ScreenshotType_Int = "screenshotType"; + + //----------------------------------------------------------------------------- + // notification keys + static const char * const k_pch_Notifications_Section = "notifications"; + static const char * const k_pch_Notifications_DoNotDisturb_Bool = "DoNotDisturb"; + + //----------------------------------------------------------------------------- + // keyboard keys + static const char * const k_pch_Keyboard_Section = "keyboard"; + static const char * const k_pch_Keyboard_TutorialCompletions = "TutorialCompletions"; + static const char * const k_pch_Keyboard_ScaleX = "ScaleX"; + static const char * const k_pch_Keyboard_ScaleY = "ScaleY"; + static const char * const k_pch_Keyboard_OffsetLeftX = "OffsetLeftX"; + static const char * const k_pch_Keyboard_OffsetRightX = "OffsetRightX"; + static const char * const k_pch_Keyboard_OffsetY = "OffsetY"; + static const char * const k_pch_Keyboard_Smoothing = "Smoothing"; + + //----------------------------------------------------------------------------- + // perf keys + static const char * const k_pch_Perf_Section = "perfcheck"; + static const char * const k_pch_Perf_HeuristicActive_Bool = "heuristicActive"; + static const char * const k_pch_Perf_NotifyInHMD_Bool = "warnInHMD"; + static const char * const k_pch_Perf_NotifyOnlyOnce_Bool = "warnOnlyOnce"; + static const char * const k_pch_Perf_AllowTimingStore_Bool = "allowTimingStore"; + static const char * const k_pch_Perf_SaveTimingsOnExit_Bool = "saveTimingsOnExit"; + static const char * const k_pch_Perf_TestData_Float = "perfTestData"; + static const char * const k_pch_Perf_LinuxGPUProfiling_Bool = "linuxGPUProfiling"; + + //----------------------------------------------------------------------------- + // collision bounds keys + static const char * const k_pch_CollisionBounds_Section = "collisionBounds"; + static const char * const k_pch_CollisionBounds_Style_Int32 = "CollisionBoundsStyle"; + static const char * const k_pch_CollisionBounds_GroundPerimeterOn_Bool = "CollisionBoundsGroundPerimeterOn"; + static const char * const k_pch_CollisionBounds_CenterMarkerOn_Bool = "CollisionBoundsCenterMarkerOn"; + static const char * const k_pch_CollisionBounds_PlaySpaceOn_Bool = "CollisionBoundsPlaySpaceOn"; + static const char * const k_pch_CollisionBounds_FadeDistance_Float = "CollisionBoundsFadeDistance"; + static const char * const k_pch_CollisionBounds_ColorGammaR_Int32 = "CollisionBoundsColorGammaR"; + static const char * const k_pch_CollisionBounds_ColorGammaG_Int32 = "CollisionBoundsColorGammaG"; + static const char * const k_pch_CollisionBounds_ColorGammaB_Int32 = "CollisionBoundsColorGammaB"; + static const char * const k_pch_CollisionBounds_ColorGammaA_Int32 = "CollisionBoundsColorGammaA"; + + //----------------------------------------------------------------------------- + // camera keys + static const char * const k_pch_Camera_Section = "camera"; + static const char * const k_pch_Camera_EnableCamera_Bool = "enableCamera"; + static const char * const k_pch_Camera_EnableCameraInDashboard_Bool = "enableCameraInDashboard"; + static const char * const k_pch_Camera_EnableCameraForCollisionBounds_Bool = "enableCameraForCollisionBounds"; + static const char * const k_pch_Camera_EnableCameraForRoomView_Bool = "enableCameraForRoomView"; + static const char * const k_pch_Camera_BoundsColorGammaR_Int32 = "cameraBoundsColorGammaR"; + static const char * const k_pch_Camera_BoundsColorGammaG_Int32 = "cameraBoundsColorGammaG"; + static const char * const k_pch_Camera_BoundsColorGammaB_Int32 = "cameraBoundsColorGammaB"; + static const char * const k_pch_Camera_BoundsColorGammaA_Int32 = "cameraBoundsColorGammaA"; + static const char * const k_pch_Camera_BoundsStrength_Int32 = "cameraBoundsStrength"; + + //----------------------------------------------------------------------------- + // audio keys + static const char * const k_pch_audio_Section = "audio"; + static const char * const k_pch_audio_OnPlaybackDevice_String = "onPlaybackDevice"; + static const char * const k_pch_audio_OnRecordDevice_String = "onRecordDevice"; + static const char * const k_pch_audio_OnPlaybackMirrorDevice_String = "onPlaybackMirrorDevice"; + static const char * const k_pch_audio_OffPlaybackDevice_String = "offPlaybackDevice"; + static const char * const k_pch_audio_OffRecordDevice_String = "offRecordDevice"; + static const char * const k_pch_audio_VIVEHDMIGain = "viveHDMIGain"; + + //----------------------------------------------------------------------------- + // power management keys + static const char * const k_pch_Power_Section = "power"; + static const char * const k_pch_Power_PowerOffOnExit_Bool = "powerOffOnExit"; + static const char * const k_pch_Power_TurnOffScreensTimeout_Float = "turnOffScreensTimeout"; + static const char * const k_pch_Power_TurnOffControllersTimeout_Float = "turnOffControllersTimeout"; + static const char * const k_pch_Power_ReturnToWatchdogTimeout_Float = "returnToWatchdogTimeout"; + static const char * const k_pch_Power_AutoLaunchSteamVROnButtonPress = "autoLaunchSteamVROnButtonPress"; + + //----------------------------------------------------------------------------- + // dashboard keys + static const char * const k_pch_Dashboard_Section = "dashboard"; + static const char * const k_pch_Dashboard_EnableDashboard_Bool = "enableDashboard"; + static const char * const k_pch_Dashboard_ArcadeMode_Bool = "arcadeMode"; + + //----------------------------------------------------------------------------- + // model skin keys + static const char * const k_pch_modelskin_Section = "modelskins"; + + //----------------------------------------------------------------------------- + // driver keys - These could be checked in any driver_ section + static const char * const k_pch_Driver_Enable_Bool = "enable"; + +} // namespace vr + +// ivrchaperone.h +namespace vr +{ + +#pragma pack( push, 8 ) + +enum ChaperoneCalibrationState +{ + // OK! + ChaperoneCalibrationState_OK = 1, // Chaperone is fully calibrated and working correctly + + // Warnings + ChaperoneCalibrationState_Warning = 100, + ChaperoneCalibrationState_Warning_BaseStationMayHaveMoved = 101, // A base station thinks that it might have moved + ChaperoneCalibrationState_Warning_BaseStationRemoved = 102, // There are less base stations than when calibrated + ChaperoneCalibrationState_Warning_SeatedBoundsInvalid = 103, // Seated bounds haven't been calibrated for the current tracking center + + // Errors + ChaperoneCalibrationState_Error = 200, // The UniverseID is invalid + ChaperoneCalibrationState_Error_BaseStationUninitialized = 201, // Tracking center hasn't be calibrated for at least one of the base stations + ChaperoneCalibrationState_Error_BaseStationConflict = 202, // Tracking center is calibrated, but base stations disagree on the tracking space + ChaperoneCalibrationState_Error_PlayAreaInvalid = 203, // Play Area hasn't been calibrated for the current tracking center + ChaperoneCalibrationState_Error_CollisionBoundsInvalid = 204, // Collision Bounds haven't been calibrated for the current tracking center +}; + + +/** HIGH LEVEL TRACKING SPACE ASSUMPTIONS: +* 0,0,0 is the preferred standing area center. +* 0Y is the floor height. +* -Z is the preferred forward facing direction. */ +class IVRChaperone +{ +public: + + /** Get the current state of Chaperone calibration. This state can change at any time during a session due to physical base station changes. **/ + virtual ChaperoneCalibrationState GetCalibrationState() = 0; + + /** Returns the width and depth of the Play Area (formerly named Soft Bounds) in X and Z. + * Tracking space center (0,0,0) is the center of the Play Area. **/ + virtual bool GetPlayAreaSize( float *pSizeX, float *pSizeZ ) = 0; + + /** Returns the 4 corner positions of the Play Area (formerly named Soft Bounds). + * Corners are in counter-clockwise order. + * Standing center (0,0,0) is the center of the Play Area. + * It's a rectangle. + * 2 sides are parallel to the X axis and 2 sides are parallel to the Z axis. + * Height of every corner is 0Y (on the floor). **/ + virtual bool GetPlayAreaRect( HmdQuad_t *rect ) = 0; + + /** Reload Chaperone data from the .vrchap file on disk. */ + virtual void ReloadInfo( void ) = 0; + + /** Optionally give the chaperone system a hit about the color and brightness in the scene **/ + virtual void SetSceneColor( HmdColor_t color ) = 0; + + /** Get the current chaperone bounds draw color and brightness **/ + virtual void GetBoundsColor( HmdColor_t *pOutputColorArray, int nNumOutputColors, float flCollisionBoundsFadeDistance, HmdColor_t *pOutputCameraColor ) = 0; + + /** Determine whether the bounds are showing right now **/ + virtual bool AreBoundsVisible() = 0; + + /** Force the bounds to show, mostly for utilities **/ + virtual void ForceBoundsVisible( bool bForce ) = 0; +}; + +static const char * const IVRChaperone_Version = "IVRChaperone_003"; + +#pragma pack( pop ) + +} + +// ivrchaperonesetup.h +namespace vr +{ + +enum EChaperoneConfigFile +{ + EChaperoneConfigFile_Live = 1, // The live chaperone config, used by most applications and games + EChaperoneConfigFile_Temp = 2, // The temporary chaperone config, used to live-preview collision bounds in room setup +}; + +enum EChaperoneImportFlags +{ + EChaperoneImport_BoundsOnly = 0x0001, +}; + +/** Manages the working copy of the chaperone info. By default this will be the same as the +* live copy. Any changes made with this interface will stay in the working copy until +* CommitWorkingCopy() is called, at which point the working copy and the live copy will be +* the same again. */ +class IVRChaperoneSetup +{ +public: + + /** Saves the current working copy to disk */ + virtual bool CommitWorkingCopy( EChaperoneConfigFile configFile ) = 0; + + /** Reverts the working copy to match the live chaperone calibration. + * To modify existing data this MUST be do WHILE getting a non-error ChaperoneCalibrationStatus. + * Only after this should you do gets and sets on the existing data. */ + virtual void RevertWorkingCopy() = 0; + + /** Returns the width and depth of the Play Area (formerly named Soft Bounds) in X and Z from the working copy. + * Tracking space center (0,0,0) is the center of the Play Area. */ + virtual bool GetWorkingPlayAreaSize( float *pSizeX, float *pSizeZ ) = 0; + + /** Returns the 4 corner positions of the Play Area (formerly named Soft Bounds) from the working copy. + * Corners are in clockwise order. + * Tracking space center (0,0,0) is the center of the Play Area. + * It's a rectangle. + * 2 sides are parallel to the X axis and 2 sides are parallel to the Z axis. + * Height of every corner is 0Y (on the floor). **/ + virtual bool GetWorkingPlayAreaRect( HmdQuad_t *rect ) = 0; + + /** Returns the number of Quads if the buffer points to null. Otherwise it returns Quads + * into the buffer up to the max specified from the working copy. */ + virtual bool GetWorkingCollisionBoundsInfo( VR_OUT_ARRAY_COUNT(punQuadsCount) HmdQuad_t *pQuadsBuffer, uint32_t* punQuadsCount ) = 0; + + /** Returns the number of Quads if the buffer points to null. Otherwise it returns Quads + * into the buffer up to the max specified. */ + virtual bool GetLiveCollisionBoundsInfo( VR_OUT_ARRAY_COUNT(punQuadsCount) HmdQuad_t *pQuadsBuffer, uint32_t* punQuadsCount ) = 0; + + /** Returns the preferred seated position from the working copy. */ + virtual bool GetWorkingSeatedZeroPoseToRawTrackingPose( HmdMatrix34_t *pmatSeatedZeroPoseToRawTrackingPose ) = 0; + + /** Returns the standing origin from the working copy. */ + virtual bool GetWorkingStandingZeroPoseToRawTrackingPose( HmdMatrix34_t *pmatStandingZeroPoseToRawTrackingPose ) = 0; + + /** Sets the Play Area in the working copy. */ + virtual void SetWorkingPlayAreaSize( float sizeX, float sizeZ ) = 0; + + /** Sets the Collision Bounds in the working copy. */ + virtual void SetWorkingCollisionBoundsInfo( VR_ARRAY_COUNT(unQuadsCount) HmdQuad_t *pQuadsBuffer, uint32_t unQuadsCount ) = 0; + + /** Sets the preferred seated position in the working copy. */ + virtual void SetWorkingSeatedZeroPoseToRawTrackingPose( const HmdMatrix34_t *pMatSeatedZeroPoseToRawTrackingPose ) = 0; + + /** Sets the preferred standing position in the working copy. */ + virtual void SetWorkingStandingZeroPoseToRawTrackingPose( const HmdMatrix34_t *pMatStandingZeroPoseToRawTrackingPose ) = 0; + + /** Tear everything down and reload it from the file on disk */ + virtual void ReloadFromDisk( EChaperoneConfigFile configFile ) = 0; + + /** Returns the preferred seated position. */ + virtual bool GetLiveSeatedZeroPoseToRawTrackingPose( HmdMatrix34_t *pmatSeatedZeroPoseToRawTrackingPose ) = 0; + + virtual void SetWorkingCollisionBoundsTagsInfo( VR_ARRAY_COUNT(unTagCount) uint8_t *pTagsBuffer, uint32_t unTagCount ) = 0; + virtual bool GetLiveCollisionBoundsTagsInfo( VR_OUT_ARRAY_COUNT(punTagCount) uint8_t *pTagsBuffer, uint32_t *punTagCount ) = 0; + + virtual bool SetWorkingPhysicalBoundsInfo( VR_ARRAY_COUNT(unQuadsCount) HmdQuad_t *pQuadsBuffer, uint32_t unQuadsCount ) = 0; + virtual bool GetLivePhysicalBoundsInfo( VR_OUT_ARRAY_COUNT(punQuadsCount) HmdQuad_t *pQuadsBuffer, uint32_t* punQuadsCount ) = 0; + + virtual bool ExportLiveToBuffer( VR_OUT_STRING() char *pBuffer, uint32_t *pnBufferLength ) = 0; + virtual bool ImportFromBufferToWorking( const char *pBuffer, uint32_t nImportFlags ) = 0; +}; + +static const char * const IVRChaperoneSetup_Version = "IVRChaperoneSetup_005"; + + +} + +// ivrcompositor.h +namespace vr +{ + +#pragma pack( push, 8 ) + +/** Errors that can occur with the VR compositor */ +enum EVRCompositorError +{ + VRCompositorError_None = 0, + VRCompositorError_RequestFailed = 1, + VRCompositorError_IncompatibleVersion = 100, + VRCompositorError_DoNotHaveFocus = 101, + VRCompositorError_InvalidTexture = 102, + VRCompositorError_IsNotSceneApplication = 103, + VRCompositorError_TextureIsOnWrongDevice = 104, + VRCompositorError_TextureUsesUnsupportedFormat = 105, + VRCompositorError_SharedTexturesNotSupported = 106, + VRCompositorError_IndexOutOfRange = 107, + VRCompositorError_AlreadySubmitted = 108, +}; + +const uint32_t VRCompositor_ReprojectionReason_Cpu = 0x01; +const uint32_t VRCompositor_ReprojectionReason_Gpu = 0x02; +const uint32_t VRCompositor_ReprojectionAsync = 0x04; // This flag indicates the async reprojection mode is active, + // but does not indicate if reprojection actually happened or not. + // Use the ReprojectionReason flags above to check if reprojection + // was actually applied (i.e. scene texture was reused). + // NumFramePresents > 1 also indicates the scene texture was reused, + // and also the number of times that it was presented in total. + +/** Provides a single frame's timing information to the app */ +struct Compositor_FrameTiming +{ + uint32_t m_nSize; // Set to sizeof( Compositor_FrameTiming ) + uint32_t m_nFrameIndex; + uint32_t m_nNumFramePresents; // number of times this frame was presented + uint32_t m_nNumMisPresented; // number of times this frame was presented on a vsync other than it was originally predicted to + uint32_t m_nNumDroppedFrames; // number of additional times previous frame was scanned out + uint32_t m_nReprojectionFlags; + + /** Absolute time reference for comparing frames. This aligns with the vsync that running start is relative to. */ + double m_flSystemTimeInSeconds; + + /** These times may include work from other processes due to OS scheduling. + * The fewer packets of work these are broken up into, the less likely this will happen. + * GPU work can be broken up by calling Flush. This can sometimes be useful to get the GPU started + * processing that work earlier in the frame. */ + float m_flPreSubmitGpuMs; // time spent rendering the scene (gpu work submitted between WaitGetPoses and second Submit) + float m_flPostSubmitGpuMs; // additional time spent rendering by application (e.g. companion window) + float m_flTotalRenderGpuMs; // time between work submitted immediately after present (ideally vsync) until the end of compositor submitted work + float m_flCompositorRenderGpuMs; // time spend performing distortion correction, rendering chaperone, overlays, etc. + float m_flCompositorRenderCpuMs; // time spent on cpu submitting the above work for this frame + float m_flCompositorIdleCpuMs; // time spent waiting for running start (application could have used this much more time) + + /** Miscellaneous measured intervals. */ + float m_flClientFrameIntervalMs; // time between calls to WaitGetPoses + float m_flPresentCallCpuMs; // time blocked on call to present (usually 0.0, but can go long) + float m_flWaitForPresentCpuMs; // time spent spin-waiting for frame index to change (not near-zero indicates wait object failure) + float m_flSubmitFrameMs; // time spent in IVRCompositor::Submit (not near-zero indicates driver issue) + + /** The following are all relative to this frame's SystemTimeInSeconds */ + float m_flWaitGetPosesCalledMs; + float m_flNewPosesReadyMs; + float m_flNewFrameReadyMs; // second call to IVRCompositor::Submit + float m_flCompositorUpdateStartMs; + float m_flCompositorUpdateEndMs; + float m_flCompositorRenderStartMs; + + vr::TrackedDevicePose_t m_HmdPose; // pose used by app to render this frame +}; + +/** Cumulative stats for current application. These are not cleared until a new app connects, +* but they do stop accumulating once the associated app disconnects. */ +struct Compositor_CumulativeStats +{ + uint32_t m_nPid; // Process id associated with these stats (may no longer be running). + uint32_t m_nNumFramePresents; // total number of times we called present (includes reprojected frames) + uint32_t m_nNumDroppedFrames; // total number of times an old frame was re-scanned out (without reprojection) + uint32_t m_nNumReprojectedFrames; // total number of times a frame was scanned out a second time (with reprojection) + + /** Values recorded at startup before application has fully faded in the first time. */ + uint32_t m_nNumFramePresentsOnStartup; + uint32_t m_nNumDroppedFramesOnStartup; + uint32_t m_nNumReprojectedFramesOnStartup; + + /** Applications may explicitly fade to the compositor. This is usually to handle level transitions, and loading often causes + * system wide hitches. The following stats are collected during this period. Does not include values recorded during startup. */ + uint32_t m_nNumLoading; + uint32_t m_nNumFramePresentsLoading; + uint32_t m_nNumDroppedFramesLoading; + uint32_t m_nNumReprojectedFramesLoading; + + /** 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 + * fading back to the compositor. The following stats are a result of this, and are a subset of those recorded above. + * Does not include values recorded during start up or loading. */ + uint32_t m_nNumTimedOut; + uint32_t m_nNumFramePresentsTimedOut; + uint32_t m_nNumDroppedFramesTimedOut; + uint32_t m_nNumReprojectedFramesTimedOut; +}; + +#pragma pack( pop ) + +/** Allows the application to interact with the compositor */ +class IVRCompositor +{ +public: + /** Sets tracking space returned by WaitGetPoses */ + virtual void SetTrackingSpace( ETrackingUniverseOrigin eOrigin ) = 0; + + /** Gets current tracking space returned by WaitGetPoses */ + virtual ETrackingUniverseOrigin GetTrackingSpace() = 0; + + /** Scene applications should call this function to get poses to render with (and optionally poses predicted an additional frame out to use for gameplay). + * 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 + * start rendering. + * + * Return codes: + * - IsNotSceneApplication (make sure to call VR_Init with VRApplicaiton_Scene) + * - DoNotHaveFocus (some other app has taken focus - this will throttle the call to 10hz to reduce the impact on that app) + */ + virtual EVRCompositorError WaitGetPoses( VR_ARRAY_COUNT(unRenderPoseArrayCount) TrackedDevicePose_t* pRenderPoseArray, uint32_t unRenderPoseArrayCount, + VR_ARRAY_COUNT(unGamePoseArrayCount) TrackedDevicePose_t* pGamePoseArray, uint32_t unGamePoseArrayCount ) = 0; + + /** Get the last set of poses returned by WaitGetPoses. */ + virtual EVRCompositorError GetLastPoses( VR_ARRAY_COUNT( unRenderPoseArrayCount ) TrackedDevicePose_t* pRenderPoseArray, uint32_t unRenderPoseArrayCount, + VR_ARRAY_COUNT( unGamePoseArrayCount ) TrackedDevicePose_t* pGamePoseArray, uint32_t unGamePoseArrayCount ) = 0; + + /** Interface for accessing last set of poses returned by WaitGetPoses one at a time. + * Returns VRCompositorError_IndexOutOfRange if unDeviceIndex not less than k_unMaxTrackedDeviceCount otherwise VRCompositorError_None. + * It is okay to pass NULL for either pose if you only want one of the values. */ + virtual EVRCompositorError GetLastPoseForTrackedDeviceIndex( TrackedDeviceIndex_t unDeviceIndex, TrackedDevicePose_t *pOutputPose, TrackedDevicePose_t *pOutputGamePose ) = 0; + + /** 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 + * 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. + * + * OpenGL dirty state: + * glBindTexture + * + * Return codes: + * - IsNotSceneApplication (make sure to call VR_Init with VRApplicaiton_Scene) + * - DoNotHaveFocus (some other app has taken focus) + * - TextureIsOnWrongDevice (application did not use proper AdapterIndex - see IVRSystem.GetDXGIOutputInfo) + * - SharedTexturesNotSupported (application needs to call CreateDXGIFactory1 or later before creating DX device) + * - TextureUsesUnsupportedFormat (scene textures must be compatible with DXGI sharing rules - e.g. uncompressed, no mips, etc.) + * - InvalidTexture (usually means bad arguments passed in) + * - AlreadySubmitted (app has submitted two left textures or two right textures in a single frame - i.e. before calling WaitGetPoses again) + */ + virtual EVRCompositorError Submit( EVREye eEye, const Texture_t *pTexture, const VRTextureBounds_t* pBounds = 0, EVRSubmitFlags nSubmitFlags = Submit_Default ) = 0; + + /** Clears the frame that was sent with the last call to Submit. This will cause the + * compositor to show the grid until Submit is called again. */ + virtual void ClearLastSubmittedFrame() = 0; + + /** Call immediately after presenting your app's window (i.e. companion window) to unblock the compositor. + * This is an optional call, which only needs to be used if you can't instead call WaitGetPoses immediately after Present. + * 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 + * introduce a deadlock of some sort. This function tells the compositor that you have finished all rendering after having Submitted buffers for both + * eyes, and it is free to start its rendering work. This should only be called from the same thread you are rendering on. */ + virtual void PostPresentHandoff() = 0; + + /** Returns true if timing data is filled it. Sets oldest timing info if nFramesAgo is larger than the stored history. + * Be sure to set timing.size = sizeof(Compositor_FrameTiming) on struct passed in before calling this function. */ + virtual bool GetFrameTiming( Compositor_FrameTiming *pTiming, uint32_t unFramesAgo = 0 ) = 0; + + /** 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. + * 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. */ + virtual uint32_t GetFrameTimings( Compositor_FrameTiming *pTiming, uint32_t nFrames ) = 0; + + /** Returns the time in seconds left in the current (as identified by FrameTiming's frameIndex) frame. + * Due to "running start", this value may roll over to the next frame before ever reaching 0.0. */ + virtual float GetFrameTimeRemaining() = 0; + + /** Fills out stats accumulated for the last connected application. Pass in sizeof( Compositor_CumulativeStats ) as second parameter. */ + virtual void GetCumulativeStats( Compositor_CumulativeStats *pStats, uint32_t nStatsSizeInBytes ) = 0; + + /** Fades the view on the HMD to the specified color. The fade will take fSeconds, and the color values are between + * 0.0 and 1.0. This color is faded on top of the scene based on the alpha parameter. Removing the fade color instantly + * would be FadeToColor( 0.0, 0.0, 0.0, 0.0, 0.0 ). Values are in un-premultiplied alpha space. */ + virtual void FadeToColor( float fSeconds, float fRed, float fGreen, float fBlue, float fAlpha, bool bBackground = false ) = 0; + + /** Get current fade color value. */ + virtual HmdColor_t GetCurrentFadeColor( bool bBackground = false ) = 0; + + /** Fading the Grid in or out in fSeconds */ + virtual void FadeGrid( float fSeconds, bool bFadeIn ) = 0; + + /** Get current alpha value of grid. */ + virtual float GetCurrentGridAlpha() = 0; + + /** Override the skybox used in the compositor (e.g. for during level loads when the app can't feed scene images fast enough) + * Order is Front, Back, Left, Right, Top, Bottom. If only a single texture is passed, it is assumed in lat-long format. + * If two are passed, it is assumed a lat-long stereo pair. */ + virtual EVRCompositorError SetSkyboxOverride( VR_ARRAY_COUNT( unTextureCount ) const Texture_t *pTextures, uint32_t unTextureCount ) = 0; + + /** Resets compositor skybox back to defaults. */ + virtual void ClearSkyboxOverride() = 0; + + /** Brings the compositor window to the front. This is useful for covering any other window that may be on the HMD + * and is obscuring the compositor window. */ + virtual void CompositorBringToFront() = 0; + + /** Pushes the compositor window to the back. This is useful for allowing other applications to draw directly to the HMD. */ + virtual void CompositorGoToBack() = 0; + + /** Tells the compositor process to clean up and exit. You do not need to call this function at shutdown. Under normal + * circumstances the compositor will manage its own life cycle based on what applications are running. */ + virtual void CompositorQuit() = 0; + + /** Return whether the compositor is fullscreen */ + virtual bool IsFullscreen() = 0; + + /** Returns the process ID of the process that is currently rendering the scene */ + virtual uint32_t GetCurrentSceneFocusProcess() = 0; + + /** Returns the process ID of the process that rendered the last frame (or 0 if the compositor itself rendered the frame.) + * Returns 0 when fading out from an app and the app's process Id when fading into an app. */ + virtual uint32_t GetLastFrameRenderer() = 0; + + /** Returns true if the current process has the scene focus */ + virtual bool CanRenderScene() = 0; + + /** Creates a window on the primary monitor to display what is being shown in the headset. */ + virtual void ShowMirrorWindow() = 0; + + /** Closes the mirror window. */ + virtual void HideMirrorWindow() = 0; + + /** Returns true if the mirror window is shown. */ + virtual bool IsMirrorWindowVisible() = 0; + + /** Writes all images that the compositor knows about (including overlays) to a 'screenshots' folder in the SteamVR runtime root. */ + virtual void CompositorDumpImages() = 0; + + /** Let an app know it should be rendering with low resources. */ + virtual bool ShouldAppRenderWithLowResources() = 0; + + /** Override interleaved reprojection logic to force on. */ + virtual void ForceInterleavedReprojectionOn( bool bOverride ) = 0; + + /** Force reconnecting to the compositor process. */ + virtual void ForceReconnectProcess() = 0; + + /** Temporarily suspends rendering (useful for finer control over scene transitions). */ + virtual void SuspendRendering( bool bSuspend ) = 0; + + /** Opens a shared D3D11 texture with the undistorted composited image for each eye. Use ReleaseMirrorTextureD3D11 when finished + * instead of calling Release on the resource itself. */ + virtual vr::EVRCompositorError GetMirrorTextureD3D11( vr::EVREye eEye, void *pD3D11DeviceOrResource, void **ppD3D11ShaderResourceView ) = 0; + virtual void ReleaseMirrorTextureD3D11( void *pD3D11ShaderResourceView ) = 0; + + /** Access to mirror textures from OpenGL. */ + virtual vr::EVRCompositorError GetMirrorTextureGL( vr::EVREye eEye, vr::glUInt_t *pglTextureId, vr::glSharedTextureHandle_t *pglSharedTextureHandle ) = 0; + virtual bool ReleaseSharedGLTexture( vr::glUInt_t glTextureId, vr::glSharedTextureHandle_t glSharedTextureHandle ) = 0; + virtual void LockGLSharedTextureForAccess( vr::glSharedTextureHandle_t glSharedTextureHandle ) = 0; + virtual void UnlockGLSharedTextureForAccess( vr::glSharedTextureHandle_t glSharedTextureHandle ) = 0; + + /** [Vulkan Only] + * return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing + * null. The string will be a space separated list of-required instance extensions to enable in VkCreateInstance */ + virtual uint32_t GetVulkanInstanceExtensionsRequired( VR_OUT_STRING() char *pchValue, uint32_t unBufferSize ) = 0; + + /** [Vulkan only] + * return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing + * null. The string will be a space separated list of required device extensions to enable in VkCreateDevice */ + virtual uint32_t GetVulkanDeviceExtensionsRequired( VkPhysicalDevice_T *pPhysicalDevice, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize ) = 0; + +}; + +static const char * const IVRCompositor_Version = "IVRCompositor_020"; + +} // namespace vr + + + +// ivrnotifications.h +namespace vr +{ + +#pragma pack( push, 8 ) + +// Used for passing graphic data +struct NotificationBitmap_t +{ + NotificationBitmap_t() + : m_pImageData( nullptr ) + , m_nWidth( 0 ) + , m_nHeight( 0 ) + , m_nBytesPerPixel( 0 ) + { + }; + + void *m_pImageData; + int32_t m_nWidth; + int32_t m_nHeight; + int32_t m_nBytesPerPixel; +}; + + +/** Be aware that the notification type is used as 'priority' to pick the next notification */ +enum EVRNotificationType +{ + /** Transient notifications are automatically hidden after a period of time set by the user. + * They are used for things like information and chat messages that do not require user interaction. */ + EVRNotificationType_Transient = 0, + + /** Persistent notifications are shown to the user until they are hidden by calling RemoveNotification(). + * They are used for things like phone calls and alarms that require user interaction. */ + EVRNotificationType_Persistent = 1, + + /** System notifications are shown no matter what. It is expected, that the ulUserValue is used as ID. + * If there is already a system notification in the queue with that ID it is not accepted into the queue + * to prevent spamming with system notification */ + EVRNotificationType_Transient_SystemWithUserValue = 2, +}; + +enum EVRNotificationStyle +{ + /** Creates a notification with minimal external styling. */ + EVRNotificationStyle_None = 0, + + /** Used for notifications about overlay-level status. In Steam this is used for events like downloads completing. */ + EVRNotificationStyle_Application = 100, + + /** Used for notifications about contacts that are unknown or not available. In Steam this is used for friend invitations and offline friends. */ + EVRNotificationStyle_Contact_Disabled = 200, + + /** 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. */ + EVRNotificationStyle_Contact_Enabled = 201, + + /** 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. */ + EVRNotificationStyle_Contact_Active = 202, +}; + +static const uint32_t k_unNotificationTextMaxSize = 256; + +typedef uint32_t VRNotificationId; + + + +#pragma pack( pop ) + +/** Allows notification sources to interact with the VR system + This current interface is not yet implemented. Do not use yet. */ +class IVRNotifications +{ +public: + /** Create a notification and enqueue it to be shown to the user. + * An overlay handle is required to create a notification, as otherwise it would be impossible for a user to act on it. + * To create a two-line notification, use a line break ('\n') to split the text into two lines. + * The pImage argument may be NULL, in which case the specified overlay's icon will be used instead. */ + virtual EVRNotificationError CreateNotification( VROverlayHandle_t ulOverlayHandle, uint64_t ulUserValue, EVRNotificationType type, const char *pchText, EVRNotificationStyle style, const NotificationBitmap_t *pImage, /* out */ VRNotificationId *pNotificationId ) = 0; + + /** Destroy a notification, hiding it first if it currently shown to the user. */ + virtual EVRNotificationError RemoveNotification( VRNotificationId notificationId ) = 0; + +}; + +static const char * const IVRNotifications_Version = "IVRNotifications_002"; + +} // namespace vr + + + +// ivroverlay.h +namespace vr +{ + + /** The maximum length of an overlay key in bytes, counting the terminating null character. */ + static const uint32_t k_unVROverlayMaxKeyLength = 128; + + /** The maximum length of an overlay name in bytes, counting the terminating null character. */ + static const uint32_t k_unVROverlayMaxNameLength = 128; + + /** The maximum number of overlays that can exist in the system at one time. */ + static const uint32_t k_unMaxOverlayCount = 64; + + /** The maximum number of overlay intersection mask primitives per overlay */ + static const uint32_t k_unMaxOverlayIntersectionMaskPrimitivesCount = 32; + + /** Types of input supported by VR Overlays */ + enum VROverlayInputMethod + { + VROverlayInputMethod_None = 0, // No input events will be generated automatically for this overlay + VROverlayInputMethod_Mouse = 1, // Tracked controllers will get mouse events automatically + }; + + /** Allows the caller to figure out which overlay transform getter to call. */ + enum VROverlayTransformType + { + VROverlayTransform_Absolute = 0, + VROverlayTransform_TrackedDeviceRelative = 1, + VROverlayTransform_SystemOverlay = 2, + VROverlayTransform_TrackedComponent = 3, + }; + + /** Overlay control settings */ + enum VROverlayFlags + { + VROverlayFlags_None = 0, + + // The following only take effect when rendered using the high quality render path (see SetHighQualityOverlay). + VROverlayFlags_Curved = 1, + VROverlayFlags_RGSS4X = 2, + + // Set this flag on a dashboard overlay to prevent a tab from showing up for that overlay + VROverlayFlags_NoDashboardTab = 3, + + // Set this flag on a dashboard that is able to deal with gamepad focus events + VROverlayFlags_AcceptsGamepadEvents = 4, + + // Indicates that the overlay should dim/brighten to show gamepad focus + VROverlayFlags_ShowGamepadFocus = 5, + + // When in VROverlayInputMethod_Mouse you can optionally enable sending VRScroll_t + VROverlayFlags_SendVRScrollEvents = 6, + VROverlayFlags_SendVRTouchpadEvents = 7, + + // If set this will render a vertical scroll wheel on the primary controller, + // only needed if not using VROverlayFlags_SendVRScrollEvents but you still want to represent a scroll wheel + VROverlayFlags_ShowTouchPadScrollWheel = 8, + + // If this is set ownership and render access to the overlay are transferred + // to the new scene process on a call to IVRApplications::LaunchInternalProcess + VROverlayFlags_TransferOwnershipToInternalProcess = 9, + + // If set, renders 50% of the texture in each eye, side by side + VROverlayFlags_SideBySide_Parallel = 10, // Texture is left/right + VROverlayFlags_SideBySide_Crossed = 11, // Texture is crossed and right/left + + VROverlayFlags_Panorama = 12, // Texture is a panorama + VROverlayFlags_StereoPanorama = 13, // Texture is a stereo panorama + + // If this is set on an overlay owned by the scene application that overlay + // will be sorted with the "Other" overlays on top of all other scene overlays + VROverlayFlags_SortWithNonSceneOverlays = 14, + + // If set, the overlay will be shown in the dashboard, otherwise it will be hidden. + VROverlayFlags_VisibleInDashboard = 15, + }; + + enum VRMessageOverlayResponse + { + VRMessageOverlayResponse_ButtonPress_0 = 0, + VRMessageOverlayResponse_ButtonPress_1 = 1, + VRMessageOverlayResponse_ButtonPress_2 = 2, + VRMessageOverlayResponse_ButtonPress_3 = 3, + VRMessageOverlayResponse_CouldntFindSystemOverlay = 4, + VRMessageOverlayResponse_CouldntFindOrCreateClientOverlay= 5, + VRMessageOverlayResponse_ApplicationQuit = 6 + }; + + struct VROverlayIntersectionParams_t + { + HmdVector3_t vSource; + HmdVector3_t vDirection; + ETrackingUniverseOrigin eOrigin; + }; + + struct VROverlayIntersectionResults_t + { + HmdVector3_t vPoint; + HmdVector3_t vNormal; + HmdVector2_t vUVs; + float fDistance; + }; + + // Input modes for the Big Picture gamepad text entry + enum EGamepadTextInputMode + { + k_EGamepadTextInputModeNormal = 0, + k_EGamepadTextInputModePassword = 1, + k_EGamepadTextInputModeSubmit = 2, + }; + + // Controls number of allowed lines for the Big Picture gamepad text entry + enum EGamepadTextInputLineMode + { + k_EGamepadTextInputLineModeSingleLine = 0, + k_EGamepadTextInputLineModeMultipleLines = 1 + }; + + /** Directions for changing focus between overlays with the gamepad */ + enum EOverlayDirection + { + OverlayDirection_Up = 0, + OverlayDirection_Down = 1, + OverlayDirection_Left = 2, + OverlayDirection_Right = 3, + + OverlayDirection_Count = 4, + }; + + enum EVROverlayIntersectionMaskPrimitiveType + { + OverlayIntersectionPrimitiveType_Rectangle, + OverlayIntersectionPrimitiveType_Circle, + }; + + struct IntersectionMaskRectangle_t + { + float m_flTopLeftX; + float m_flTopLeftY; + float m_flWidth; + float m_flHeight; + }; + + struct IntersectionMaskCircle_t + { + float m_flCenterX; + float m_flCenterY; + float m_flRadius; + }; + + /** NOTE!!! If you change this you MUST manually update openvr_interop.cs.py and openvr_api_flat.h.py */ + typedef union + { + IntersectionMaskRectangle_t m_Rectangle; + IntersectionMaskCircle_t m_Circle; + } VROverlayIntersectionMaskPrimitive_Data_t; + + struct VROverlayIntersectionMaskPrimitive_t + { + EVROverlayIntersectionMaskPrimitiveType m_nPrimitiveType; + VROverlayIntersectionMaskPrimitive_Data_t m_Primitive; + }; + + class IVROverlay + { + public: + + // --------------------------------------------- + // Overlay management methods + // --------------------------------------------- + + /** Finds an existing overlay with the specified key. */ + virtual EVROverlayError FindOverlay( const char *pchOverlayKey, VROverlayHandle_t * pOverlayHandle ) = 0; + + /** Creates a new named overlay. All overlays start hidden and with default settings. */ + virtual EVROverlayError CreateOverlay( const char *pchOverlayKey, const char *pchOverlayName, VROverlayHandle_t * pOverlayHandle ) = 0; + + /** Destroys the specified overlay. When an application calls VR_Shutdown all overlays created by that app are + * automatically destroyed. */ + virtual EVROverlayError DestroyOverlay( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** Specify which overlay to use the high quality render path. This overlay will be composited in during the distortion pass which + * results in it drawing on top of everything else, but also at a higher quality as it samples the source texture directly rather than + * rasterizing into each eye's render texture first. Because if this, only one of these is supported at any given time. It is most useful + * for overlays that are expected to take up most of the user's view (e.g. streaming video). + * This mode does not support mouse input to your overlay. */ + virtual EVROverlayError SetHighQualityOverlay( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** Returns the overlay handle of the current overlay being rendered using the single high quality overlay render path. + * Otherwise it will return k_ulOverlayHandleInvalid. */ + virtual vr::VROverlayHandle_t GetHighQualityOverlay() = 0; + + /** Fills the provided buffer with the string key of the overlay. Returns the size of buffer required to store the key, including + * the terminating null character. k_unVROverlayMaxKeyLength will be enough bytes to fit the string. */ + virtual uint32_t GetOverlayKey( VROverlayHandle_t ulOverlayHandle, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize, EVROverlayError *pError = 0L ) = 0; + + /** Fills the provided buffer with the friendly name of the overlay. Returns the size of buffer required to store the key, including + * the terminating null character. k_unVROverlayMaxNameLength will be enough bytes to fit the string. */ + virtual uint32_t GetOverlayName( VROverlayHandle_t ulOverlayHandle, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize, EVROverlayError *pError = 0L ) = 0; + + /** set the name to use for this overlay */ + virtual EVROverlayError SetOverlayName( VROverlayHandle_t ulOverlayHandle, const char *pchName ) = 0; + + /** 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 + * will be set and VROverlayError_ArrayTooSmall is returned. */ + virtual EVROverlayError GetOverlayImageData( VROverlayHandle_t ulOverlayHandle, void *pvBuffer, uint32_t unBufferSize, uint32_t *punWidth, uint32_t *punHeight ) = 0; + + /** returns a string that corresponds with the specified overlay error. The string will be the name + * of the error enum value for all valid error codes */ + virtual const char *GetOverlayErrorNameFromEnum( EVROverlayError error ) = 0; + + // --------------------------------------------- + // Overlay rendering methods + // --------------------------------------------- + + /** Sets the pid that is allowed to render to this overlay (the creator pid is always allow to render), + * by default this is the pid of the process that made the overlay */ + virtual EVROverlayError SetOverlayRenderingPid( VROverlayHandle_t ulOverlayHandle, uint32_t unPID ) = 0; + + /** Gets the pid that is allowed to render to this overlay */ + virtual uint32_t GetOverlayRenderingPid( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** Specify flag setting for a given overlay */ + virtual EVROverlayError SetOverlayFlag( VROverlayHandle_t ulOverlayHandle, VROverlayFlags eOverlayFlag, bool bEnabled ) = 0; + + /** Sets flag setting for a given overlay */ + virtual EVROverlayError GetOverlayFlag( VROverlayHandle_t ulOverlayHandle, VROverlayFlags eOverlayFlag, bool *pbEnabled ) = 0; + + /** Sets the color tint of the overlay quad. Use 0.0 to 1.0 per channel. */ + virtual EVROverlayError SetOverlayColor( VROverlayHandle_t ulOverlayHandle, float fRed, float fGreen, float fBlue ) = 0; + + /** Gets the color tint of the overlay quad. */ + virtual EVROverlayError GetOverlayColor( VROverlayHandle_t ulOverlayHandle, float *pfRed, float *pfGreen, float *pfBlue ) = 0; + + /** Sets the alpha of the overlay quad. Use 1.0 for 100 percent opacity to 0.0 for 0 percent opacity. */ + virtual EVROverlayError SetOverlayAlpha( VROverlayHandle_t ulOverlayHandle, float fAlpha ) = 0; + + /** Gets the alpha of the overlay quad. By default overlays are rendering at 100 percent alpha (1.0). */ + virtual EVROverlayError GetOverlayAlpha( VROverlayHandle_t ulOverlayHandle, float *pfAlpha ) = 0; + + /** Sets the aspect ratio of the texels in the overlay. 1.0 means the texels are square. 2.0 means the texels + * are twice as wide as they are tall. Defaults to 1.0. */ + virtual EVROverlayError SetOverlayTexelAspect( VROverlayHandle_t ulOverlayHandle, float fTexelAspect ) = 0; + + /** Gets the aspect ratio of the texels in the overlay. Defaults to 1.0 */ + virtual EVROverlayError GetOverlayTexelAspect( VROverlayHandle_t ulOverlayHandle, float *pfTexelAspect ) = 0; + + /** Sets the rendering sort order for the overlay. Overlays are rendered this order: + * Overlays owned by the scene application + * Overlays owned by some other application + * + * Within a category overlays are rendered lowest sort order to highest sort order. Overlays with the same + * sort order are rendered back to front base on distance from the HMD. + * + * Sort order defaults to 0. */ + virtual EVROverlayError SetOverlaySortOrder( VROverlayHandle_t ulOverlayHandle, uint32_t unSortOrder ) = 0; + + /** Gets the sort order of the overlay. See SetOverlaySortOrder for how this works. */ + virtual EVROverlayError GetOverlaySortOrder( VROverlayHandle_t ulOverlayHandle, uint32_t *punSortOrder ) = 0; + + /** Sets the width of the overlay quad in meters. By default overlays are rendered on a quad that is 1 meter across */ + virtual EVROverlayError SetOverlayWidthInMeters( VROverlayHandle_t ulOverlayHandle, float fWidthInMeters ) = 0; + + /** Returns the width of the overlay quad in meters. By default overlays are rendered on a quad that is 1 meter across */ + virtual EVROverlayError GetOverlayWidthInMeters( VROverlayHandle_t ulOverlayHandle, float *pfWidthInMeters ) = 0; + + /** For high-quality curved overlays only, sets the distance range in meters from the overlay used to automatically curve + * the surface around the viewer. Min is distance is when the surface will be most curved. Max is when least curved. */ + virtual EVROverlayError SetOverlayAutoCurveDistanceRangeInMeters( VROverlayHandle_t ulOverlayHandle, float fMinDistanceInMeters, float fMaxDistanceInMeters ) = 0; + + /** For high-quality curved overlays only, gets the distance range in meters from the overlay used to automatically curve + * the surface around the viewer. Min is distance is when the surface will be most curved. Max is when least curved. */ + virtual EVROverlayError GetOverlayAutoCurveDistanceRangeInMeters( VROverlayHandle_t ulOverlayHandle, float *pfMinDistanceInMeters, float *pfMaxDistanceInMeters ) = 0; + + /** Sets the colorspace the overlay texture's data is in. Defaults to 'auto'. + * If the texture needs to be resolved, you should call SetOverlayTexture with the appropriate colorspace instead. */ + virtual EVROverlayError SetOverlayTextureColorSpace( VROverlayHandle_t ulOverlayHandle, EColorSpace eTextureColorSpace ) = 0; + + /** Gets the overlay's current colorspace setting. */ + virtual EVROverlayError GetOverlayTextureColorSpace( VROverlayHandle_t ulOverlayHandle, EColorSpace *peTextureColorSpace ) = 0; + + /** 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. */ + virtual EVROverlayError SetOverlayTextureBounds( VROverlayHandle_t ulOverlayHandle, const VRTextureBounds_t *pOverlayTextureBounds ) = 0; + + /** 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. */ + virtual EVROverlayError GetOverlayTextureBounds( VROverlayHandle_t ulOverlayHandle, VRTextureBounds_t *pOverlayTextureBounds ) = 0; + + /** Gets render model to draw behind this overlay */ + virtual uint32_t GetOverlayRenderModel( vr::VROverlayHandle_t ulOverlayHandle, char *pchValue, uint32_t unBufferSize, HmdColor_t *pColor, vr::EVROverlayError *pError ) = 0; + + /** Sets render model to draw behind this overlay and the vertex color to use, pass null for pColor to match the overlays vertex color. + The model is scaled by the same amount as the overlay, with a default of 1m. */ + virtual vr::EVROverlayError SetOverlayRenderModel( vr::VROverlayHandle_t ulOverlayHandle, const char *pchRenderModel, const HmdColor_t *pColor ) = 0; + + /** Returns the transform type of this overlay. */ + virtual EVROverlayError GetOverlayTransformType( VROverlayHandle_t ulOverlayHandle, VROverlayTransformType *peTransformType ) = 0; + + /** Sets the transform to absolute tracking origin. */ + virtual EVROverlayError SetOverlayTransformAbsolute( VROverlayHandle_t ulOverlayHandle, ETrackingUniverseOrigin eTrackingOrigin, const HmdMatrix34_t *pmatTrackingOriginToOverlayTransform ) = 0; + + /** Gets the transform if it is absolute. Returns an error if the transform is some other type. */ + virtual EVROverlayError GetOverlayTransformAbsolute( VROverlayHandle_t ulOverlayHandle, ETrackingUniverseOrigin *peTrackingOrigin, HmdMatrix34_t *pmatTrackingOriginToOverlayTransform ) = 0; + + /** Sets the transform to relative to the transform of the specified tracked device. */ + virtual EVROverlayError SetOverlayTransformTrackedDeviceRelative( VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t unTrackedDevice, const HmdMatrix34_t *pmatTrackedDeviceToOverlayTransform ) = 0; + + /** Gets the transform if it is relative to a tracked device. Returns an error if the transform is some other type. */ + virtual EVROverlayError GetOverlayTransformTrackedDeviceRelative( VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t *punTrackedDevice, HmdMatrix34_t *pmatTrackedDeviceToOverlayTransform ) = 0; + + /** Sets the transform to draw the overlay on a rendermodel component mesh instead of a quad. This will only draw when the system is + * drawing the device. Overlays with this transform type cannot receive mouse events. */ + virtual EVROverlayError SetOverlayTransformTrackedDeviceComponent( VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t unDeviceIndex, const char *pchComponentName ) = 0; + + /** Gets the transform information when the overlay is rendering on a component. */ + virtual EVROverlayError GetOverlayTransformTrackedDeviceComponent( VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t *punDeviceIndex, char *pchComponentName, uint32_t unComponentNameSize ) = 0; + + /** Gets the transform if it is relative to another overlay. Returns an error if the transform is some other type. */ + virtual vr::EVROverlayError GetOverlayTransformOverlayRelative( VROverlayHandle_t ulOverlayHandle, VROverlayHandle_t *ulOverlayHandleParent, HmdMatrix34_t *pmatParentOverlayToOverlayTransform ) = 0; + + /** Sets the transform to relative to the transform of the specified overlay. This overlays visibility will also track the parents visibility */ + virtual vr::EVROverlayError SetOverlayTransformOverlayRelative( VROverlayHandle_t ulOverlayHandle, VROverlayHandle_t ulOverlayHandleParent, const HmdMatrix34_t *pmatParentOverlayToOverlayTransform ) = 0; + + /** Shows the VR overlay. For dashboard overlays, only the Dashboard Manager is allowed to call this. */ + virtual EVROverlayError ShowOverlay( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** Hides the VR overlay. For dashboard overlays, only the Dashboard Manager is allowed to call this. */ + virtual EVROverlayError HideOverlay( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** Returns true if the overlay is visible. */ + virtual bool IsOverlayVisible( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** 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 */ + virtual EVROverlayError GetTransformForOverlayCoordinates( VROverlayHandle_t ulOverlayHandle, ETrackingUniverseOrigin eTrackingOrigin, HmdVector2_t coordinatesInOverlay, HmdMatrix34_t *pmatTransform ) = 0; + + // --------------------------------------------- + // Overlay input methods + // --------------------------------------------- + + /** Returns true and fills the event with the next event on the overlay's event queue, if there is one. + * If there are no events this method returns false. uncbVREvent should be the size in bytes of the VREvent_t struct */ + virtual bool PollNextOverlayEvent( VROverlayHandle_t ulOverlayHandle, VREvent_t *pEvent, uint32_t uncbVREvent ) = 0; + + /** Returns the current input settings for the specified overlay. */ + virtual EVROverlayError GetOverlayInputMethod( VROverlayHandle_t ulOverlayHandle, VROverlayInputMethod *peInputMethod ) = 0; + + /** Sets the input settings for the specified overlay. */ + virtual EVROverlayError SetOverlayInputMethod( VROverlayHandle_t ulOverlayHandle, VROverlayInputMethod eInputMethod ) = 0; + + /** Gets the mouse scaling factor that is used for mouse events. The actual texture may be a different size, but this is + * typically the size of the underlying UI in pixels. */ + virtual EVROverlayError GetOverlayMouseScale( VROverlayHandle_t ulOverlayHandle, HmdVector2_t *pvecMouseScale ) = 0; + + /** Sets the mouse scaling factor that is used for mouse events. The actual texture may be a different size, but this is + * typically the size of the underlying UI in pixels (not in world space). */ + virtual EVROverlayError SetOverlayMouseScale( VROverlayHandle_t ulOverlayHandle, const HmdVector2_t *pvecMouseScale ) = 0; + + /** Computes the overlay-space pixel coordinates of where the ray intersects the overlay with the + * specified settings. Returns false if there is no intersection. */ + virtual bool ComputeOverlayIntersection( VROverlayHandle_t ulOverlayHandle, const VROverlayIntersectionParams_t *pParams, VROverlayIntersectionResults_t *pResults ) = 0; + + /** Processes mouse input from the specified controller as though it were a mouse pointed at a compositor overlay with the + * specified settings. The controller is treated like a laser pointer on the -z axis. The point where the laser pointer would + * intersect with the overlay is the mouse position, the trigger is left mouse, and the track pad is right mouse. + * + * Return true if the controller is pointed at the overlay and an event was generated. */ + virtual bool HandleControllerOverlayInteractionAsMouse( VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t unControllerDeviceIndex ) = 0; + + /** Returns true if the specified overlay is the hover target. An overlay is the hover target when it is the last overlay "moused over" + * by the virtual mouse pointer */ + virtual bool IsHoverTargetOverlay( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** Returns the current Gamepad focus overlay */ + virtual vr::VROverlayHandle_t GetGamepadFocusOverlay() = 0; + + /** Sets the current Gamepad focus overlay */ + virtual EVROverlayError SetGamepadFocusOverlay( VROverlayHandle_t ulNewFocusOverlay ) = 0; + + /** Sets an overlay's neighbor. This will also set the neighbor of the "to" overlay + * to point back to the "from" overlay. If an overlay's neighbor is set to invalid both + * ends will be cleared */ + virtual EVROverlayError SetOverlayNeighbor( EOverlayDirection eDirection, VROverlayHandle_t ulFrom, VROverlayHandle_t ulTo ) = 0; + + /** Changes the Gamepad focus from one overlay to one of its neighbors. Returns VROverlayError_NoNeighbor if there is no + * neighbor in that direction */ + virtual EVROverlayError MoveGamepadFocusToNeighbor( EOverlayDirection eDirection, VROverlayHandle_t ulFrom ) = 0; + + // --------------------------------------------- + // Overlay texture methods + // --------------------------------------------- + + /** Texture to draw for the overlay. This function can only be called by the overlay's creator or renderer process (see SetOverlayRenderingPid) . + * + * OpenGL dirty state: + * glBindTexture + */ + virtual EVROverlayError SetOverlayTexture( VROverlayHandle_t ulOverlayHandle, const Texture_t *pTexture ) = 0; + + /** Use this to tell the overlay system to release the texture set for this overlay. */ + virtual EVROverlayError ClearOverlayTexture( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** Separate interface for providing the data as a stream of bytes, but there is an upper bound on data + * that can be sent. This function can only be called by the overlay's renderer process. */ + virtual EVROverlayError SetOverlayRaw( VROverlayHandle_t ulOverlayHandle, void *pvBuffer, uint32_t unWidth, uint32_t unHeight, uint32_t unDepth ) = 0; + + /** Separate interface for providing the image through a filename: can be png or jpg, and should not be bigger than 1920x1080. + * This function can only be called by the overlay's renderer process */ + virtual EVROverlayError SetOverlayFromFile( VROverlayHandle_t ulOverlayHandle, const char *pchFilePath ) = 0; + + /** Get the native texture handle/device for an overlay you have created. + * On windows this handle will be a ID3D11ShaderResourceView with a ID3D11Texture2D bound. + * + * The texture will always be sized to match the backing texture you supplied in SetOverlayTexture above. + * + * You MUST call ReleaseNativeOverlayHandle() with pNativeTextureHandle once you are done with this texture. + * + * pNativeTextureHandle is an OUTPUT, it will be a pointer to a ID3D11ShaderResourceView *. + * pNativeTextureRef is an INPUT and should be a ID3D11Resource *. The device used by pNativeTextureRef will be used to bind pNativeTextureHandle. + */ + 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; + + /** Release the pNativeTextureHandle provided from the GetOverlayTexture call, this allows the system to free the underlying GPU resources for this object, + * so only do it once you stop rendering this texture. + */ + virtual EVROverlayError ReleaseNativeOverlayHandle( VROverlayHandle_t ulOverlayHandle, void *pNativeTextureHandle ) = 0; + + /** Get the size of the overlay texture */ + virtual EVROverlayError GetOverlayTextureSize( VROverlayHandle_t ulOverlayHandle, uint32_t *pWidth, uint32_t *pHeight ) = 0; + + // ---------------------------------------------- + // Dashboard Overlay Methods + // ---------------------------------------------- + + /** Creates a dashboard overlay and returns its handle */ + virtual EVROverlayError CreateDashboardOverlay( const char *pchOverlayKey, const char *pchOverlayFriendlyName, VROverlayHandle_t * pMainHandle, VROverlayHandle_t *pThumbnailHandle ) = 0; + + /** Returns true if the dashboard is visible */ + virtual bool IsDashboardVisible() = 0; + + /** returns true if the dashboard is visible and the specified overlay is the active system Overlay */ + virtual bool IsActiveDashboardOverlay( VROverlayHandle_t ulOverlayHandle ) = 0; + + /** Sets the dashboard overlay to only appear when the specified process ID has scene focus */ + virtual EVROverlayError SetDashboardOverlaySceneProcess( VROverlayHandle_t ulOverlayHandle, uint32_t unProcessId ) = 0; + + /** Gets the process ID that this dashboard overlay requires to have scene focus */ + virtual EVROverlayError GetDashboardOverlaySceneProcess( VROverlayHandle_t ulOverlayHandle, uint32_t *punProcessId ) = 0; + + /** Shows the dashboard. */ + virtual void ShowDashboard( const char *pchOverlayToShow ) = 0; + + /** Returns the tracked device that has the laser pointer in the dashboard */ + virtual vr::TrackedDeviceIndex_t GetPrimaryDashboardDevice() = 0; + + // --------------------------------------------- + // Keyboard methods + // --------------------------------------------- + + /** Show the virtual keyboard to accept input **/ + virtual EVROverlayError ShowKeyboard( EGamepadTextInputMode eInputMode, EGamepadTextInputLineMode eLineInputMode, const char *pchDescription, uint32_t unCharMax, const char *pchExistingText, bool bUseMinimalMode, uint64_t uUserValue ) = 0; + + virtual EVROverlayError ShowKeyboardForOverlay( VROverlayHandle_t ulOverlayHandle, EGamepadTextInputMode eInputMode, EGamepadTextInputLineMode eLineInputMode, const char *pchDescription, uint32_t unCharMax, const char *pchExistingText, bool bUseMinimalMode, uint64_t uUserValue ) = 0; + + /** Get the text that was entered into the text input **/ + virtual uint32_t GetKeyboardText( VR_OUT_STRING() char *pchText, uint32_t cchText ) = 0; + + /** Hide the virtual keyboard **/ + virtual void HideKeyboard() = 0; + + /** Set the position of the keyboard in world space **/ + virtual void SetKeyboardTransformAbsolute( ETrackingUniverseOrigin eTrackingOrigin, const HmdMatrix34_t *pmatTrackingOriginToKeyboardTransform ) = 0; + + /** 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 **/ + virtual void SetKeyboardPositionForOverlay( VROverlayHandle_t ulOverlayHandle, HmdRect2_t avoidRect ) = 0; + + // --------------------------------------------- + // Overlay input methods + // --------------------------------------------- + + /** Sets a list of primitives to be used for controller ray intersection + * typically the size of the underlying UI in pixels (not in world space). */ + virtual EVROverlayError SetOverlayIntersectionMask( VROverlayHandle_t ulOverlayHandle, VROverlayIntersectionMaskPrimitive_t *pMaskPrimitives, uint32_t unNumMaskPrimitives, uint32_t unPrimitiveSize = sizeof( VROverlayIntersectionMaskPrimitive_t ) ) = 0; + + virtual EVROverlayError GetOverlayFlags( VROverlayHandle_t ulOverlayHandle, uint32_t *pFlags ) = 0; + + // --------------------------------------------- + // Message box methods + // --------------------------------------------- + + /** Show the message overlay. This will block and return you a result. **/ + 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; + }; + + static const char * const IVROverlay_Version = "IVROverlay_016"; + +} // namespace vr + +// ivrrendermodels.h +namespace vr +{ + +static const char * const k_pch_Controller_Component_GDC2015 = "gdc2015"; // Canonical coordinate system of the gdc 2015 wired controller, provided for backwards compatibility +static const char * const k_pch_Controller_Component_Base = "base"; // For controllers with an unambiguous 'base'. +static const char * const k_pch_Controller_Component_Tip = "tip"; // For controllers with an unambiguous 'tip' (used for 'laser-pointing') +static 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 +static const char * const k_pch_Controller_Component_Status = "status"; // 1:1 aspect ratio status area, with canonical [0,1] uv mapping + +#pragma pack( push, 8 ) + +/** Errors that can occur with the VR compositor */ +enum EVRRenderModelError +{ + VRRenderModelError_None = 0, + VRRenderModelError_Loading = 100, + VRRenderModelError_NotSupported = 200, + VRRenderModelError_InvalidArg = 300, + VRRenderModelError_InvalidModel = 301, + VRRenderModelError_NoShapes = 302, + VRRenderModelError_MultipleShapes = 303, + VRRenderModelError_TooManyVertices = 304, + VRRenderModelError_MultipleTextures = 305, + VRRenderModelError_BufferTooSmall = 306, + VRRenderModelError_NotEnoughNormals = 307, + VRRenderModelError_NotEnoughTexCoords = 308, + + VRRenderModelError_InvalidTexture = 400, +}; + +typedef uint32_t VRComponentProperties; + +enum EVRComponentProperty +{ + VRComponentProperty_IsStatic = (1 << 0), + VRComponentProperty_IsVisible = (1 << 1), + VRComponentProperty_IsTouched = (1 << 2), + VRComponentProperty_IsPressed = (1 << 3), + VRComponentProperty_IsScrolled = (1 << 4), +}; + +/** Describes state information about a render-model component, including transforms and other dynamic properties */ +struct RenderModel_ComponentState_t +{ + HmdMatrix34_t mTrackingToComponentRenderModel; // Transform required when drawing the component render model + HmdMatrix34_t mTrackingToComponentLocal; // Transform available for attaching to a local component coordinate system (-Z out from surface ) + VRComponentProperties uProperties; +}; + +/** A single vertex in a render model */ +struct RenderModel_Vertex_t +{ + HmdVector3_t vPosition; // position in meters in device space + HmdVector3_t vNormal; + float rfTextureCoord[2]; +}; + +/** A texture map for use on a render model */ +#if defined(__linux__) || defined(__APPLE__) +// This structure was originally defined mis-packed on Linux, preserved for +// compatibility. +#pragma pack( push, 4 ) +#endif + +struct RenderModel_TextureMap_t +{ + uint16_t unWidth, unHeight; // width and height of the texture map in pixels + const uint8_t *rubTextureMapData; // Map texture data. All textures are RGBA with 8 bits per channel per pixel. Data size is width * height * 4ub +}; +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( pop ) +#endif + +/** Session unique texture identifier. Rendermodels which share the same texture will have the same id. +IDs <0 denote the texture is not present */ + +typedef int32_t TextureID_t; + +const TextureID_t INVALID_TEXTURE_ID = -1; + +#if defined(__linux__) || defined(__APPLE__) +// This structure was originally defined mis-packed on Linux, preserved for +// compatibility. +#pragma pack( push, 4 ) +#endif + +struct RenderModel_t +{ + const RenderModel_Vertex_t *rVertexData; // Vertex data for the mesh + uint32_t unVertexCount; // Number of vertices in the vertex data + const uint16_t *rIndexData; // Indices into the vertex data for each triangle + uint32_t unTriangleCount; // Number of triangles in the mesh. Index count is 3 * TriangleCount + TextureID_t diffuseTextureId; // Session unique texture identifier. Rendermodels which share the same texture will have the same id. <0 == texture not present +}; +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( pop ) +#endif + + +struct RenderModel_ControllerMode_State_t +{ + bool bScrollWheelVisible; // is this controller currently set to be in a scroll wheel mode +}; + +#pragma pack( pop ) + +class IVRRenderModels +{ +public: + + /** Loads and returns a render model for use in the application. pchRenderModelName should be a render model name + * from the Prop_RenderModelName_String property or an absolute path name to a render model on disk. + * + * The resulting render model is valid until VR_Shutdown() is called or until FreeRenderModel() is called. When the + * application is finished with the render model it should call FreeRenderModel() to free the memory associated + * with the model. + * + * The method returns VRRenderModelError_Loading while the render model is still being loaded. + * The method returns VRRenderModelError_None once loaded successfully, otherwise will return an error. */ + virtual EVRRenderModelError LoadRenderModel_Async( const char *pchRenderModelName, RenderModel_t **ppRenderModel ) = 0; + + /** Frees a previously returned render model + * It is safe to call this on a null ptr. */ + virtual void FreeRenderModel( RenderModel_t *pRenderModel ) = 0; + + /** Loads and returns a texture for use in the application. */ + virtual EVRRenderModelError LoadTexture_Async( TextureID_t textureId, RenderModel_TextureMap_t **ppTexture ) = 0; + + /** Frees a previously returned texture + * It is safe to call this on a null ptr. */ + virtual void FreeTexture( RenderModel_TextureMap_t *pTexture ) = 0; + + /** Creates a D3D11 texture and loads data into it. */ + virtual EVRRenderModelError LoadTextureD3D11_Async( TextureID_t textureId, void *pD3D11Device, void **ppD3D11Texture2D ) = 0; + + /** Helper function to copy the bits into an existing texture. */ + virtual EVRRenderModelError LoadIntoTextureD3D11_Async( TextureID_t textureId, void *pDstTexture ) = 0; + + /** Use this to free textures created with LoadTextureD3D11_Async instead of calling Release on them. */ + virtual void FreeTextureD3D11( void *pD3D11Texture2D ) = 0; + + /** Use this to get the names of available render models. Index does not correlate to a tracked device index, but + * is only used for iterating over all available render models. If the index is out of range, this function will return 0. + * Otherwise, it will return the size of the buffer required for the name. */ + virtual uint32_t GetRenderModelName( uint32_t unRenderModelIndex, VR_OUT_STRING() char *pchRenderModelName, uint32_t unRenderModelNameLen ) = 0; + + /** Returns the number of available render models. */ + virtual uint32_t GetRenderModelCount() = 0; + + + /** Returns the number of components of the specified render model. + * Components are useful when client application wish to draw, label, or otherwise interact with components of tracked objects. + * Examples controller components: + * renderable things such as triggers, buttons + * non-renderable things which include coordinate systems such as 'tip', 'base', a neutral controller agnostic hand-pose + * If all controller components are enumerated and rendered, it will be equivalent to drawing the traditional render model + * Returns 0 if components not supported, >0 otherwise */ + virtual uint32_t GetComponentCount( const char *pchRenderModelName ) = 0; + + /** Use this to get the names of available components. Index does not correlate to a tracked device index, but + * is only used for iterating over all available components. If the index is out of range, this function will return 0. + * Otherwise, it will return the size of the buffer required for the name. */ + virtual uint32_t GetComponentName( const char *pchRenderModelName, uint32_t unComponentIndex, VR_OUT_STRING( ) char *pchComponentName, uint32_t unComponentNameLen ) = 0; + + /** Get the button mask for all buttons associated with this component + * If no buttons (or axes) are associated with this component, return 0 + * Note: multiple components may be associated with the same button. Ex: two grip buttons on a single controller. + * Note: A single component may be associated with multiple buttons. Ex: A trackpad which also provides "D-pad" functionality */ + virtual uint64_t GetComponentButtonMask( const char *pchRenderModelName, const char *pchComponentName ) = 0; + + /** Use this to get the render model name for the specified rendermode/component combination, to be passed to LoadRenderModel. + * If the component name is out of range, this function will return 0. + * Otherwise, it will return the size of the buffer required for the name. */ + virtual uint32_t GetComponentRenderModelName( const char *pchRenderModelName, const char *pchComponentName, VR_OUT_STRING( ) char *pchComponentRenderModelName, uint32_t unComponentRenderModelNameLen ) = 0; + + /** Use this to query information about the component, as a function of the controller state. + * + * For dynamic controller components (ex: trigger) values will reflect component motions + * For static components this will return a consistent value independent of the VRControllerState_t + * + * If the pchRenderModelName or pchComponentName is invalid, this will return false (and transforms will be set to identity). + * Otherwise, return true + * Note: For dynamic objects, visibility may be dynamic. (I.e., true/false will be returned based on controller state and controller mode state ) */ + 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; + + /** Returns true if the render model has a component with the specified name */ + virtual bool RenderModelHasComponent( const char *pchRenderModelName, const char *pchComponentName ) = 0; + + /** Returns the URL of the thumbnail image for this rendermodel */ + virtual uint32_t GetRenderModelThumbnailURL( const char *pchRenderModelName, VR_OUT_STRING() char *pchThumbnailURL, uint32_t unThumbnailURLLen, vr::EVRRenderModelError *peError ) = 0; + + /** 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 + * 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 + * model. */ + virtual uint32_t GetRenderModelOriginalPath( const char *pchRenderModelName, VR_OUT_STRING() char *pchOriginalPath, uint32_t unOriginalPathLen, vr::EVRRenderModelError *peError ) = 0; + + /** Returns a string for a render model error */ + virtual const char *GetRenderModelErrorNameFromEnum( vr::EVRRenderModelError error ) = 0; +}; + +static const char * const IVRRenderModels_Version = "IVRRenderModels_005"; + +} + + +// ivrextendeddisplay.h +namespace vr +{ + + /** NOTE: Use of this interface is not recommended in production applications. It will not work for displays which use + * direct-to-display mode. Creating our own window is also incompatible with the VR compositor and is not available when the compositor is running. */ + class IVRExtendedDisplay + { + public: + + /** Size and position that the window needs to be on the VR display. */ + virtual void GetWindowBounds( int32_t *pnX, int32_t *pnY, uint32_t *pnWidth, uint32_t *pnHeight ) = 0; + + /** Gets the viewport in the frame buffer to draw the output of the distortion into */ + virtual void GetEyeOutputViewport( EVREye eEye, uint32_t *pnX, uint32_t *pnY, uint32_t *pnWidth, uint32_t *pnHeight ) = 0; + + /** [D3D10/11 Only] + * Returns the adapter index and output index that the user should pass into EnumAdapters and EnumOutputs + * to create the device and swap chain in DX10 and DX11. If an error occurs both indices will be set to -1. + */ + virtual void GetDXGIOutputInfo( int32_t *pnAdapterIndex, int32_t *pnAdapterOutputIndex ) = 0; + + }; + + static const char * const IVRExtendedDisplay_Version = "IVRExtendedDisplay_001"; + +} + + +// ivrtrackedcamera.h +namespace vr +{ + +class IVRTrackedCamera +{ +public: + /** Returns a string for an error */ + virtual const char *GetCameraErrorNameFromEnum( vr::EVRTrackedCameraError eCameraError ) = 0; + + /** For convenience, same as tracked property request Prop_HasCamera_Bool */ + virtual vr::EVRTrackedCameraError HasCamera( vr::TrackedDeviceIndex_t nDeviceIndex, bool *pHasCamera ) = 0; + + /** Gets size of the image frame. */ + virtual vr::EVRTrackedCameraError GetCameraFrameSize( vr::TrackedDeviceIndex_t nDeviceIndex, vr::EVRTrackedCameraFrameType eFrameType, uint32_t *pnWidth, uint32_t *pnHeight, uint32_t *pnFrameBufferSize ) = 0; + + virtual vr::EVRTrackedCameraError GetCameraIntrinsics( vr::TrackedDeviceIndex_t nDeviceIndex, vr::EVRTrackedCameraFrameType eFrameType, vr::HmdVector2_t *pFocalLength, vr::HmdVector2_t *pCenter ) = 0; + + virtual vr::EVRTrackedCameraError GetCameraProjection( vr::TrackedDeviceIndex_t nDeviceIndex, vr::EVRTrackedCameraFrameType eFrameType, float flZNear, float flZFar, vr::HmdMatrix44_t *pProjection ) = 0; + + /** 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. + * 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. + * The camera should be considered a global resource accessible for shared consumption but not exclusive to any caller. + * The camera may go inactive due to lack of active consumers or headset idleness. */ + virtual vr::EVRTrackedCameraError AcquireVideoStreamingService( vr::TrackedDeviceIndex_t nDeviceIndex, vr::TrackedCameraHandle_t *pHandle ) = 0; + virtual vr::EVRTrackedCameraError ReleaseVideoStreamingService( vr::TrackedCameraHandle_t hTrackedCamera ) = 0; + + /** Copies the image frame into a caller's provided buffer. The image data is currently provided as RGBA data, 4 bytes per pixel. + * A caller can provide null for the framebuffer or frameheader if not desired. Requesting the frame header first, followed by the frame buffer allows + * the caller to determine if the frame as advanced per the frame header sequence. + * If there is no frame available yet, due to initial camera spinup or re-activation, the error will be VRTrackedCameraError_NoFrameAvailable. + * Ideally a caller should be polling at ~16ms intervals */ + virtual vr::EVRTrackedCameraError GetVideoStreamFrameBuffer( vr::TrackedCameraHandle_t hTrackedCamera, vr::EVRTrackedCameraFrameType eFrameType, void *pFrameBuffer, uint32_t nFrameBufferSize, vr::CameraVideoStreamFrameHeader_t *pFrameHeader, uint32_t nFrameHeaderSize ) = 0; + + /** Gets size of the image frame. */ + virtual vr::EVRTrackedCameraError GetVideoStreamTextureSize( vr::TrackedDeviceIndex_t nDeviceIndex, vr::EVRTrackedCameraFrameType eFrameType, vr::VRTextureBounds_t *pTextureBounds, uint32_t *pnWidth, uint32_t *pnHeight ) = 0; + + /** Access a shared D3D11 texture for the specified tracked camera stream. + * 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. + * Instead, use GetVideoStreamTextureSize() with VRTrackedCameraFrameType_Undistorted to determine the proper interior subregion bounds along with GetVideoStreamTextureD3D11() with + * VRTrackedCameraFrameType_MaximumUndistorted to provide the texture. The VRTrackedCameraFrameType_MaximumUndistorted will yield an image where the invalid regions are decoded + * 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 + * guarantees a rectangle where all pixels are valid. */ + virtual vr::EVRTrackedCameraError GetVideoStreamTextureD3D11( vr::TrackedCameraHandle_t hTrackedCamera, vr::EVRTrackedCameraFrameType eFrameType, void *pD3D11DeviceOrResource, void **ppD3D11ShaderResourceView, vr::CameraVideoStreamFrameHeader_t *pFrameHeader, uint32_t nFrameHeaderSize ) = 0; + + /** Access a shared GL texture for the specified tracked camera stream */ + virtual vr::EVRTrackedCameraError GetVideoStreamTextureGL( vr::TrackedCameraHandle_t hTrackedCamera, vr::EVRTrackedCameraFrameType eFrameType, vr::glUInt_t *pglTextureId, vr::CameraVideoStreamFrameHeader_t *pFrameHeader, uint32_t nFrameHeaderSize ) = 0; + virtual vr::EVRTrackedCameraError ReleaseVideoStreamTextureGL( vr::TrackedCameraHandle_t hTrackedCamera, vr::glUInt_t glTextureId ) = 0; +}; + +static const char * const IVRTrackedCamera_Version = "IVRTrackedCamera_003"; + +} // namespace vr + + +// ivrscreenshots.h +namespace vr +{ + +/** Errors that can occur with the VR compositor */ +enum EVRScreenshotError +{ + VRScreenshotError_None = 0, + VRScreenshotError_RequestFailed = 1, + VRScreenshotError_IncompatibleVersion = 100, + VRScreenshotError_NotFound = 101, + VRScreenshotError_BufferTooSmall = 102, + VRScreenshotError_ScreenshotAlreadyInProgress = 108, +}; + +/** Allows the application to generate screenshots */ +class IVRScreenshots +{ +public: + /** Request a screenshot of the requested type. + * A request of the VRScreenshotType_Stereo type will always + * work. Other types will depend on the underlying application + * support. + * The first file name is for the preview image and should be a + * regular screenshot (ideally from the left eye). The second + * is the VR screenshot in the correct format. They should be + * in the same aspect ratio. Formats per type: + * VRScreenshotType_Mono: the VR filename is ignored (can be + * nullptr), this is a normal flat single shot. + * VRScreenshotType_Stereo: The VR image should be a + * side-by-side with the left eye image on the left. + * VRScreenshotType_Cubemap: The VR image should be six square + * images composited horizontally. + * VRScreenshotType_StereoPanorama: above/below with left eye + * panorama being the above image. Image is typically square + * with the panorama being 2x horizontal. + * + * Note that the VR dashboard will call this function when + * the user presses the screenshot binding (currently System + * Button + Trigger). If Steam is running, the destination + * file names will be in %TEMP% and will be copied into + * Steam's screenshot library for the running application + * once SubmitScreenshot() is called. + * If Steam is not running, the paths will be in the user's + * documents folder under Documents\SteamVR\Screenshots. + * Other VR applications can call this to initiate a + * screenshot outside of user control. + * The destination file names do not need an extension, + * will be replaced with the correct one for the format + * which is currently .png. */ + virtual vr::EVRScreenshotError RequestScreenshot( vr::ScreenshotHandle_t *pOutScreenshotHandle, vr::EVRScreenshotType type, const char *pchPreviewFilename, const char *pchVRFilename ) = 0; + + /** Called by the running VR application to indicate that it + * wishes to be in charge of screenshots. If the + * application does not call this, the Compositor will only + * support VRScreenshotType_Stereo screenshots that will be + * captured without notification to the running app. + * Once hooked your application will receive a + * VREvent_RequestScreenshot event when the user presses the + * buttons to take a screenshot. */ + virtual vr::EVRScreenshotError HookScreenshot( VR_ARRAY_COUNT( numTypes ) const vr::EVRScreenshotType *pSupportedTypes, int numTypes ) = 0; + + /** When your application receives a + * VREvent_RequestScreenshot event, call these functions to get + * the details of the screenshot request. */ + virtual vr::EVRScreenshotType GetScreenshotPropertyType( vr::ScreenshotHandle_t screenshotHandle, vr::EVRScreenshotError *pError ) = 0; + + /** Get the filename for the preview or vr image (see + * vr::EScreenshotPropertyFilenames). The return value is + * the size of the string. */ + virtual uint32_t GetScreenshotPropertyFilename( vr::ScreenshotHandle_t screenshotHandle, vr::EVRScreenshotPropertyFilenames filenameType, VR_OUT_STRING() char *pchFilename, uint32_t cchFilename, vr::EVRScreenshotError *pError ) = 0; + + /** Call this if the application is taking the screen shot + * will take more than a few ms processing. This will result + * in an overlay being presented that shows a completion + * bar. */ + virtual vr::EVRScreenshotError UpdateScreenshotProgress( vr::ScreenshotHandle_t screenshotHandle, float flProgress ) = 0; + + /** Tells the compositor to take an internal screenshot of + * type VRScreenshotType_Stereo. It will take the current + * submitted scene textures of the running application and + * write them into the preview image and a side-by-side file + * for the VR image. + * This is similar to request screenshot, but doesn't ever + * talk to the application, just takes the shot and submits. */ + virtual vr::EVRScreenshotError TakeStereoScreenshot( vr::ScreenshotHandle_t *pOutScreenshotHandle, const char *pchPreviewFilename, const char *pchVRFilename ) = 0; + + /** Submit the completed screenshot. If Steam is running + * this will call into the Steam client and upload the + * screenshot to the screenshots section of the library for + * the running application. If Steam is not running, this + * function will display a notification to the user that the + * screenshot was taken. The paths should be full paths with + * extensions. + * File paths should be absolute including extensions. + * screenshotHandle can be k_unScreenshotHandleInvalid if this + * was a new shot taking by the app to be saved and not + * initiated by a user (achievement earned or something) */ + virtual vr::EVRScreenshotError SubmitScreenshot( vr::ScreenshotHandle_t screenshotHandle, vr::EVRScreenshotType type, const char *pchSourcePreviewFilename, const char *pchSourceVRFilename ) = 0; +}; + +static const char * const IVRScreenshots_Version = "IVRScreenshots_001"; + +} // namespace vr + + + +// ivrresources.h +namespace vr +{ + +class IVRResources +{ +public: + + // ------------------------------------ + // Shared Resource Methods + // ------------------------------------ + + /** Loads the specified resource into the provided buffer if large enough. + * Returns the size in bytes of the buffer required to hold the specified resource. */ + virtual uint32_t LoadSharedResource( const char *pchResourceName, char *pchBuffer, uint32_t unBufferLen ) = 0; + + /** Provides the full path to the specified resource. Resource names can include named directories for + * drivers and other things, and this resolves all of those and returns the actual physical path. + * pchResourceTypeDirectory is the subdirectory of resources to look in. */ + virtual uint32_t GetResourceFullPath( const char *pchResourceName, const char *pchResourceTypeDirectory, char *pchPathBuffer, uint32_t unBufferLen ) = 0; +}; + +static const char * const IVRResources_Version = "IVRResources_001"; + + +} +// ivrdrivermanager.h +namespace vr +{ + +class IVRDriverManager +{ +public: + virtual uint32_t GetDriverCount() const = 0; + + /** Returns the length of the number of bytes necessary to hold this string including the trailing null. */ + virtual uint32_t GetDriverName( vr::DriverId_t nDriver, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize ) = 0; +}; + +static const char * const IVRDriverManager_Version = "IVRDriverManager_001"; + +} // namespace vr + + +// End + +#endif // _OPENVR_API + + +namespace vr +{ + /** Finds the active installation of the VR API and initializes it. The provided path must be absolute + * or relative to the current working directory. These are the local install versions of the equivalent + * functions in steamvr.h and will work without a local Steam install. + * + * This path is to the "root" of the VR API install. That's the directory with + * the "drivers" directory and a platform (i.e. "win32") directory in it, not the directory with the DLL itself. + */ + inline IVRSystem *VR_Init( EVRInitError *peError, EVRApplicationType eApplicationType ); + + /** unloads vrclient.dll. Any interface pointers from the interface are + * invalid after this point */ + inline void VR_Shutdown(); + + /** Returns true if there is an HMD attached. This check is as lightweight as possible and + * can be called outside of VR_Init/VR_Shutdown. It should be used when an application wants + * to know if initializing VR is a possibility but isn't ready to take that step yet. + */ + VR_INTERFACE bool VR_CALLTYPE VR_IsHmdPresent(); + + /** Returns true if the OpenVR runtime is installed. */ + VR_INTERFACE bool VR_CALLTYPE VR_IsRuntimeInstalled(); + + /** Returns where the OpenVR runtime is installed. */ + VR_INTERFACE const char *VR_CALLTYPE VR_RuntimePath(); + + /** Returns the name of the enum value for an EVRInitError. This function may be called outside of VR_Init()/VR_Shutdown(). */ + VR_INTERFACE const char *VR_CALLTYPE VR_GetVRInitErrorAsSymbol( EVRInitError error ); + + /** Returns an English string for an EVRInitError. Applications should call VR_GetVRInitErrorAsSymbol instead and + * use that as a key to look up their own localized error message. This function may be called outside of VR_Init()/VR_Shutdown(). */ + VR_INTERFACE const char *VR_CALLTYPE VR_GetVRInitErrorAsEnglishDescription( EVRInitError error ); + + /** Returns the interface of the specified version. This method must be called after VR_Init. The + * pointer returned is valid until VR_Shutdown is called. + */ + VR_INTERFACE void *VR_CALLTYPE VR_GetGenericInterface( const char *pchInterfaceVersion, EVRInitError *peError ); + + /** Returns whether the interface of the specified version exists. + */ + VR_INTERFACE bool VR_CALLTYPE VR_IsInterfaceVersionValid( const char *pchInterfaceVersion ); + + /** Returns a token that represents whether the VR interface handles need to be reloaded */ + VR_INTERFACE uint32_t VR_CALLTYPE VR_GetInitToken(); + + // These typedefs allow old enum names from SDK 0.9.11 to be used in applications. + // They will go away in the future. + typedef EVRInitError HmdError; + typedef EVREye Hmd_Eye; + typedef EColorSpace ColorSpace; + typedef ETrackingResult HmdTrackingResult; + typedef ETrackedDeviceClass TrackedDeviceClass; + typedef ETrackingUniverseOrigin TrackingUniverseOrigin; + typedef ETrackedDeviceProperty TrackedDeviceProperty; + typedef ETrackedPropertyError TrackedPropertyError; + typedef EVRSubmitFlags VRSubmitFlags_t; + typedef EVRState VRState_t; + typedef ECollisionBoundsStyle CollisionBoundsStyle_t; + typedef EVROverlayError VROverlayError; + typedef EVRFirmwareError VRFirmwareError; + typedef EVRCompositorError VRCompositorError; + typedef EVRScreenshotError VRScreenshotsError; + + inline uint32_t &VRToken() + { + static uint32_t token; + return token; + } + + class COpenVRContext + { + public: + COpenVRContext() { Clear(); } + void Clear(); + + inline void CheckClear() + { + if ( VRToken() != VR_GetInitToken() ) + { + Clear(); + VRToken() = VR_GetInitToken(); + } + } + + IVRSystem *VRSystem() + { + CheckClear(); + if ( m_pVRSystem == nullptr ) + { + EVRInitError eError; + m_pVRSystem = ( IVRSystem * )VR_GetGenericInterface( IVRSystem_Version, &eError ); + } + return m_pVRSystem; + } + IVRChaperone *VRChaperone() + { + CheckClear(); + if ( m_pVRChaperone == nullptr ) + { + EVRInitError eError; + m_pVRChaperone = ( IVRChaperone * )VR_GetGenericInterface( IVRChaperone_Version, &eError ); + } + return m_pVRChaperone; + } + + IVRChaperoneSetup *VRChaperoneSetup() + { + CheckClear(); + if ( m_pVRChaperoneSetup == nullptr ) + { + EVRInitError eError; + m_pVRChaperoneSetup = ( IVRChaperoneSetup * )VR_GetGenericInterface( IVRChaperoneSetup_Version, &eError ); + } + return m_pVRChaperoneSetup; + } + + IVRCompositor *VRCompositor() + { + CheckClear(); + if ( m_pVRCompositor == nullptr ) + { + EVRInitError eError; + m_pVRCompositor = ( IVRCompositor * )VR_GetGenericInterface( IVRCompositor_Version, &eError ); + } + return m_pVRCompositor; + } + + IVROverlay *VROverlay() + { + CheckClear(); + if ( m_pVROverlay == nullptr ) + { + EVRInitError eError; + m_pVROverlay = ( IVROverlay * )VR_GetGenericInterface( IVROverlay_Version, &eError ); + } + return m_pVROverlay; + } + + IVRResources *VRResources() + { + CheckClear(); + if ( m_pVRResources == nullptr ) + { + EVRInitError eError; + m_pVRResources = (IVRResources *)VR_GetGenericInterface( IVRResources_Version, &eError ); + } + return m_pVRResources; + } + + IVRScreenshots *VRScreenshots() + { + CheckClear(); + if ( m_pVRScreenshots == nullptr ) + { + EVRInitError eError; + m_pVRScreenshots = ( IVRScreenshots * )VR_GetGenericInterface( IVRScreenshots_Version, &eError ); + } + return m_pVRScreenshots; + } + + IVRRenderModels *VRRenderModels() + { + CheckClear(); + if ( m_pVRRenderModels == nullptr ) + { + EVRInitError eError; + m_pVRRenderModels = ( IVRRenderModels * )VR_GetGenericInterface( IVRRenderModels_Version, &eError ); + } + return m_pVRRenderModels; + } + + IVRExtendedDisplay *VRExtendedDisplay() + { + CheckClear(); + if ( m_pVRExtendedDisplay == nullptr ) + { + EVRInitError eError; + m_pVRExtendedDisplay = ( IVRExtendedDisplay * )VR_GetGenericInterface( IVRExtendedDisplay_Version, &eError ); + } + return m_pVRExtendedDisplay; + } + + IVRSettings *VRSettings() + { + CheckClear(); + if ( m_pVRSettings == nullptr ) + { + EVRInitError eError; + m_pVRSettings = ( IVRSettings * )VR_GetGenericInterface( IVRSettings_Version, &eError ); + } + return m_pVRSettings; + } + + IVRApplications *VRApplications() + { + CheckClear(); + if ( m_pVRApplications == nullptr ) + { + EVRInitError eError; + m_pVRApplications = ( IVRApplications * )VR_GetGenericInterface( IVRApplications_Version, &eError ); + } + return m_pVRApplications; + } + + IVRTrackedCamera *VRTrackedCamera() + { + CheckClear(); + if ( m_pVRTrackedCamera == nullptr ) + { + EVRInitError eError; + m_pVRTrackedCamera = ( IVRTrackedCamera * )VR_GetGenericInterface( IVRTrackedCamera_Version, &eError ); + } + return m_pVRTrackedCamera; + } + + IVRDriverManager *VRDriverManager() + { + CheckClear(); + if ( !m_pVRDriverManager ) + { + EVRInitError eError; + m_pVRDriverManager = ( IVRDriverManager * )VR_GetGenericInterface( IVRDriverManager_Version, &eError ); + } + return m_pVRDriverManager; + } + + private: + IVRSystem *m_pVRSystem; + IVRChaperone *m_pVRChaperone; + IVRChaperoneSetup *m_pVRChaperoneSetup; + IVRCompositor *m_pVRCompositor; + IVROverlay *m_pVROverlay; + IVRResources *m_pVRResources; + IVRRenderModels *m_pVRRenderModels; + IVRExtendedDisplay *m_pVRExtendedDisplay; + IVRSettings *m_pVRSettings; + IVRApplications *m_pVRApplications; + IVRTrackedCamera *m_pVRTrackedCamera; + IVRScreenshots *m_pVRScreenshots; + IVRDriverManager *m_pVRDriverManager; + }; + + inline COpenVRContext &OpenVRInternal_ModuleContext() + { + static void *ctx[ sizeof( COpenVRContext ) / sizeof( void * ) ]; + return *( COpenVRContext * )ctx; // bypass zero-init constructor + } + + inline IVRSystem *VR_CALLTYPE VRSystem() { return OpenVRInternal_ModuleContext().VRSystem(); } + inline IVRChaperone *VR_CALLTYPE VRChaperone() { return OpenVRInternal_ModuleContext().VRChaperone(); } + inline IVRChaperoneSetup *VR_CALLTYPE VRChaperoneSetup() { return OpenVRInternal_ModuleContext().VRChaperoneSetup(); } + inline IVRCompositor *VR_CALLTYPE VRCompositor() { return OpenVRInternal_ModuleContext().VRCompositor(); } + inline IVROverlay *VR_CALLTYPE VROverlay() { return OpenVRInternal_ModuleContext().VROverlay(); } + inline IVRScreenshots *VR_CALLTYPE VRScreenshots() { return OpenVRInternal_ModuleContext().VRScreenshots(); } + inline IVRRenderModels *VR_CALLTYPE VRRenderModels() { return OpenVRInternal_ModuleContext().VRRenderModels(); } + inline IVRApplications *VR_CALLTYPE VRApplications() { return OpenVRInternal_ModuleContext().VRApplications(); } + inline IVRSettings *VR_CALLTYPE VRSettings() { return OpenVRInternal_ModuleContext().VRSettings(); } + inline IVRResources *VR_CALLTYPE VRResources() { return OpenVRInternal_ModuleContext().VRResources(); } + inline IVRExtendedDisplay *VR_CALLTYPE VRExtendedDisplay() { return OpenVRInternal_ModuleContext().VRExtendedDisplay(); } + inline IVRTrackedCamera *VR_CALLTYPE VRTrackedCamera() { return OpenVRInternal_ModuleContext().VRTrackedCamera(); } + inline IVRDriverManager *VR_CALLTYPE VRDriverManager() { return OpenVRInternal_ModuleContext().VRDriverManager(); } + + inline void COpenVRContext::Clear() + { + m_pVRSystem = nullptr; + m_pVRChaperone = nullptr; + m_pVRChaperoneSetup = nullptr; + m_pVRCompositor = nullptr; + m_pVROverlay = nullptr; + m_pVRRenderModels = nullptr; + m_pVRExtendedDisplay = nullptr; + m_pVRSettings = nullptr; + m_pVRApplications = nullptr; + m_pVRTrackedCamera = nullptr; + m_pVRResources = nullptr; + m_pVRScreenshots = nullptr; + m_pVRDriverManager = nullptr; + } + + VR_INTERFACE uint32_t VR_CALLTYPE VR_InitInternal( EVRInitError *peError, EVRApplicationType eApplicationType ); + VR_INTERFACE void VR_CALLTYPE VR_ShutdownInternal(); + + /** Finds the active installation of vrclient.dll and initializes it */ + inline IVRSystem *VR_Init( EVRInitError *peError, EVRApplicationType eApplicationType ) + { + IVRSystem *pVRSystem = nullptr; + + EVRInitError eError; + VRToken() = VR_InitInternal( &eError, eApplicationType ); + COpenVRContext &ctx = OpenVRInternal_ModuleContext(); + ctx.Clear(); + + if ( eError == VRInitError_None ) + { + if ( VR_IsInterfaceVersionValid( IVRSystem_Version ) ) + { + pVRSystem = VRSystem(); + } + else + { + VR_ShutdownInternal(); + eError = VRInitError_Init_InterfaceNotFound; + } + } + + if ( peError ) + *peError = eError; + return pVRSystem; + } + + /** unloads vrclient.dll. Any interface pointers from the interface are + * invalid after this point */ + inline void VR_Shutdown() + { + VR_ShutdownInternal(); + } +} diff --git a/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Headers/openvr_api.cs b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Headers/openvr_api.cs new file mode 100644 index 000000000..2596b3783 --- /dev/null +++ b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Headers/openvr_api.cs @@ -0,0 +1,4997 @@ +//======= Copyright (c) Valve Corporation, All rights reserved. =============== +// +// Purpose: This file contains C#/managed code bindings for the OpenVR interfaces +// This file is auto-generated, do not edit it. +// +//============================================================================= + +using System; +using System.Runtime.InteropServices; +using Valve.VR; + +namespace Valve.VR +{ + +[StructLayout(LayoutKind.Sequential)] +public struct IVRSystem +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetRecommendedRenderTargetSize(ref uint pnWidth, ref uint pnHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRecommendedRenderTargetSize GetRecommendedRenderTargetSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HmdMatrix44_t _GetProjectionMatrix(EVREye eEye, float fNearZ, float fFarZ); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetProjectionMatrix GetProjectionMatrix; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetProjectionRaw(EVREye eEye, ref float pfLeft, ref float pfRight, ref float pfTop, ref float pfBottom); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetProjectionRaw GetProjectionRaw; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ComputeDistortion(EVREye eEye, float fU, float fV, ref DistortionCoordinates_t pDistortionCoordinates); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ComputeDistortion ComputeDistortion; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HmdMatrix34_t _GetEyeToHeadTransform(EVREye eEye); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetEyeToHeadTransform GetEyeToHeadTransform; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetTimeSinceLastVsync(ref float pfSecondsSinceLastVsync, ref ulong pulFrameCounter); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTimeSinceLastVsync GetTimeSinceLastVsync; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate int _GetD3D9AdapterIndex(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetD3D9AdapterIndex GetD3D9AdapterIndex; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetDXGIOutputInfo(ref int pnAdapterIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDXGIOutputInfo GetDXGIOutputInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetOutputDevice(ref ulong pnDevice, ETextureType textureType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOutputDevice GetOutputDevice; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsDisplayOnDesktop(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsDisplayOnDesktop IsDisplayOnDesktop; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _SetDisplayVisibility(bool bIsVisibleOnDesktop); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetDisplayVisibility SetDisplayVisibility; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin eOrigin, float fPredictedSecondsToPhotonsFromNow, [In, Out] TrackedDevicePose_t[] pTrackedDevicePoseArray, uint unTrackedDevicePoseArrayCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDeviceToAbsoluteTrackingPose GetDeviceToAbsoluteTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ResetSeatedZeroPose(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ResetSeatedZeroPose ResetSeatedZeroPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HmdMatrix34_t _GetSeatedZeroPoseToStandingAbsoluteTrackingPose(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetSeatedZeroPoseToStandingAbsoluteTrackingPose GetSeatedZeroPoseToStandingAbsoluteTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HmdMatrix34_t _GetRawZeroPoseToStandingAbsoluteTrackingPose(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRawZeroPoseToStandingAbsoluteTrackingPose GetRawZeroPoseToStandingAbsoluteTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetSortedTrackedDeviceIndicesOfClass(ETrackedDeviceClass eTrackedDeviceClass, [In, Out] uint[] punTrackedDeviceIndexArray, uint unTrackedDeviceIndexArrayCount, uint unRelativeToTrackedDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetSortedTrackedDeviceIndicesOfClass GetSortedTrackedDeviceIndicesOfClass; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EDeviceActivityLevel _GetTrackedDeviceActivityLevel(uint unDeviceId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTrackedDeviceActivityLevel GetTrackedDeviceActivityLevel; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ApplyTransform(ref TrackedDevicePose_t pOutputPose, ref TrackedDevicePose_t pTrackedDevicePose, ref HmdMatrix34_t pTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ApplyTransform ApplyTransform; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole unDeviceType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTrackedDeviceIndexForControllerRole GetTrackedDeviceIndexForControllerRole; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ETrackedControllerRole _GetControllerRoleForTrackedDeviceIndex(uint unDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetControllerRoleForTrackedDeviceIndex GetControllerRoleForTrackedDeviceIndex; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ETrackedDeviceClass _GetTrackedDeviceClass(uint unDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTrackedDeviceClass GetTrackedDeviceClass; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsTrackedDeviceConnected(uint unDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsTrackedDeviceConnected IsTrackedDeviceConnected; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetBoolTrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetBoolTrackedDeviceProperty GetBoolTrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate float _GetFloatTrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetFloatTrackedDeviceProperty GetFloatTrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate int _GetInt32TrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetInt32TrackedDeviceProperty GetInt32TrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _GetUint64TrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetUint64TrackedDeviceProperty GetUint64TrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HmdMatrix34_t _GetMatrix34TrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetMatrix34TrackedDeviceProperty GetMatrix34TrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetStringTrackedDeviceProperty(uint unDeviceIndex, ETrackedDeviceProperty prop, System.Text.StringBuilder pchValue, uint unBufferSize, ref ETrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetStringTrackedDeviceProperty GetStringTrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetPropErrorNameFromEnum(ETrackedPropertyError error); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetPropErrorNameFromEnum GetPropErrorNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _PollNextEvent(ref VREvent_t pEvent, uint uncbVREvent); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PollNextEvent PollNextEvent; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _PollNextEventWithPose(ETrackingUniverseOrigin eOrigin, ref VREvent_t pEvent, uint uncbVREvent, ref TrackedDevicePose_t pTrackedDevicePose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PollNextEventWithPose PollNextEventWithPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetEventTypeNameFromEnum(EVREventType eType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetEventTypeNameFromEnum GetEventTypeNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HiddenAreaMesh_t _GetHiddenAreaMesh(EVREye eEye, EHiddenAreaMeshType type); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetHiddenAreaMesh GetHiddenAreaMesh; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetControllerState(uint unControllerDeviceIndex, ref VRControllerState_t pControllerState, uint unControllerStateSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetControllerState GetControllerState; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetControllerStateWithPose(ETrackingUniverseOrigin eOrigin, uint unControllerDeviceIndex, ref VRControllerState_t pControllerState, uint unControllerStateSize, ref TrackedDevicePose_t pTrackedDevicePose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetControllerStateWithPose GetControllerStateWithPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _TriggerHapticPulse(uint unControllerDeviceIndex, uint unAxisId, char usDurationMicroSec); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _TriggerHapticPulse TriggerHapticPulse; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetButtonIdNameFromEnum(EVRButtonId eButtonId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetButtonIdNameFromEnum GetButtonIdNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetControllerAxisTypeNameFromEnum(EVRControllerAxisType eAxisType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetControllerAxisTypeNameFromEnum GetControllerAxisTypeNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _CaptureInputFocus(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CaptureInputFocus CaptureInputFocus; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ReleaseInputFocus(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseInputFocus ReleaseInputFocus; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsInputFocusCapturedByAnotherProcess(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsInputFocusCapturedByAnotherProcess IsInputFocusCapturedByAnotherProcess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _DriverDebugRequest(uint unDeviceIndex, string pchRequest, string pchResponseBuffer, uint unResponseBufferSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _DriverDebugRequest DriverDebugRequest; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRFirmwareError _PerformFirmwareUpdate(uint unDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PerformFirmwareUpdate PerformFirmwareUpdate; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _AcknowledgeQuit_Exiting(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _AcknowledgeQuit_Exiting AcknowledgeQuit_Exiting; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _AcknowledgeQuit_UserPrompt(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _AcknowledgeQuit_UserPrompt AcknowledgeQuit_UserPrompt; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRExtendedDisplay +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetWindowBounds(ref int pnX, ref int pnY, ref uint pnWidth, ref uint pnHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWindowBounds GetWindowBounds; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetEyeOutputViewport(EVREye eEye, ref uint pnX, ref uint pnY, ref uint pnWidth, ref uint pnHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetEyeOutputViewport GetEyeOutputViewport; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetDXGIOutputInfo(ref int pnAdapterIndex, ref int pnAdapterOutputIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDXGIOutputInfo GetDXGIOutputInfo; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRTrackedCamera +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetCameraErrorNameFromEnum(EVRTrackedCameraError eCameraError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCameraErrorNameFromEnum GetCameraErrorNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _HasCamera(uint nDeviceIndex, ref bool pHasCamera); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HasCamera HasCamera; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetCameraFrameSize(uint nDeviceIndex, EVRTrackedCameraFrameType eFrameType, ref uint pnWidth, ref uint pnHeight, ref uint pnFrameBufferSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCameraFrameSize GetCameraFrameSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetCameraIntrinsics(uint nDeviceIndex, EVRTrackedCameraFrameType eFrameType, ref HmdVector2_t pFocalLength, ref HmdVector2_t pCenter); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCameraIntrinsics GetCameraIntrinsics; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetCameraProjection(uint nDeviceIndex, EVRTrackedCameraFrameType eFrameType, float flZNear, float flZFar, ref HmdMatrix44_t pProjection); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCameraProjection GetCameraProjection; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _AcquireVideoStreamingService(uint nDeviceIndex, ref ulong pHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _AcquireVideoStreamingService AcquireVideoStreamingService; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _ReleaseVideoStreamingService(ulong hTrackedCamera); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseVideoStreamingService ReleaseVideoStreamingService; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetVideoStreamFrameBuffer(ulong hTrackedCamera, EVRTrackedCameraFrameType eFrameType, IntPtr pFrameBuffer, uint nFrameBufferSize, ref CameraVideoStreamFrameHeader_t pFrameHeader, uint nFrameHeaderSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVideoStreamFrameBuffer GetVideoStreamFrameBuffer; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetVideoStreamTextureSize(uint nDeviceIndex, EVRTrackedCameraFrameType eFrameType, ref VRTextureBounds_t pTextureBounds, ref uint pnWidth, ref uint pnHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVideoStreamTextureSize GetVideoStreamTextureSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetVideoStreamTextureD3D11(ulong hTrackedCamera, EVRTrackedCameraFrameType eFrameType, IntPtr pD3D11DeviceOrResource, ref IntPtr ppD3D11ShaderResourceView, ref CameraVideoStreamFrameHeader_t pFrameHeader, uint nFrameHeaderSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVideoStreamTextureD3D11 GetVideoStreamTextureD3D11; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _GetVideoStreamTextureGL(ulong hTrackedCamera, EVRTrackedCameraFrameType eFrameType, ref uint pglTextureId, ref CameraVideoStreamFrameHeader_t pFrameHeader, uint nFrameHeaderSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVideoStreamTextureGL GetVideoStreamTextureGL; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRTrackedCameraError _ReleaseVideoStreamTextureGL(ulong hTrackedCamera, uint glTextureId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseVideoStreamTextureGL ReleaseVideoStreamTextureGL; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRApplications +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _AddApplicationManifest(string pchApplicationManifestFullPath, bool bTemporary); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _AddApplicationManifest AddApplicationManifest; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _RemoveApplicationManifest(string pchApplicationManifestFullPath); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RemoveApplicationManifest RemoveApplicationManifest; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsApplicationInstalled(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsApplicationInstalled IsApplicationInstalled; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetApplicationCount(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationCount GetApplicationCount; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _GetApplicationKeyByIndex(uint unApplicationIndex, System.Text.StringBuilder pchAppKeyBuffer, uint unAppKeyBufferLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationKeyByIndex GetApplicationKeyByIndex; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _GetApplicationKeyByProcessId(uint unProcessId, string pchAppKeyBuffer, uint unAppKeyBufferLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationKeyByProcessId GetApplicationKeyByProcessId; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _LaunchApplication(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LaunchApplication LaunchApplication; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _LaunchTemplateApplication(string pchTemplateAppKey, string pchNewAppKey, [In, Out] AppOverrideKeys_t[] pKeys, uint unKeys); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LaunchTemplateApplication LaunchTemplateApplication; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _LaunchApplicationFromMimeType(string pchMimeType, string pchArgs); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LaunchApplicationFromMimeType LaunchApplicationFromMimeType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _LaunchDashboardOverlay(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LaunchDashboardOverlay LaunchDashboardOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _CancelApplicationLaunch(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CancelApplicationLaunch CancelApplicationLaunch; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _IdentifyApplication(uint unProcessId, string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IdentifyApplication IdentifyApplication; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetApplicationProcessId(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationProcessId GetApplicationProcessId; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetApplicationsErrorNameFromEnum(EVRApplicationError error); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationsErrorNameFromEnum GetApplicationsErrorNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetApplicationPropertyString(string pchAppKey, EVRApplicationProperty eProperty, System.Text.StringBuilder pchPropertyValueBuffer, uint unPropertyValueBufferLen, ref EVRApplicationError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationPropertyString GetApplicationPropertyString; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetApplicationPropertyBool(string pchAppKey, EVRApplicationProperty eProperty, ref EVRApplicationError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationPropertyBool GetApplicationPropertyBool; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _GetApplicationPropertyUint64(string pchAppKey, EVRApplicationProperty eProperty, ref EVRApplicationError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationPropertyUint64 GetApplicationPropertyUint64; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _SetApplicationAutoLaunch(string pchAppKey, bool bAutoLaunch); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetApplicationAutoLaunch SetApplicationAutoLaunch; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetApplicationAutoLaunch(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationAutoLaunch GetApplicationAutoLaunch; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _SetDefaultApplicationForMimeType(string pchAppKey, string pchMimeType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetDefaultApplicationForMimeType SetDefaultApplicationForMimeType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetDefaultApplicationForMimeType(string pchMimeType, string pchAppKeyBuffer, uint unAppKeyBufferLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDefaultApplicationForMimeType GetDefaultApplicationForMimeType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetApplicationSupportedMimeTypes(string pchAppKey, string pchMimeTypesBuffer, uint unMimeTypesBuffer); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationSupportedMimeTypes GetApplicationSupportedMimeTypes; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetApplicationsThatSupportMimeType(string pchMimeType, string pchAppKeysThatSupportBuffer, uint unAppKeysThatSupportBuffer); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationsThatSupportMimeType GetApplicationsThatSupportMimeType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetApplicationLaunchArguments(uint unHandle, string pchArgs, uint unArgs); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationLaunchArguments GetApplicationLaunchArguments; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _GetStartingApplication(string pchAppKeyBuffer, uint unAppKeyBufferLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetStartingApplication GetStartingApplication; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationTransitionState _GetTransitionState(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTransitionState GetTransitionState; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _PerformApplicationPrelaunchCheck(string pchAppKey); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PerformApplicationPrelaunchCheck PerformApplicationPrelaunchCheck; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetApplicationsTransitionStateNameFromEnum(EVRApplicationTransitionState state); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetApplicationsTransitionStateNameFromEnum GetApplicationsTransitionStateNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsQuitUserPromptRequested(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsQuitUserPromptRequested IsQuitUserPromptRequested; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRApplicationError _LaunchInternalProcess(string pchBinaryPath, string pchArguments, string pchWorkingDirectory); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LaunchInternalProcess LaunchInternalProcess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetCurrentSceneProcessId(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCurrentSceneProcessId GetCurrentSceneProcessId; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRChaperone +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ChaperoneCalibrationState _GetCalibrationState(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCalibrationState GetCalibrationState; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetPlayAreaSize(ref float pSizeX, ref float pSizeZ); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetPlayAreaSize GetPlayAreaSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetPlayAreaRect(ref HmdQuad_t rect); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetPlayAreaRect GetPlayAreaRect; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ReloadInfo(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReloadInfo ReloadInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetSceneColor(HmdColor_t color); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetSceneColor SetSceneColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetBoundsColor(ref HmdColor_t pOutputColorArray, int nNumOutputColors, float flCollisionBoundsFadeDistance, ref HmdColor_t pOutputCameraColor); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetBoundsColor GetBoundsColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _AreBoundsVisible(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _AreBoundsVisible AreBoundsVisible; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ForceBoundsVisible(bool bForce); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ForceBoundsVisible ForceBoundsVisible; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRChaperoneSetup +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _CommitWorkingCopy(EChaperoneConfigFile configFile); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CommitWorkingCopy CommitWorkingCopy; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _RevertWorkingCopy(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RevertWorkingCopy RevertWorkingCopy; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingPlayAreaSize(ref float pSizeX, ref float pSizeZ); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingPlayAreaSize GetWorkingPlayAreaSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingPlayAreaRect(ref HmdQuad_t rect); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingPlayAreaRect GetWorkingPlayAreaRect; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingCollisionBoundsInfo([In, Out] HmdQuad_t[] pQuadsBuffer, ref uint punQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingCollisionBoundsInfo GetWorkingCollisionBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetLiveCollisionBoundsInfo([In, Out] HmdQuad_t[] pQuadsBuffer, ref uint punQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLiveCollisionBoundsInfo GetLiveCollisionBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingSeatedZeroPoseToRawTrackingPose(ref HmdMatrix34_t pmatSeatedZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingSeatedZeroPoseToRawTrackingPose GetWorkingSeatedZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingStandingZeroPoseToRawTrackingPose(ref HmdMatrix34_t pmatStandingZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingStandingZeroPoseToRawTrackingPose GetWorkingStandingZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingPlayAreaSize(float sizeX, float sizeZ); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingPlayAreaSize SetWorkingPlayAreaSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingCollisionBoundsInfo([In, Out] HmdQuad_t[] pQuadsBuffer, uint unQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingCollisionBoundsInfo SetWorkingCollisionBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingSeatedZeroPoseToRawTrackingPose(ref HmdMatrix34_t pMatSeatedZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingSeatedZeroPoseToRawTrackingPose SetWorkingSeatedZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingStandingZeroPoseToRawTrackingPose(ref HmdMatrix34_t pMatStandingZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingStandingZeroPoseToRawTrackingPose SetWorkingStandingZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ReloadFromDisk(EChaperoneConfigFile configFile); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReloadFromDisk ReloadFromDisk; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetLiveSeatedZeroPoseToRawTrackingPose(ref HmdMatrix34_t pmatSeatedZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLiveSeatedZeroPoseToRawTrackingPose GetLiveSeatedZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingCollisionBoundsTagsInfo([In, Out] byte[] pTagsBuffer, uint unTagCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingCollisionBoundsTagsInfo SetWorkingCollisionBoundsTagsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetLiveCollisionBoundsTagsInfo([In, Out] byte[] pTagsBuffer, ref uint punTagCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLiveCollisionBoundsTagsInfo GetLiveCollisionBoundsTagsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _SetWorkingPhysicalBoundsInfo([In, Out] HmdQuad_t[] pQuadsBuffer, uint unQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingPhysicalBoundsInfo SetWorkingPhysicalBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetLivePhysicalBoundsInfo([In, Out] HmdQuad_t[] pQuadsBuffer, ref uint punQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLivePhysicalBoundsInfo GetLivePhysicalBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ExportLiveToBuffer(System.Text.StringBuilder pBuffer, ref uint pnBufferLength); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ExportLiveToBuffer ExportLiveToBuffer; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ImportFromBufferToWorking(string pBuffer, uint nImportFlags); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ImportFromBufferToWorking ImportFromBufferToWorking; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRCompositor +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetTrackingSpace(ETrackingUniverseOrigin eOrigin); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetTrackingSpace SetTrackingSpace; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ETrackingUniverseOrigin _GetTrackingSpace(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTrackingSpace GetTrackingSpace; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _WaitGetPoses([In, Out] TrackedDevicePose_t[] pRenderPoseArray, uint unRenderPoseArrayCount, [In, Out] TrackedDevicePose_t[] pGamePoseArray, uint unGamePoseArrayCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _WaitGetPoses WaitGetPoses; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _GetLastPoses([In, Out] TrackedDevicePose_t[] pRenderPoseArray, uint unRenderPoseArrayCount, [In, Out] TrackedDevicePose_t[] pGamePoseArray, uint unGamePoseArrayCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLastPoses GetLastPoses; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _GetLastPoseForTrackedDeviceIndex(uint unDeviceIndex, ref TrackedDevicePose_t pOutputPose, ref TrackedDevicePose_t pOutputGamePose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLastPoseForTrackedDeviceIndex GetLastPoseForTrackedDeviceIndex; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _Submit(EVREye eEye, ref Texture_t pTexture, ref VRTextureBounds_t pBounds, EVRSubmitFlags nSubmitFlags); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _Submit Submit; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ClearLastSubmittedFrame(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ClearLastSubmittedFrame ClearLastSubmittedFrame; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _PostPresentHandoff(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PostPresentHandoff PostPresentHandoff; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetFrameTiming(ref Compositor_FrameTiming pTiming, uint unFramesAgo); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetFrameTiming GetFrameTiming; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetFrameTimings(ref Compositor_FrameTiming pTiming, uint nFrames); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetFrameTimings GetFrameTimings; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate float _GetFrameTimeRemaining(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetFrameTimeRemaining GetFrameTimeRemaining; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetCumulativeStats(ref Compositor_CumulativeStats pStats, uint nStatsSizeInBytes); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCumulativeStats GetCumulativeStats; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _FadeToColor(float fSeconds, float fRed, float fGreen, float fBlue, float fAlpha, bool bBackground); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FadeToColor FadeToColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HmdColor_t _GetCurrentFadeColor(bool bBackground); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCurrentFadeColor GetCurrentFadeColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _FadeGrid(float fSeconds, bool bFadeIn); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FadeGrid FadeGrid; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate float _GetCurrentGridAlpha(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCurrentGridAlpha GetCurrentGridAlpha; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _SetSkyboxOverride([In, Out] Texture_t[] pTextures, uint unTextureCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetSkyboxOverride SetSkyboxOverride; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ClearSkyboxOverride(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ClearSkyboxOverride ClearSkyboxOverride; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _CompositorBringToFront(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CompositorBringToFront CompositorBringToFront; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _CompositorGoToBack(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CompositorGoToBack CompositorGoToBack; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _CompositorQuit(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CompositorQuit CompositorQuit; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsFullscreen(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsFullscreen IsFullscreen; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetCurrentSceneFocusProcess(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCurrentSceneFocusProcess GetCurrentSceneFocusProcess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetLastFrameRenderer(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLastFrameRenderer GetLastFrameRenderer; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _CanRenderScene(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CanRenderScene CanRenderScene; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ShowMirrorWindow(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowMirrorWindow ShowMirrorWindow; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _HideMirrorWindow(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HideMirrorWindow HideMirrorWindow; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsMirrorWindowVisible(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsMirrorWindowVisible IsMirrorWindowVisible; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _CompositorDumpImages(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CompositorDumpImages CompositorDumpImages; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ShouldAppRenderWithLowResources(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShouldAppRenderWithLowResources ShouldAppRenderWithLowResources; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ForceInterleavedReprojectionOn(bool bOverride); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ForceInterleavedReprojectionOn ForceInterleavedReprojectionOn; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ForceReconnectProcess(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ForceReconnectProcess ForceReconnectProcess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SuspendRendering(bool bSuspend); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SuspendRendering SuspendRendering; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _GetMirrorTextureD3D11(EVREye eEye, IntPtr pD3D11DeviceOrResource, ref IntPtr ppD3D11ShaderResourceView); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetMirrorTextureD3D11 GetMirrorTextureD3D11; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ReleaseMirrorTextureD3D11(IntPtr pD3D11ShaderResourceView); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseMirrorTextureD3D11 ReleaseMirrorTextureD3D11; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRCompositorError _GetMirrorTextureGL(EVREye eEye, ref uint pglTextureId, IntPtr pglSharedTextureHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetMirrorTextureGL GetMirrorTextureGL; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ReleaseSharedGLTexture(uint glTextureId, IntPtr glSharedTextureHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseSharedGLTexture ReleaseSharedGLTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _LockGLSharedTextureForAccess(IntPtr glSharedTextureHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LockGLSharedTextureForAccess LockGLSharedTextureForAccess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _UnlockGLSharedTextureForAccess(IntPtr glSharedTextureHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _UnlockGLSharedTextureForAccess UnlockGLSharedTextureForAccess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetVulkanInstanceExtensionsRequired(System.Text.StringBuilder pchValue, uint unBufferSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVulkanInstanceExtensionsRequired GetVulkanInstanceExtensionsRequired; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetVulkanDeviceExtensionsRequired(IntPtr pPhysicalDevice, System.Text.StringBuilder pchValue, uint unBufferSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVulkanDeviceExtensionsRequired GetVulkanDeviceExtensionsRequired; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVROverlay +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _FindOverlay(string pchOverlayKey, ref ulong pOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FindOverlay FindOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _CreateOverlay(string pchOverlayKey, string pchOverlayName, ref ulong pOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CreateOverlay CreateOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _DestroyOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _DestroyOverlay DestroyOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetHighQualityOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetHighQualityOverlay SetHighQualityOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _GetHighQualityOverlay(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetHighQualityOverlay GetHighQualityOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetOverlayKey(ulong ulOverlayHandle, System.Text.StringBuilder pchValue, uint unBufferSize, ref EVROverlayError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayKey GetOverlayKey; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetOverlayName(ulong ulOverlayHandle, System.Text.StringBuilder pchValue, uint unBufferSize, ref EVROverlayError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayName GetOverlayName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayName(ulong ulOverlayHandle, string pchName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayName SetOverlayName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayImageData(ulong ulOverlayHandle, IntPtr pvBuffer, uint unBufferSize, ref uint punWidth, ref uint punHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayImageData GetOverlayImageData; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetOverlayErrorNameFromEnum(EVROverlayError error); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayErrorNameFromEnum GetOverlayErrorNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayRenderingPid(ulong ulOverlayHandle, uint unPID); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayRenderingPid SetOverlayRenderingPid; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetOverlayRenderingPid(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayRenderingPid GetOverlayRenderingPid; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayFlag(ulong ulOverlayHandle, VROverlayFlags eOverlayFlag, bool bEnabled); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayFlag SetOverlayFlag; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayFlag(ulong ulOverlayHandle, VROverlayFlags eOverlayFlag, ref bool pbEnabled); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayFlag GetOverlayFlag; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayColor(ulong ulOverlayHandle, float fRed, float fGreen, float fBlue); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayColor SetOverlayColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayColor(ulong ulOverlayHandle, ref float pfRed, ref float pfGreen, ref float pfBlue); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayColor GetOverlayColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayAlpha(ulong ulOverlayHandle, float fAlpha); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayAlpha SetOverlayAlpha; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayAlpha(ulong ulOverlayHandle, ref float pfAlpha); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayAlpha GetOverlayAlpha; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTexelAspect(ulong ulOverlayHandle, float fTexelAspect); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTexelAspect SetOverlayTexelAspect; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTexelAspect(ulong ulOverlayHandle, ref float pfTexelAspect); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTexelAspect GetOverlayTexelAspect; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlaySortOrder(ulong ulOverlayHandle, uint unSortOrder); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlaySortOrder SetOverlaySortOrder; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlaySortOrder(ulong ulOverlayHandle, ref uint punSortOrder); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlaySortOrder GetOverlaySortOrder; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayWidthInMeters(ulong ulOverlayHandle, float fWidthInMeters); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayWidthInMeters SetOverlayWidthInMeters; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayWidthInMeters(ulong ulOverlayHandle, ref float pfWidthInMeters); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayWidthInMeters GetOverlayWidthInMeters; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayAutoCurveDistanceRangeInMeters(ulong ulOverlayHandle, float fMinDistanceInMeters, float fMaxDistanceInMeters); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayAutoCurveDistanceRangeInMeters SetOverlayAutoCurveDistanceRangeInMeters; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayAutoCurveDistanceRangeInMeters(ulong ulOverlayHandle, ref float pfMinDistanceInMeters, ref float pfMaxDistanceInMeters); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayAutoCurveDistanceRangeInMeters GetOverlayAutoCurveDistanceRangeInMeters; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTextureColorSpace(ulong ulOverlayHandle, EColorSpace eTextureColorSpace); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTextureColorSpace SetOverlayTextureColorSpace; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTextureColorSpace(ulong ulOverlayHandle, ref EColorSpace peTextureColorSpace); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTextureColorSpace GetOverlayTextureColorSpace; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTextureBounds(ulong ulOverlayHandle, ref VRTextureBounds_t pOverlayTextureBounds); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTextureBounds SetOverlayTextureBounds; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTextureBounds(ulong ulOverlayHandle, ref VRTextureBounds_t pOverlayTextureBounds); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTextureBounds GetOverlayTextureBounds; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetOverlayRenderModel(ulong ulOverlayHandle, string pchValue, uint unBufferSize, ref HmdColor_t pColor, ref EVROverlayError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayRenderModel GetOverlayRenderModel; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayRenderModel(ulong ulOverlayHandle, string pchRenderModel, ref HmdColor_t pColor); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayRenderModel SetOverlayRenderModel; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTransformType(ulong ulOverlayHandle, ref VROverlayTransformType peTransformType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTransformType GetOverlayTransformType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTransformAbsolute(ulong ulOverlayHandle, ETrackingUniverseOrigin eTrackingOrigin, ref HmdMatrix34_t pmatTrackingOriginToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTransformAbsolute SetOverlayTransformAbsolute; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTransformAbsolute(ulong ulOverlayHandle, ref ETrackingUniverseOrigin peTrackingOrigin, ref HmdMatrix34_t pmatTrackingOriginToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTransformAbsolute GetOverlayTransformAbsolute; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTransformTrackedDeviceRelative(ulong ulOverlayHandle, uint unTrackedDevice, ref HmdMatrix34_t pmatTrackedDeviceToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTransformTrackedDeviceRelative SetOverlayTransformTrackedDeviceRelative; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTransformTrackedDeviceRelative(ulong ulOverlayHandle, ref uint punTrackedDevice, ref HmdMatrix34_t pmatTrackedDeviceToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTransformTrackedDeviceRelative GetOverlayTransformTrackedDeviceRelative; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTransformTrackedDeviceComponent(ulong ulOverlayHandle, uint unDeviceIndex, string pchComponentName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTransformTrackedDeviceComponent SetOverlayTransformTrackedDeviceComponent; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTransformTrackedDeviceComponent(ulong ulOverlayHandle, ref uint punDeviceIndex, string pchComponentName, uint unComponentNameSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTransformTrackedDeviceComponent GetOverlayTransformTrackedDeviceComponent; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTransformOverlayRelative(ulong ulOverlayHandle, ref ulong ulOverlayHandleParent, ref HmdMatrix34_t pmatParentOverlayToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTransformOverlayRelative GetOverlayTransformOverlayRelative; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTransformOverlayRelative(ulong ulOverlayHandle, ulong ulOverlayHandleParent, ref HmdMatrix34_t pmatParentOverlayToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTransformOverlayRelative SetOverlayTransformOverlayRelative; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _ShowOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowOverlay ShowOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _HideOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HideOverlay HideOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsOverlayVisible(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsOverlayVisible IsOverlayVisible; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetTransformForOverlayCoordinates(ulong ulOverlayHandle, ETrackingUniverseOrigin eTrackingOrigin, HmdVector2_t coordinatesInOverlay, ref HmdMatrix34_t pmatTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTransformForOverlayCoordinates GetTransformForOverlayCoordinates; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _PollNextOverlayEvent(ulong ulOverlayHandle, ref VREvent_t pEvent, uint uncbVREvent); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PollNextOverlayEvent PollNextOverlayEvent; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayInputMethod(ulong ulOverlayHandle, ref VROverlayInputMethod peInputMethod); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayInputMethod GetOverlayInputMethod; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayInputMethod(ulong ulOverlayHandle, VROverlayInputMethod eInputMethod); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayInputMethod SetOverlayInputMethod; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayMouseScale(ulong ulOverlayHandle, ref HmdVector2_t pvecMouseScale); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayMouseScale GetOverlayMouseScale; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayMouseScale(ulong ulOverlayHandle, ref HmdVector2_t pvecMouseScale); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayMouseScale SetOverlayMouseScale; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ComputeOverlayIntersection(ulong ulOverlayHandle, ref VROverlayIntersectionParams_t pParams, ref VROverlayIntersectionResults_t pResults); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ComputeOverlayIntersection ComputeOverlayIntersection; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _HandleControllerOverlayInteractionAsMouse(ulong ulOverlayHandle, uint unControllerDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HandleControllerOverlayInteractionAsMouse HandleControllerOverlayInteractionAsMouse; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsHoverTargetOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsHoverTargetOverlay IsHoverTargetOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _GetGamepadFocusOverlay(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetGamepadFocusOverlay GetGamepadFocusOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetGamepadFocusOverlay(ulong ulNewFocusOverlay); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetGamepadFocusOverlay SetGamepadFocusOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayNeighbor(EOverlayDirection eDirection, ulong ulFrom, ulong ulTo); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayNeighbor SetOverlayNeighbor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _MoveGamepadFocusToNeighbor(EOverlayDirection eDirection, ulong ulFrom); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _MoveGamepadFocusToNeighbor MoveGamepadFocusToNeighbor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayTexture(ulong ulOverlayHandle, ref Texture_t pTexture); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTexture SetOverlayTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _ClearOverlayTexture(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ClearOverlayTexture ClearOverlayTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayRaw(ulong ulOverlayHandle, IntPtr pvBuffer, uint unWidth, uint unHeight, uint unDepth); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayRaw SetOverlayRaw; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayFromFile(ulong ulOverlayHandle, string pchFilePath); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayFromFile SetOverlayFromFile; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTexture(ulong ulOverlayHandle, ref IntPtr pNativeTextureHandle, IntPtr pNativeTextureRef, ref uint pWidth, ref uint pHeight, ref uint pNativeFormat, ref ETextureType pAPIType, ref EColorSpace pColorSpace, ref VRTextureBounds_t pTextureBounds); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTexture GetOverlayTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _ReleaseNativeOverlayHandle(ulong ulOverlayHandle, IntPtr pNativeTextureHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseNativeOverlayHandle ReleaseNativeOverlayHandle; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayTextureSize(ulong ulOverlayHandle, ref uint pWidth, ref uint pHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTextureSize GetOverlayTextureSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _CreateDashboardOverlay(string pchOverlayKey, string pchOverlayFriendlyName, ref ulong pMainHandle, ref ulong pThumbnailHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CreateDashboardOverlay CreateDashboardOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsDashboardVisible(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsDashboardVisible IsDashboardVisible; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsActiveDashboardOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsActiveDashboardOverlay IsActiveDashboardOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetDashboardOverlaySceneProcess(ulong ulOverlayHandle, uint unProcessId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetDashboardOverlaySceneProcess SetDashboardOverlaySceneProcess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetDashboardOverlaySceneProcess(ulong ulOverlayHandle, ref uint punProcessId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDashboardOverlaySceneProcess GetDashboardOverlaySceneProcess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ShowDashboard(string pchOverlayToShow); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowDashboard ShowDashboard; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetPrimaryDashboardDevice(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetPrimaryDashboardDevice GetPrimaryDashboardDevice; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _ShowKeyboard(int eInputMode, int eLineInputMode, string pchDescription, uint unCharMax, string pchExistingText, bool bUseMinimalMode, ulong uUserValue); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowKeyboard ShowKeyboard; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _ShowKeyboardForOverlay(ulong ulOverlayHandle, int eInputMode, int eLineInputMode, string pchDescription, uint unCharMax, string pchExistingText, bool bUseMinimalMode, ulong uUserValue); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowKeyboardForOverlay ShowKeyboardForOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetKeyboardText(System.Text.StringBuilder pchText, uint cchText); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetKeyboardText GetKeyboardText; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _HideKeyboard(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HideKeyboard HideKeyboard; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetKeyboardTransformAbsolute(ETrackingUniverseOrigin eTrackingOrigin, ref HmdMatrix34_t pmatTrackingOriginToKeyboardTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetKeyboardTransformAbsolute SetKeyboardTransformAbsolute; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetKeyboardPositionForOverlay(ulong ulOverlayHandle, HmdRect2_t avoidRect); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetKeyboardPositionForOverlay SetKeyboardPositionForOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _SetOverlayIntersectionMask(ulong ulOverlayHandle, ref VROverlayIntersectionMaskPrimitive_t pMaskPrimitives, uint unNumMaskPrimitives, uint unPrimitiveSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayIntersectionMask SetOverlayIntersectionMask; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVROverlayError _GetOverlayFlags(ulong ulOverlayHandle, ref uint pFlags); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayFlags GetOverlayFlags; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate VRMessageOverlayResponse _ShowMessageOverlay(string pchText, string pchCaption, string pchButton0Text, string pchButton1Text, string pchButton2Text, string pchButton3Text); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowMessageOverlay ShowMessageOverlay; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRRenderModels +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRRenderModelError _LoadRenderModel_Async(string pchRenderModelName, ref IntPtr ppRenderModel); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LoadRenderModel_Async LoadRenderModel_Async; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _FreeRenderModel(IntPtr pRenderModel); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FreeRenderModel FreeRenderModel; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRRenderModelError _LoadTexture_Async(int textureId, ref IntPtr ppTexture); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LoadTexture_Async LoadTexture_Async; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _FreeTexture(IntPtr pTexture); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FreeTexture FreeTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRRenderModelError _LoadTextureD3D11_Async(int textureId, IntPtr pD3D11Device, ref IntPtr ppD3D11Texture2D); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LoadTextureD3D11_Async LoadTextureD3D11_Async; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRRenderModelError _LoadIntoTextureD3D11_Async(int textureId, IntPtr pDstTexture); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LoadIntoTextureD3D11_Async LoadIntoTextureD3D11_Async; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _FreeTextureD3D11(IntPtr pD3D11Texture2D); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FreeTextureD3D11 FreeTextureD3D11; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetRenderModelName(uint unRenderModelIndex, System.Text.StringBuilder pchRenderModelName, uint unRenderModelNameLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelName GetRenderModelName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetRenderModelCount(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelCount GetRenderModelCount; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetComponentCount(string pchRenderModelName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentCount GetComponentCount; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetComponentName(string pchRenderModelName, uint unComponentIndex, System.Text.StringBuilder pchComponentName, uint unComponentNameLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentName GetComponentName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _GetComponentButtonMask(string pchRenderModelName, string pchComponentName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentButtonMask GetComponentButtonMask; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetComponentRenderModelName(string pchRenderModelName, string pchComponentName, System.Text.StringBuilder pchComponentRenderModelName, uint unComponentRenderModelNameLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentRenderModelName GetComponentRenderModelName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetComponentState(string pchRenderModelName, string pchComponentName, ref VRControllerState_t pControllerState, ref RenderModel_ControllerMode_State_t pState, ref RenderModel_ComponentState_t pComponentState); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentState GetComponentState; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _RenderModelHasComponent(string pchRenderModelName, string pchComponentName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RenderModelHasComponent RenderModelHasComponent; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetRenderModelThumbnailURL(string pchRenderModelName, System.Text.StringBuilder pchThumbnailURL, uint unThumbnailURLLen, ref EVRRenderModelError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelThumbnailURL GetRenderModelThumbnailURL; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetRenderModelOriginalPath(string pchRenderModelName, System.Text.StringBuilder pchOriginalPath, uint unOriginalPathLen, ref EVRRenderModelError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelOriginalPath GetRenderModelOriginalPath; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetRenderModelErrorNameFromEnum(EVRRenderModelError error); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelErrorNameFromEnum GetRenderModelErrorNameFromEnum; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRNotifications +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRNotificationError _CreateNotification(ulong ulOverlayHandle, ulong ulUserValue, EVRNotificationType type, string pchText, EVRNotificationStyle style, ref NotificationBitmap_t pImage, ref uint pNotificationId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CreateNotification CreateNotification; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRNotificationError _RemoveNotification(uint notificationId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RemoveNotification RemoveNotification; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRSettings +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetSettingsErrorNameFromEnum(EVRSettingsError eError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetSettingsErrorNameFromEnum GetSettingsErrorNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _Sync(bool bForce, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _Sync Sync; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetBool(string pchSection, string pchSettingsKey, bool bValue, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetBool SetBool; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetInt32(string pchSection, string pchSettingsKey, int nValue, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetInt32 SetInt32; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetFloat(string pchSection, string pchSettingsKey, float flValue, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetFloat SetFloat; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetString(string pchSection, string pchSettingsKey, string pchValue, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetString SetString; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetBool(string pchSection, string pchSettingsKey, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetBool GetBool; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate int _GetInt32(string pchSection, string pchSettingsKey, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetInt32 GetInt32; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate float _GetFloat(string pchSection, string pchSettingsKey, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetFloat GetFloat; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetString(string pchSection, string pchSettingsKey, System.Text.StringBuilder pchValue, uint unValueLen, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetString GetString; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _RemoveSection(string pchSection, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RemoveSection RemoveSection; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _RemoveKeyInSection(string pchSection, string pchSettingsKey, ref EVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RemoveKeyInSection RemoveKeyInSection; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRScreenshots +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRScreenshotError _RequestScreenshot(ref uint pOutScreenshotHandle, EVRScreenshotType type, string pchPreviewFilename, string pchVRFilename); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RequestScreenshot RequestScreenshot; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRScreenshotError _HookScreenshot([In, Out] EVRScreenshotType[] pSupportedTypes, int numTypes); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HookScreenshot HookScreenshot; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRScreenshotType _GetScreenshotPropertyType(uint screenshotHandle, ref EVRScreenshotError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetScreenshotPropertyType GetScreenshotPropertyType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetScreenshotPropertyFilename(uint screenshotHandle, EVRScreenshotPropertyFilenames filenameType, System.Text.StringBuilder pchFilename, uint cchFilename, ref EVRScreenshotError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetScreenshotPropertyFilename GetScreenshotPropertyFilename; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRScreenshotError _UpdateScreenshotProgress(uint screenshotHandle, float flProgress); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _UpdateScreenshotProgress UpdateScreenshotProgress; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRScreenshotError _TakeStereoScreenshot(ref uint pOutScreenshotHandle, string pchPreviewFilename, string pchVRFilename); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _TakeStereoScreenshot TakeStereoScreenshot; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EVRScreenshotError _SubmitScreenshot(uint screenshotHandle, EVRScreenshotType type, string pchSourcePreviewFilename, string pchSourceVRFilename); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SubmitScreenshot SubmitScreenshot; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRResources +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _LoadSharedResource(string pchResourceName, string pchBuffer, uint unBufferLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LoadSharedResource LoadSharedResource; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetResourceFullPath(string pchResourceName, string pchResourceTypeDirectory, string pchPathBuffer, uint unBufferLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetResourceFullPath GetResourceFullPath; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IVRDriverManager +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetDriverCount(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDriverCount GetDriverCount; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetDriverName(uint nDriver, System.Text.StringBuilder pchValue, uint unBufferSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDriverName GetDriverName; + +} + + +public class CVRSystem +{ + IVRSystem FnTable; + internal CVRSystem(IntPtr pInterface) + { + FnTable = (IVRSystem)Marshal.PtrToStructure(pInterface, typeof(IVRSystem)); + } + public void GetRecommendedRenderTargetSize(ref uint pnWidth,ref uint pnHeight) + { + pnWidth = 0; + pnHeight = 0; + FnTable.GetRecommendedRenderTargetSize(ref pnWidth,ref pnHeight); + } + public HmdMatrix44_t GetProjectionMatrix(EVREye eEye,float fNearZ,float fFarZ) + { + HmdMatrix44_t result = FnTable.GetProjectionMatrix(eEye,fNearZ,fFarZ); + return result; + } + public void GetProjectionRaw(EVREye eEye,ref float pfLeft,ref float pfRight,ref float pfTop,ref float pfBottom) + { + pfLeft = 0; + pfRight = 0; + pfTop = 0; + pfBottom = 0; + FnTable.GetProjectionRaw(eEye,ref pfLeft,ref pfRight,ref pfTop,ref pfBottom); + } + public bool ComputeDistortion(EVREye eEye,float fU,float fV,ref DistortionCoordinates_t pDistortionCoordinates) + { + bool result = FnTable.ComputeDistortion(eEye,fU,fV,ref pDistortionCoordinates); + return result; + } + public HmdMatrix34_t GetEyeToHeadTransform(EVREye eEye) + { + HmdMatrix34_t result = FnTable.GetEyeToHeadTransform(eEye); + return result; + } + public bool GetTimeSinceLastVsync(ref float pfSecondsSinceLastVsync,ref ulong pulFrameCounter) + { + pfSecondsSinceLastVsync = 0; + pulFrameCounter = 0; + bool result = FnTable.GetTimeSinceLastVsync(ref pfSecondsSinceLastVsync,ref pulFrameCounter); + return result; + } + public int GetD3D9AdapterIndex() + { + int result = FnTable.GetD3D9AdapterIndex(); + return result; + } + public void GetDXGIOutputInfo(ref int pnAdapterIndex) + { + pnAdapterIndex = 0; + FnTable.GetDXGIOutputInfo(ref pnAdapterIndex); + } + public void GetOutputDevice(ref ulong pnDevice,ETextureType textureType) + { + pnDevice = 0; + FnTable.GetOutputDevice(ref pnDevice,textureType); + } + public bool IsDisplayOnDesktop() + { + bool result = FnTable.IsDisplayOnDesktop(); + return result; + } + public bool SetDisplayVisibility(bool bIsVisibleOnDesktop) + { + bool result = FnTable.SetDisplayVisibility(bIsVisibleOnDesktop); + return result; + } + public void GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin eOrigin,float fPredictedSecondsToPhotonsFromNow,TrackedDevicePose_t [] pTrackedDevicePoseArray) + { + FnTable.GetDeviceToAbsoluteTrackingPose(eOrigin,fPredictedSecondsToPhotonsFromNow,pTrackedDevicePoseArray,(uint) pTrackedDevicePoseArray.Length); + } + public void ResetSeatedZeroPose() + { + FnTable.ResetSeatedZeroPose(); + } + public HmdMatrix34_t GetSeatedZeroPoseToStandingAbsoluteTrackingPose() + { + HmdMatrix34_t result = FnTable.GetSeatedZeroPoseToStandingAbsoluteTrackingPose(); + return result; + } + public HmdMatrix34_t GetRawZeroPoseToStandingAbsoluteTrackingPose() + { + HmdMatrix34_t result = FnTable.GetRawZeroPoseToStandingAbsoluteTrackingPose(); + return result; + } + public uint GetSortedTrackedDeviceIndicesOfClass(ETrackedDeviceClass eTrackedDeviceClass,uint [] punTrackedDeviceIndexArray,uint unRelativeToTrackedDeviceIndex) + { + uint result = FnTable.GetSortedTrackedDeviceIndicesOfClass(eTrackedDeviceClass,punTrackedDeviceIndexArray,(uint) punTrackedDeviceIndexArray.Length,unRelativeToTrackedDeviceIndex); + return result; + } + public EDeviceActivityLevel GetTrackedDeviceActivityLevel(uint unDeviceId) + { + EDeviceActivityLevel result = FnTable.GetTrackedDeviceActivityLevel(unDeviceId); + return result; + } + public void ApplyTransform(ref TrackedDevicePose_t pOutputPose,ref TrackedDevicePose_t pTrackedDevicePose,ref HmdMatrix34_t pTransform) + { + FnTable.ApplyTransform(ref pOutputPose,ref pTrackedDevicePose,ref pTransform); + } + public uint GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole unDeviceType) + { + uint result = FnTable.GetTrackedDeviceIndexForControllerRole(unDeviceType); + return result; + } + public ETrackedControllerRole GetControllerRoleForTrackedDeviceIndex(uint unDeviceIndex) + { + ETrackedControllerRole result = FnTable.GetControllerRoleForTrackedDeviceIndex(unDeviceIndex); + return result; + } + public ETrackedDeviceClass GetTrackedDeviceClass(uint unDeviceIndex) + { + ETrackedDeviceClass result = FnTable.GetTrackedDeviceClass(unDeviceIndex); + return result; + } + public bool IsTrackedDeviceConnected(uint unDeviceIndex) + { + bool result = FnTable.IsTrackedDeviceConnected(unDeviceIndex); + return result; + } + public bool GetBoolTrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,ref ETrackedPropertyError pError) + { + bool result = FnTable.GetBoolTrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public float GetFloatTrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,ref ETrackedPropertyError pError) + { + float result = FnTable.GetFloatTrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public int GetInt32TrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,ref ETrackedPropertyError pError) + { + int result = FnTable.GetInt32TrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public ulong GetUint64TrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,ref ETrackedPropertyError pError) + { + ulong result = FnTable.GetUint64TrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public HmdMatrix34_t GetMatrix34TrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,ref ETrackedPropertyError pError) + { + HmdMatrix34_t result = FnTable.GetMatrix34TrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public uint GetStringTrackedDeviceProperty(uint unDeviceIndex,ETrackedDeviceProperty prop,System.Text.StringBuilder pchValue,uint unBufferSize,ref ETrackedPropertyError pError) + { + uint result = FnTable.GetStringTrackedDeviceProperty(unDeviceIndex,prop,pchValue,unBufferSize,ref pError); + return result; + } + public string GetPropErrorNameFromEnum(ETrackedPropertyError error) + { + IntPtr result = FnTable.GetPropErrorNameFromEnum(error); + return Marshal.PtrToStringAnsi(result); + } +// This is a terrible hack to workaround the fact that VRControllerState_t and VREvent_t were +// originally mis-compiled with the wrong packing for Linux and OSX. + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _PollNextEventPacked(ref VREvent_t_Packed pEvent,uint uncbVREvent); + [StructLayout(LayoutKind.Explicit)] + struct PollNextEventUnion + { + [FieldOffset(0)] + public IVRSystem._PollNextEvent pPollNextEvent; + [FieldOffset(0)] + public _PollNextEventPacked pPollNextEventPacked; + } + public bool PollNextEvent(ref VREvent_t pEvent,uint uncbVREvent) + { + if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || + (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) + { + PollNextEventUnion u; + VREvent_t_Packed event_packed = new VREvent_t_Packed(); + u.pPollNextEventPacked = null; + u.pPollNextEvent = FnTable.PollNextEvent; + bool packed_result = u.pPollNextEventPacked(ref event_packed,(uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VREvent_t_Packed))); + + event_packed.Unpack(ref pEvent); + return packed_result; + } + bool result = FnTable.PollNextEvent(ref pEvent,uncbVREvent); + return result; + } + public bool PollNextEventWithPose(ETrackingUniverseOrigin eOrigin,ref VREvent_t pEvent,uint uncbVREvent,ref TrackedDevicePose_t pTrackedDevicePose) + { + bool result = FnTable.PollNextEventWithPose(eOrigin,ref pEvent,uncbVREvent,ref pTrackedDevicePose); + return result; + } + public string GetEventTypeNameFromEnum(EVREventType eType) + { + IntPtr result = FnTable.GetEventTypeNameFromEnum(eType); + return Marshal.PtrToStringAnsi(result); + } + public HiddenAreaMesh_t GetHiddenAreaMesh(EVREye eEye,EHiddenAreaMeshType type) + { + HiddenAreaMesh_t result = FnTable.GetHiddenAreaMesh(eEye,type); + return result; + } +// This is a terrible hack to workaround the fact that VRControllerState_t and VREvent_t were +// originally mis-compiled with the wrong packing for Linux and OSX. + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetControllerStatePacked(uint unControllerDeviceIndex,ref VRControllerState_t_Packed pControllerState,uint unControllerStateSize); + [StructLayout(LayoutKind.Explicit)] + struct GetControllerStateUnion + { + [FieldOffset(0)] + public IVRSystem._GetControllerState pGetControllerState; + [FieldOffset(0)] + public _GetControllerStatePacked pGetControllerStatePacked; + } + public bool GetControllerState(uint unControllerDeviceIndex,ref VRControllerState_t pControllerState,uint unControllerStateSize) + { + if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || + (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) + { + GetControllerStateUnion u; + VRControllerState_t_Packed state_packed = new VRControllerState_t_Packed(pControllerState); + u.pGetControllerStatePacked = null; + u.pGetControllerState = FnTable.GetControllerState; + bool packed_result = u.pGetControllerStatePacked(unControllerDeviceIndex,ref state_packed,(uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VRControllerState_t_Packed))); + + state_packed.Unpack(ref pControllerState); + return packed_result; + } + bool result = FnTable.GetControllerState(unControllerDeviceIndex,ref pControllerState,unControllerStateSize); + return result; + } +// This is a terrible hack to workaround the fact that VRControllerState_t and VREvent_t were +// originally mis-compiled with the wrong packing for Linux and OSX. + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetControllerStateWithPosePacked(ETrackingUniverseOrigin eOrigin,uint unControllerDeviceIndex,ref VRControllerState_t_Packed pControllerState,uint unControllerStateSize,ref TrackedDevicePose_t pTrackedDevicePose); + [StructLayout(LayoutKind.Explicit)] + struct GetControllerStateWithPoseUnion + { + [FieldOffset(0)] + public IVRSystem._GetControllerStateWithPose pGetControllerStateWithPose; + [FieldOffset(0)] + public _GetControllerStateWithPosePacked pGetControllerStateWithPosePacked; + } + public bool GetControllerStateWithPose(ETrackingUniverseOrigin eOrigin,uint unControllerDeviceIndex,ref VRControllerState_t pControllerState,uint unControllerStateSize,ref TrackedDevicePose_t pTrackedDevicePose) + { + if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || + (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) + { + GetControllerStateWithPoseUnion u; + VRControllerState_t_Packed state_packed = new VRControllerState_t_Packed(pControllerState); + u.pGetControllerStateWithPosePacked = null; + u.pGetControllerStateWithPose = FnTable.GetControllerStateWithPose; + bool packed_result = u.pGetControllerStateWithPosePacked(eOrigin,unControllerDeviceIndex,ref state_packed,(uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VRControllerState_t_Packed)),ref pTrackedDevicePose); + + state_packed.Unpack(ref pControllerState); + return packed_result; + } + bool result = FnTable.GetControllerStateWithPose(eOrigin,unControllerDeviceIndex,ref pControllerState,unControllerStateSize,ref pTrackedDevicePose); + return result; + } + public void TriggerHapticPulse(uint unControllerDeviceIndex,uint unAxisId,char usDurationMicroSec) + { + FnTable.TriggerHapticPulse(unControllerDeviceIndex,unAxisId,usDurationMicroSec); + } + public string GetButtonIdNameFromEnum(EVRButtonId eButtonId) + { + IntPtr result = FnTable.GetButtonIdNameFromEnum(eButtonId); + return Marshal.PtrToStringAnsi(result); + } + public string GetControllerAxisTypeNameFromEnum(EVRControllerAxisType eAxisType) + { + IntPtr result = FnTable.GetControllerAxisTypeNameFromEnum(eAxisType); + return Marshal.PtrToStringAnsi(result); + } + public bool CaptureInputFocus() + { + bool result = FnTable.CaptureInputFocus(); + return result; + } + public void ReleaseInputFocus() + { + FnTable.ReleaseInputFocus(); + } + public bool IsInputFocusCapturedByAnotherProcess() + { + bool result = FnTable.IsInputFocusCapturedByAnotherProcess(); + return result; + } + public uint DriverDebugRequest(uint unDeviceIndex,string pchRequest,string pchResponseBuffer,uint unResponseBufferSize) + { + uint result = FnTable.DriverDebugRequest(unDeviceIndex,pchRequest,pchResponseBuffer,unResponseBufferSize); + return result; + } + public EVRFirmwareError PerformFirmwareUpdate(uint unDeviceIndex) + { + EVRFirmwareError result = FnTable.PerformFirmwareUpdate(unDeviceIndex); + return result; + } + public void AcknowledgeQuit_Exiting() + { + FnTable.AcknowledgeQuit_Exiting(); + } + public void AcknowledgeQuit_UserPrompt() + { + FnTable.AcknowledgeQuit_UserPrompt(); + } +} + + +public class CVRExtendedDisplay +{ + IVRExtendedDisplay FnTable; + internal CVRExtendedDisplay(IntPtr pInterface) + { + FnTable = (IVRExtendedDisplay)Marshal.PtrToStructure(pInterface, typeof(IVRExtendedDisplay)); + } + public void GetWindowBounds(ref int pnX,ref int pnY,ref uint pnWidth,ref uint pnHeight) + { + pnX = 0; + pnY = 0; + pnWidth = 0; + pnHeight = 0; + FnTable.GetWindowBounds(ref pnX,ref pnY,ref pnWidth,ref pnHeight); + } + public void GetEyeOutputViewport(EVREye eEye,ref uint pnX,ref uint pnY,ref uint pnWidth,ref uint pnHeight) + { + pnX = 0; + pnY = 0; + pnWidth = 0; + pnHeight = 0; + FnTable.GetEyeOutputViewport(eEye,ref pnX,ref pnY,ref pnWidth,ref pnHeight); + } + public void GetDXGIOutputInfo(ref int pnAdapterIndex,ref int pnAdapterOutputIndex) + { + pnAdapterIndex = 0; + pnAdapterOutputIndex = 0; + FnTable.GetDXGIOutputInfo(ref pnAdapterIndex,ref pnAdapterOutputIndex); + } +} + + +public class CVRTrackedCamera +{ + IVRTrackedCamera FnTable; + internal CVRTrackedCamera(IntPtr pInterface) + { + FnTable = (IVRTrackedCamera)Marshal.PtrToStructure(pInterface, typeof(IVRTrackedCamera)); + } + public string GetCameraErrorNameFromEnum(EVRTrackedCameraError eCameraError) + { + IntPtr result = FnTable.GetCameraErrorNameFromEnum(eCameraError); + return Marshal.PtrToStringAnsi(result); + } + public EVRTrackedCameraError HasCamera(uint nDeviceIndex,ref bool pHasCamera) + { + pHasCamera = false; + EVRTrackedCameraError result = FnTable.HasCamera(nDeviceIndex,ref pHasCamera); + return result; + } + public EVRTrackedCameraError GetCameraFrameSize(uint nDeviceIndex,EVRTrackedCameraFrameType eFrameType,ref uint pnWidth,ref uint pnHeight,ref uint pnFrameBufferSize) + { + pnWidth = 0; + pnHeight = 0; + pnFrameBufferSize = 0; + EVRTrackedCameraError result = FnTable.GetCameraFrameSize(nDeviceIndex,eFrameType,ref pnWidth,ref pnHeight,ref pnFrameBufferSize); + return result; + } + public EVRTrackedCameraError GetCameraIntrinsics(uint nDeviceIndex,EVRTrackedCameraFrameType eFrameType,ref HmdVector2_t pFocalLength,ref HmdVector2_t pCenter) + { + EVRTrackedCameraError result = FnTable.GetCameraIntrinsics(nDeviceIndex,eFrameType,ref pFocalLength,ref pCenter); + return result; + } + public EVRTrackedCameraError GetCameraProjection(uint nDeviceIndex,EVRTrackedCameraFrameType eFrameType,float flZNear,float flZFar,ref HmdMatrix44_t pProjection) + { + EVRTrackedCameraError result = FnTable.GetCameraProjection(nDeviceIndex,eFrameType,flZNear,flZFar,ref pProjection); + return result; + } + public EVRTrackedCameraError AcquireVideoStreamingService(uint nDeviceIndex,ref ulong pHandle) + { + pHandle = 0; + EVRTrackedCameraError result = FnTable.AcquireVideoStreamingService(nDeviceIndex,ref pHandle); + return result; + } + public EVRTrackedCameraError ReleaseVideoStreamingService(ulong hTrackedCamera) + { + EVRTrackedCameraError result = FnTable.ReleaseVideoStreamingService(hTrackedCamera); + return result; + } + public EVRTrackedCameraError GetVideoStreamFrameBuffer(ulong hTrackedCamera,EVRTrackedCameraFrameType eFrameType,IntPtr pFrameBuffer,uint nFrameBufferSize,ref CameraVideoStreamFrameHeader_t pFrameHeader,uint nFrameHeaderSize) + { + EVRTrackedCameraError result = FnTable.GetVideoStreamFrameBuffer(hTrackedCamera,eFrameType,pFrameBuffer,nFrameBufferSize,ref pFrameHeader,nFrameHeaderSize); + return result; + } + public EVRTrackedCameraError GetVideoStreamTextureSize(uint nDeviceIndex,EVRTrackedCameraFrameType eFrameType,ref VRTextureBounds_t pTextureBounds,ref uint pnWidth,ref uint pnHeight) + { + pnWidth = 0; + pnHeight = 0; + EVRTrackedCameraError result = FnTable.GetVideoStreamTextureSize(nDeviceIndex,eFrameType,ref pTextureBounds,ref pnWidth,ref pnHeight); + return result; + } + public EVRTrackedCameraError GetVideoStreamTextureD3D11(ulong hTrackedCamera,EVRTrackedCameraFrameType eFrameType,IntPtr pD3D11DeviceOrResource,ref IntPtr ppD3D11ShaderResourceView,ref CameraVideoStreamFrameHeader_t pFrameHeader,uint nFrameHeaderSize) + { + EVRTrackedCameraError result = FnTable.GetVideoStreamTextureD3D11(hTrackedCamera,eFrameType,pD3D11DeviceOrResource,ref ppD3D11ShaderResourceView,ref pFrameHeader,nFrameHeaderSize); + return result; + } + public EVRTrackedCameraError GetVideoStreamTextureGL(ulong hTrackedCamera,EVRTrackedCameraFrameType eFrameType,ref uint pglTextureId,ref CameraVideoStreamFrameHeader_t pFrameHeader,uint nFrameHeaderSize) + { + pglTextureId = 0; + EVRTrackedCameraError result = FnTable.GetVideoStreamTextureGL(hTrackedCamera,eFrameType,ref pglTextureId,ref pFrameHeader,nFrameHeaderSize); + return result; + } + public EVRTrackedCameraError ReleaseVideoStreamTextureGL(ulong hTrackedCamera,uint glTextureId) + { + EVRTrackedCameraError result = FnTable.ReleaseVideoStreamTextureGL(hTrackedCamera,glTextureId); + return result; + } +} + + +public class CVRApplications +{ + IVRApplications FnTable; + internal CVRApplications(IntPtr pInterface) + { + FnTable = (IVRApplications)Marshal.PtrToStructure(pInterface, typeof(IVRApplications)); + } + public EVRApplicationError AddApplicationManifest(string pchApplicationManifestFullPath,bool bTemporary) + { + EVRApplicationError result = FnTable.AddApplicationManifest(pchApplicationManifestFullPath,bTemporary); + return result; + } + public EVRApplicationError RemoveApplicationManifest(string pchApplicationManifestFullPath) + { + EVRApplicationError result = FnTable.RemoveApplicationManifest(pchApplicationManifestFullPath); + return result; + } + public bool IsApplicationInstalled(string pchAppKey) + { + bool result = FnTable.IsApplicationInstalled(pchAppKey); + return result; + } + public uint GetApplicationCount() + { + uint result = FnTable.GetApplicationCount(); + return result; + } + public EVRApplicationError GetApplicationKeyByIndex(uint unApplicationIndex,System.Text.StringBuilder pchAppKeyBuffer,uint unAppKeyBufferLen) + { + EVRApplicationError result = FnTable.GetApplicationKeyByIndex(unApplicationIndex,pchAppKeyBuffer,unAppKeyBufferLen); + return result; + } + public EVRApplicationError GetApplicationKeyByProcessId(uint unProcessId,string pchAppKeyBuffer,uint unAppKeyBufferLen) + { + EVRApplicationError result = FnTable.GetApplicationKeyByProcessId(unProcessId,pchAppKeyBuffer,unAppKeyBufferLen); + return result; + } + public EVRApplicationError LaunchApplication(string pchAppKey) + { + EVRApplicationError result = FnTable.LaunchApplication(pchAppKey); + return result; + } + public EVRApplicationError LaunchTemplateApplication(string pchTemplateAppKey,string pchNewAppKey,AppOverrideKeys_t [] pKeys) + { + EVRApplicationError result = FnTable.LaunchTemplateApplication(pchTemplateAppKey,pchNewAppKey,pKeys,(uint) pKeys.Length); + return result; + } + public EVRApplicationError LaunchApplicationFromMimeType(string pchMimeType,string pchArgs) + { + EVRApplicationError result = FnTable.LaunchApplicationFromMimeType(pchMimeType,pchArgs); + return result; + } + public EVRApplicationError LaunchDashboardOverlay(string pchAppKey) + { + EVRApplicationError result = FnTable.LaunchDashboardOverlay(pchAppKey); + return result; + } + public bool CancelApplicationLaunch(string pchAppKey) + { + bool result = FnTable.CancelApplicationLaunch(pchAppKey); + return result; + } + public EVRApplicationError IdentifyApplication(uint unProcessId,string pchAppKey) + { + EVRApplicationError result = FnTable.IdentifyApplication(unProcessId,pchAppKey); + return result; + } + public uint GetApplicationProcessId(string pchAppKey) + { + uint result = FnTable.GetApplicationProcessId(pchAppKey); + return result; + } + public string GetApplicationsErrorNameFromEnum(EVRApplicationError error) + { + IntPtr result = FnTable.GetApplicationsErrorNameFromEnum(error); + return Marshal.PtrToStringAnsi(result); + } + public uint GetApplicationPropertyString(string pchAppKey,EVRApplicationProperty eProperty,System.Text.StringBuilder pchPropertyValueBuffer,uint unPropertyValueBufferLen,ref EVRApplicationError peError) + { + uint result = FnTable.GetApplicationPropertyString(pchAppKey,eProperty,pchPropertyValueBuffer,unPropertyValueBufferLen,ref peError); + return result; + } + public bool GetApplicationPropertyBool(string pchAppKey,EVRApplicationProperty eProperty,ref EVRApplicationError peError) + { + bool result = FnTable.GetApplicationPropertyBool(pchAppKey,eProperty,ref peError); + return result; + } + public ulong GetApplicationPropertyUint64(string pchAppKey,EVRApplicationProperty eProperty,ref EVRApplicationError peError) + { + ulong result = FnTable.GetApplicationPropertyUint64(pchAppKey,eProperty,ref peError); + return result; + } + public EVRApplicationError SetApplicationAutoLaunch(string pchAppKey,bool bAutoLaunch) + { + EVRApplicationError result = FnTable.SetApplicationAutoLaunch(pchAppKey,bAutoLaunch); + return result; + } + public bool GetApplicationAutoLaunch(string pchAppKey) + { + bool result = FnTable.GetApplicationAutoLaunch(pchAppKey); + return result; + } + public EVRApplicationError SetDefaultApplicationForMimeType(string pchAppKey,string pchMimeType) + { + EVRApplicationError result = FnTable.SetDefaultApplicationForMimeType(pchAppKey,pchMimeType); + return result; + } + public bool GetDefaultApplicationForMimeType(string pchMimeType,string pchAppKeyBuffer,uint unAppKeyBufferLen) + { + bool result = FnTable.GetDefaultApplicationForMimeType(pchMimeType,pchAppKeyBuffer,unAppKeyBufferLen); + return result; + } + public bool GetApplicationSupportedMimeTypes(string pchAppKey,string pchMimeTypesBuffer,uint unMimeTypesBuffer) + { + bool result = FnTable.GetApplicationSupportedMimeTypes(pchAppKey,pchMimeTypesBuffer,unMimeTypesBuffer); + return result; + } + public uint GetApplicationsThatSupportMimeType(string pchMimeType,string pchAppKeysThatSupportBuffer,uint unAppKeysThatSupportBuffer) + { + uint result = FnTable.GetApplicationsThatSupportMimeType(pchMimeType,pchAppKeysThatSupportBuffer,unAppKeysThatSupportBuffer); + return result; + } + public uint GetApplicationLaunchArguments(uint unHandle,string pchArgs,uint unArgs) + { + uint result = FnTable.GetApplicationLaunchArguments(unHandle,pchArgs,unArgs); + return result; + } + public EVRApplicationError GetStartingApplication(string pchAppKeyBuffer,uint unAppKeyBufferLen) + { + EVRApplicationError result = FnTable.GetStartingApplication(pchAppKeyBuffer,unAppKeyBufferLen); + return result; + } + public EVRApplicationTransitionState GetTransitionState() + { + EVRApplicationTransitionState result = FnTable.GetTransitionState(); + return result; + } + public EVRApplicationError PerformApplicationPrelaunchCheck(string pchAppKey) + { + EVRApplicationError result = FnTable.PerformApplicationPrelaunchCheck(pchAppKey); + return result; + } + public string GetApplicationsTransitionStateNameFromEnum(EVRApplicationTransitionState state) + { + IntPtr result = FnTable.GetApplicationsTransitionStateNameFromEnum(state); + return Marshal.PtrToStringAnsi(result); + } + public bool IsQuitUserPromptRequested() + { + bool result = FnTable.IsQuitUserPromptRequested(); + return result; + } + public EVRApplicationError LaunchInternalProcess(string pchBinaryPath,string pchArguments,string pchWorkingDirectory) + { + EVRApplicationError result = FnTable.LaunchInternalProcess(pchBinaryPath,pchArguments,pchWorkingDirectory); + return result; + } + public uint GetCurrentSceneProcessId() + { + uint result = FnTable.GetCurrentSceneProcessId(); + return result; + } +} + + +public class CVRChaperone +{ + IVRChaperone FnTable; + internal CVRChaperone(IntPtr pInterface) + { + FnTable = (IVRChaperone)Marshal.PtrToStructure(pInterface, typeof(IVRChaperone)); + } + public ChaperoneCalibrationState GetCalibrationState() + { + ChaperoneCalibrationState result = FnTable.GetCalibrationState(); + return result; + } + public bool GetPlayAreaSize(ref float pSizeX,ref float pSizeZ) + { + pSizeX = 0; + pSizeZ = 0; + bool result = FnTable.GetPlayAreaSize(ref pSizeX,ref pSizeZ); + return result; + } + public bool GetPlayAreaRect(ref HmdQuad_t rect) + { + bool result = FnTable.GetPlayAreaRect(ref rect); + return result; + } + public void ReloadInfo() + { + FnTable.ReloadInfo(); + } + public void SetSceneColor(HmdColor_t color) + { + FnTable.SetSceneColor(color); + } + public void GetBoundsColor(ref HmdColor_t pOutputColorArray,int nNumOutputColors,float flCollisionBoundsFadeDistance,ref HmdColor_t pOutputCameraColor) + { + FnTable.GetBoundsColor(ref pOutputColorArray,nNumOutputColors,flCollisionBoundsFadeDistance,ref pOutputCameraColor); + } + public bool AreBoundsVisible() + { + bool result = FnTable.AreBoundsVisible(); + return result; + } + public void ForceBoundsVisible(bool bForce) + { + FnTable.ForceBoundsVisible(bForce); + } +} + + +public class CVRChaperoneSetup +{ + IVRChaperoneSetup FnTable; + internal CVRChaperoneSetup(IntPtr pInterface) + { + FnTable = (IVRChaperoneSetup)Marshal.PtrToStructure(pInterface, typeof(IVRChaperoneSetup)); + } + public bool CommitWorkingCopy(EChaperoneConfigFile configFile) + { + bool result = FnTable.CommitWorkingCopy(configFile); + return result; + } + public void RevertWorkingCopy() + { + FnTable.RevertWorkingCopy(); + } + public bool GetWorkingPlayAreaSize(ref float pSizeX,ref float pSizeZ) + { + pSizeX = 0; + pSizeZ = 0; + bool result = FnTable.GetWorkingPlayAreaSize(ref pSizeX,ref pSizeZ); + return result; + } + public bool GetWorkingPlayAreaRect(ref HmdQuad_t rect) + { + bool result = FnTable.GetWorkingPlayAreaRect(ref rect); + return result; + } + public bool GetWorkingCollisionBoundsInfo(out HmdQuad_t [] pQuadsBuffer) + { + uint punQuadsCount = 0; + bool result = FnTable.GetWorkingCollisionBoundsInfo(null,ref punQuadsCount); + pQuadsBuffer= new HmdQuad_t[punQuadsCount]; + result = FnTable.GetWorkingCollisionBoundsInfo(pQuadsBuffer,ref punQuadsCount); + return result; + } + public bool GetLiveCollisionBoundsInfo(out HmdQuad_t [] pQuadsBuffer) + { + uint punQuadsCount = 0; + bool result = FnTable.GetLiveCollisionBoundsInfo(null,ref punQuadsCount); + pQuadsBuffer= new HmdQuad_t[punQuadsCount]; + result = FnTable.GetLiveCollisionBoundsInfo(pQuadsBuffer,ref punQuadsCount); + return result; + } + public bool GetWorkingSeatedZeroPoseToRawTrackingPose(ref HmdMatrix34_t pmatSeatedZeroPoseToRawTrackingPose) + { + bool result = FnTable.GetWorkingSeatedZeroPoseToRawTrackingPose(ref pmatSeatedZeroPoseToRawTrackingPose); + return result; + } + public bool GetWorkingStandingZeroPoseToRawTrackingPose(ref HmdMatrix34_t pmatStandingZeroPoseToRawTrackingPose) + { + bool result = FnTable.GetWorkingStandingZeroPoseToRawTrackingPose(ref pmatStandingZeroPoseToRawTrackingPose); + return result; + } + public void SetWorkingPlayAreaSize(float sizeX,float sizeZ) + { + FnTable.SetWorkingPlayAreaSize(sizeX,sizeZ); + } + public void SetWorkingCollisionBoundsInfo(HmdQuad_t [] pQuadsBuffer) + { + FnTable.SetWorkingCollisionBoundsInfo(pQuadsBuffer,(uint) pQuadsBuffer.Length); + } + public void SetWorkingSeatedZeroPoseToRawTrackingPose(ref HmdMatrix34_t pMatSeatedZeroPoseToRawTrackingPose) + { + FnTable.SetWorkingSeatedZeroPoseToRawTrackingPose(ref pMatSeatedZeroPoseToRawTrackingPose); + } + public void SetWorkingStandingZeroPoseToRawTrackingPose(ref HmdMatrix34_t pMatStandingZeroPoseToRawTrackingPose) + { + FnTable.SetWorkingStandingZeroPoseToRawTrackingPose(ref pMatStandingZeroPoseToRawTrackingPose); + } + public void ReloadFromDisk(EChaperoneConfigFile configFile) + { + FnTable.ReloadFromDisk(configFile); + } + public bool GetLiveSeatedZeroPoseToRawTrackingPose(ref HmdMatrix34_t pmatSeatedZeroPoseToRawTrackingPose) + { + bool result = FnTable.GetLiveSeatedZeroPoseToRawTrackingPose(ref pmatSeatedZeroPoseToRawTrackingPose); + return result; + } + public void SetWorkingCollisionBoundsTagsInfo(byte [] pTagsBuffer) + { + FnTable.SetWorkingCollisionBoundsTagsInfo(pTagsBuffer,(uint) pTagsBuffer.Length); + } + public bool GetLiveCollisionBoundsTagsInfo(out byte [] pTagsBuffer) + { + uint punTagCount = 0; + bool result = FnTable.GetLiveCollisionBoundsTagsInfo(null,ref punTagCount); + pTagsBuffer= new byte[punTagCount]; + result = FnTable.GetLiveCollisionBoundsTagsInfo(pTagsBuffer,ref punTagCount); + return result; + } + public bool SetWorkingPhysicalBoundsInfo(HmdQuad_t [] pQuadsBuffer) + { + bool result = FnTable.SetWorkingPhysicalBoundsInfo(pQuadsBuffer,(uint) pQuadsBuffer.Length); + return result; + } + public bool GetLivePhysicalBoundsInfo(out HmdQuad_t [] pQuadsBuffer) + { + uint punQuadsCount = 0; + bool result = FnTable.GetLivePhysicalBoundsInfo(null,ref punQuadsCount); + pQuadsBuffer= new HmdQuad_t[punQuadsCount]; + result = FnTable.GetLivePhysicalBoundsInfo(pQuadsBuffer,ref punQuadsCount); + return result; + } + public bool ExportLiveToBuffer(System.Text.StringBuilder pBuffer,ref uint pnBufferLength) + { + pnBufferLength = 0; + bool result = FnTable.ExportLiveToBuffer(pBuffer,ref pnBufferLength); + return result; + } + public bool ImportFromBufferToWorking(string pBuffer,uint nImportFlags) + { + bool result = FnTable.ImportFromBufferToWorking(pBuffer,nImportFlags); + return result; + } +} + + +public class CVRCompositor +{ + IVRCompositor FnTable; + internal CVRCompositor(IntPtr pInterface) + { + FnTable = (IVRCompositor)Marshal.PtrToStructure(pInterface, typeof(IVRCompositor)); + } + public void SetTrackingSpace(ETrackingUniverseOrigin eOrigin) + { + FnTable.SetTrackingSpace(eOrigin); + } + public ETrackingUniverseOrigin GetTrackingSpace() + { + ETrackingUniverseOrigin result = FnTable.GetTrackingSpace(); + return result; + } + public EVRCompositorError WaitGetPoses(TrackedDevicePose_t [] pRenderPoseArray,TrackedDevicePose_t [] pGamePoseArray) + { + EVRCompositorError result = FnTable.WaitGetPoses(pRenderPoseArray,(uint) pRenderPoseArray.Length,pGamePoseArray,(uint) pGamePoseArray.Length); + return result; + } + public EVRCompositorError GetLastPoses(TrackedDevicePose_t [] pRenderPoseArray,TrackedDevicePose_t [] pGamePoseArray) + { + EVRCompositorError result = FnTable.GetLastPoses(pRenderPoseArray,(uint) pRenderPoseArray.Length,pGamePoseArray,(uint) pGamePoseArray.Length); + return result; + } + public EVRCompositorError GetLastPoseForTrackedDeviceIndex(uint unDeviceIndex,ref TrackedDevicePose_t pOutputPose,ref TrackedDevicePose_t pOutputGamePose) + { + EVRCompositorError result = FnTable.GetLastPoseForTrackedDeviceIndex(unDeviceIndex,ref pOutputPose,ref pOutputGamePose); + return result; + } + public EVRCompositorError Submit(EVREye eEye,ref Texture_t pTexture,ref VRTextureBounds_t pBounds,EVRSubmitFlags nSubmitFlags) + { + EVRCompositorError result = FnTable.Submit(eEye,ref pTexture,ref pBounds,nSubmitFlags); + return result; + } + public void ClearLastSubmittedFrame() + { + FnTable.ClearLastSubmittedFrame(); + } + public void PostPresentHandoff() + { + FnTable.PostPresentHandoff(); + } + public bool GetFrameTiming(ref Compositor_FrameTiming pTiming,uint unFramesAgo) + { + bool result = FnTable.GetFrameTiming(ref pTiming,unFramesAgo); + return result; + } + public uint GetFrameTimings(ref Compositor_FrameTiming pTiming,uint nFrames) + { + uint result = FnTable.GetFrameTimings(ref pTiming,nFrames); + return result; + } + public float GetFrameTimeRemaining() + { + float result = FnTable.GetFrameTimeRemaining(); + return result; + } + public void GetCumulativeStats(ref Compositor_CumulativeStats pStats,uint nStatsSizeInBytes) + { + FnTable.GetCumulativeStats(ref pStats,nStatsSizeInBytes); + } + public void FadeToColor(float fSeconds,float fRed,float fGreen,float fBlue,float fAlpha,bool bBackground) + { + FnTable.FadeToColor(fSeconds,fRed,fGreen,fBlue,fAlpha,bBackground); + } + public HmdColor_t GetCurrentFadeColor(bool bBackground) + { + HmdColor_t result = FnTable.GetCurrentFadeColor(bBackground); + return result; + } + public void FadeGrid(float fSeconds,bool bFadeIn) + { + FnTable.FadeGrid(fSeconds,bFadeIn); + } + public float GetCurrentGridAlpha() + { + float result = FnTable.GetCurrentGridAlpha(); + return result; + } + public EVRCompositorError SetSkyboxOverride(Texture_t [] pTextures) + { + EVRCompositorError result = FnTable.SetSkyboxOverride(pTextures,(uint) pTextures.Length); + return result; + } + public void ClearSkyboxOverride() + { + FnTable.ClearSkyboxOverride(); + } + public void CompositorBringToFront() + { + FnTable.CompositorBringToFront(); + } + public void CompositorGoToBack() + { + FnTable.CompositorGoToBack(); + } + public void CompositorQuit() + { + FnTable.CompositorQuit(); + } + public bool IsFullscreen() + { + bool result = FnTable.IsFullscreen(); + return result; + } + public uint GetCurrentSceneFocusProcess() + { + uint result = FnTable.GetCurrentSceneFocusProcess(); + return result; + } + public uint GetLastFrameRenderer() + { + uint result = FnTable.GetLastFrameRenderer(); + return result; + } + public bool CanRenderScene() + { + bool result = FnTable.CanRenderScene(); + return result; + } + public void ShowMirrorWindow() + { + FnTable.ShowMirrorWindow(); + } + public void HideMirrorWindow() + { + FnTable.HideMirrorWindow(); + } + public bool IsMirrorWindowVisible() + { + bool result = FnTable.IsMirrorWindowVisible(); + return result; + } + public void CompositorDumpImages() + { + FnTable.CompositorDumpImages(); + } + public bool ShouldAppRenderWithLowResources() + { + bool result = FnTable.ShouldAppRenderWithLowResources(); + return result; + } + public void ForceInterleavedReprojectionOn(bool bOverride) + { + FnTable.ForceInterleavedReprojectionOn(bOverride); + } + public void ForceReconnectProcess() + { + FnTable.ForceReconnectProcess(); + } + public void SuspendRendering(bool bSuspend) + { + FnTable.SuspendRendering(bSuspend); + } + public EVRCompositorError GetMirrorTextureD3D11(EVREye eEye,IntPtr pD3D11DeviceOrResource,ref IntPtr ppD3D11ShaderResourceView) + { + EVRCompositorError result = FnTable.GetMirrorTextureD3D11(eEye,pD3D11DeviceOrResource,ref ppD3D11ShaderResourceView); + return result; + } + public void ReleaseMirrorTextureD3D11(IntPtr pD3D11ShaderResourceView) + { + FnTable.ReleaseMirrorTextureD3D11(pD3D11ShaderResourceView); + } + public EVRCompositorError GetMirrorTextureGL(EVREye eEye,ref uint pglTextureId,IntPtr pglSharedTextureHandle) + { + pglTextureId = 0; + EVRCompositorError result = FnTable.GetMirrorTextureGL(eEye,ref pglTextureId,pglSharedTextureHandle); + return result; + } + public bool ReleaseSharedGLTexture(uint glTextureId,IntPtr glSharedTextureHandle) + { + bool result = FnTable.ReleaseSharedGLTexture(glTextureId,glSharedTextureHandle); + return result; + } + public void LockGLSharedTextureForAccess(IntPtr glSharedTextureHandle) + { + FnTable.LockGLSharedTextureForAccess(glSharedTextureHandle); + } + public void UnlockGLSharedTextureForAccess(IntPtr glSharedTextureHandle) + { + FnTable.UnlockGLSharedTextureForAccess(glSharedTextureHandle); + } + public uint GetVulkanInstanceExtensionsRequired(System.Text.StringBuilder pchValue,uint unBufferSize) + { + uint result = FnTable.GetVulkanInstanceExtensionsRequired(pchValue,unBufferSize); + return result; + } + public uint GetVulkanDeviceExtensionsRequired(IntPtr pPhysicalDevice,System.Text.StringBuilder pchValue,uint unBufferSize) + { + uint result = FnTable.GetVulkanDeviceExtensionsRequired(pPhysicalDevice,pchValue,unBufferSize); + return result; + } +} + + +public class CVROverlay +{ + IVROverlay FnTable; + internal CVROverlay(IntPtr pInterface) + { + FnTable = (IVROverlay)Marshal.PtrToStructure(pInterface, typeof(IVROverlay)); + } + public EVROverlayError FindOverlay(string pchOverlayKey,ref ulong pOverlayHandle) + { + pOverlayHandle = 0; + EVROverlayError result = FnTable.FindOverlay(pchOverlayKey,ref pOverlayHandle); + return result; + } + public EVROverlayError CreateOverlay(string pchOverlayKey,string pchOverlayName,ref ulong pOverlayHandle) + { + pOverlayHandle = 0; + EVROverlayError result = FnTable.CreateOverlay(pchOverlayKey,pchOverlayName,ref pOverlayHandle); + return result; + } + public EVROverlayError DestroyOverlay(ulong ulOverlayHandle) + { + EVROverlayError result = FnTable.DestroyOverlay(ulOverlayHandle); + return result; + } + public EVROverlayError SetHighQualityOverlay(ulong ulOverlayHandle) + { + EVROverlayError result = FnTable.SetHighQualityOverlay(ulOverlayHandle); + return result; + } + public ulong GetHighQualityOverlay() + { + ulong result = FnTable.GetHighQualityOverlay(); + return result; + } + public uint GetOverlayKey(ulong ulOverlayHandle,System.Text.StringBuilder pchValue,uint unBufferSize,ref EVROverlayError pError) + { + uint result = FnTable.GetOverlayKey(ulOverlayHandle,pchValue,unBufferSize,ref pError); + return result; + } + public uint GetOverlayName(ulong ulOverlayHandle,System.Text.StringBuilder pchValue,uint unBufferSize,ref EVROverlayError pError) + { + uint result = FnTable.GetOverlayName(ulOverlayHandle,pchValue,unBufferSize,ref pError); + return result; + } + public EVROverlayError SetOverlayName(ulong ulOverlayHandle,string pchName) + { + EVROverlayError result = FnTable.SetOverlayName(ulOverlayHandle,pchName); + return result; + } + public EVROverlayError GetOverlayImageData(ulong ulOverlayHandle,IntPtr pvBuffer,uint unBufferSize,ref uint punWidth,ref uint punHeight) + { + punWidth = 0; + punHeight = 0; + EVROverlayError result = FnTable.GetOverlayImageData(ulOverlayHandle,pvBuffer,unBufferSize,ref punWidth,ref punHeight); + return result; + } + public string GetOverlayErrorNameFromEnum(EVROverlayError error) + { + IntPtr result = FnTable.GetOverlayErrorNameFromEnum(error); + return Marshal.PtrToStringAnsi(result); + } + public EVROverlayError SetOverlayRenderingPid(ulong ulOverlayHandle,uint unPID) + { + EVROverlayError result = FnTable.SetOverlayRenderingPid(ulOverlayHandle,unPID); + return result; + } + public uint GetOverlayRenderingPid(ulong ulOverlayHandle) + { + uint result = FnTable.GetOverlayRenderingPid(ulOverlayHandle); + return result; + } + public EVROverlayError SetOverlayFlag(ulong ulOverlayHandle,VROverlayFlags eOverlayFlag,bool bEnabled) + { + EVROverlayError result = FnTable.SetOverlayFlag(ulOverlayHandle,eOverlayFlag,bEnabled); + return result; + } + public EVROverlayError GetOverlayFlag(ulong ulOverlayHandle,VROverlayFlags eOverlayFlag,ref bool pbEnabled) + { + pbEnabled = false; + EVROverlayError result = FnTable.GetOverlayFlag(ulOverlayHandle,eOverlayFlag,ref pbEnabled); + return result; + } + public EVROverlayError SetOverlayColor(ulong ulOverlayHandle,float fRed,float fGreen,float fBlue) + { + EVROverlayError result = FnTable.SetOverlayColor(ulOverlayHandle,fRed,fGreen,fBlue); + return result; + } + public EVROverlayError GetOverlayColor(ulong ulOverlayHandle,ref float pfRed,ref float pfGreen,ref float pfBlue) + { + pfRed = 0; + pfGreen = 0; + pfBlue = 0; + EVROverlayError result = FnTable.GetOverlayColor(ulOverlayHandle,ref pfRed,ref pfGreen,ref pfBlue); + return result; + } + public EVROverlayError SetOverlayAlpha(ulong ulOverlayHandle,float fAlpha) + { + EVROverlayError result = FnTable.SetOverlayAlpha(ulOverlayHandle,fAlpha); + return result; + } + public EVROverlayError GetOverlayAlpha(ulong ulOverlayHandle,ref float pfAlpha) + { + pfAlpha = 0; + EVROverlayError result = FnTable.GetOverlayAlpha(ulOverlayHandle,ref pfAlpha); + return result; + } + public EVROverlayError SetOverlayTexelAspect(ulong ulOverlayHandle,float fTexelAspect) + { + EVROverlayError result = FnTable.SetOverlayTexelAspect(ulOverlayHandle,fTexelAspect); + return result; + } + public EVROverlayError GetOverlayTexelAspect(ulong ulOverlayHandle,ref float pfTexelAspect) + { + pfTexelAspect = 0; + EVROverlayError result = FnTable.GetOverlayTexelAspect(ulOverlayHandle,ref pfTexelAspect); + return result; + } + public EVROverlayError SetOverlaySortOrder(ulong ulOverlayHandle,uint unSortOrder) + { + EVROverlayError result = FnTable.SetOverlaySortOrder(ulOverlayHandle,unSortOrder); + return result; + } + public EVROverlayError GetOverlaySortOrder(ulong ulOverlayHandle,ref uint punSortOrder) + { + punSortOrder = 0; + EVROverlayError result = FnTable.GetOverlaySortOrder(ulOverlayHandle,ref punSortOrder); + return result; + } + public EVROverlayError SetOverlayWidthInMeters(ulong ulOverlayHandle,float fWidthInMeters) + { + EVROverlayError result = FnTable.SetOverlayWidthInMeters(ulOverlayHandle,fWidthInMeters); + return result; + } + public EVROverlayError GetOverlayWidthInMeters(ulong ulOverlayHandle,ref float pfWidthInMeters) + { + pfWidthInMeters = 0; + EVROverlayError result = FnTable.GetOverlayWidthInMeters(ulOverlayHandle,ref pfWidthInMeters); + return result; + } + public EVROverlayError SetOverlayAutoCurveDistanceRangeInMeters(ulong ulOverlayHandle,float fMinDistanceInMeters,float fMaxDistanceInMeters) + { + EVROverlayError result = FnTable.SetOverlayAutoCurveDistanceRangeInMeters(ulOverlayHandle,fMinDistanceInMeters,fMaxDistanceInMeters); + return result; + } + public EVROverlayError GetOverlayAutoCurveDistanceRangeInMeters(ulong ulOverlayHandle,ref float pfMinDistanceInMeters,ref float pfMaxDistanceInMeters) + { + pfMinDistanceInMeters = 0; + pfMaxDistanceInMeters = 0; + EVROverlayError result = FnTable.GetOverlayAutoCurveDistanceRangeInMeters(ulOverlayHandle,ref pfMinDistanceInMeters,ref pfMaxDistanceInMeters); + return result; + } + public EVROverlayError SetOverlayTextureColorSpace(ulong ulOverlayHandle,EColorSpace eTextureColorSpace) + { + EVROverlayError result = FnTable.SetOverlayTextureColorSpace(ulOverlayHandle,eTextureColorSpace); + return result; + } + public EVROverlayError GetOverlayTextureColorSpace(ulong ulOverlayHandle,ref EColorSpace peTextureColorSpace) + { + EVROverlayError result = FnTable.GetOverlayTextureColorSpace(ulOverlayHandle,ref peTextureColorSpace); + return result; + } + public EVROverlayError SetOverlayTextureBounds(ulong ulOverlayHandle,ref VRTextureBounds_t pOverlayTextureBounds) + { + EVROverlayError result = FnTable.SetOverlayTextureBounds(ulOverlayHandle,ref pOverlayTextureBounds); + return result; + } + public EVROverlayError GetOverlayTextureBounds(ulong ulOverlayHandle,ref VRTextureBounds_t pOverlayTextureBounds) + { + EVROverlayError result = FnTable.GetOverlayTextureBounds(ulOverlayHandle,ref pOverlayTextureBounds); + return result; + } + public uint GetOverlayRenderModel(ulong ulOverlayHandle,string pchValue,uint unBufferSize,ref HmdColor_t pColor,ref EVROverlayError pError) + { + uint result = FnTable.GetOverlayRenderModel(ulOverlayHandle,pchValue,unBufferSize,ref pColor,ref pError); + return result; + } + public EVROverlayError SetOverlayRenderModel(ulong ulOverlayHandle,string pchRenderModel,ref HmdColor_t pColor) + { + EVROverlayError result = FnTable.SetOverlayRenderModel(ulOverlayHandle,pchRenderModel,ref pColor); + return result; + } + public EVROverlayError GetOverlayTransformType(ulong ulOverlayHandle,ref VROverlayTransformType peTransformType) + { + EVROverlayError result = FnTable.GetOverlayTransformType(ulOverlayHandle,ref peTransformType); + return result; + } + public EVROverlayError SetOverlayTransformAbsolute(ulong ulOverlayHandle,ETrackingUniverseOrigin eTrackingOrigin,ref HmdMatrix34_t pmatTrackingOriginToOverlayTransform) + { + EVROverlayError result = FnTable.SetOverlayTransformAbsolute(ulOverlayHandle,eTrackingOrigin,ref pmatTrackingOriginToOverlayTransform); + return result; + } + public EVROverlayError GetOverlayTransformAbsolute(ulong ulOverlayHandle,ref ETrackingUniverseOrigin peTrackingOrigin,ref HmdMatrix34_t pmatTrackingOriginToOverlayTransform) + { + EVROverlayError result = FnTable.GetOverlayTransformAbsolute(ulOverlayHandle,ref peTrackingOrigin,ref pmatTrackingOriginToOverlayTransform); + return result; + } + public EVROverlayError SetOverlayTransformTrackedDeviceRelative(ulong ulOverlayHandle,uint unTrackedDevice,ref HmdMatrix34_t pmatTrackedDeviceToOverlayTransform) + { + EVROverlayError result = FnTable.SetOverlayTransformTrackedDeviceRelative(ulOverlayHandle,unTrackedDevice,ref pmatTrackedDeviceToOverlayTransform); + return result; + } + public EVROverlayError GetOverlayTransformTrackedDeviceRelative(ulong ulOverlayHandle,ref uint punTrackedDevice,ref HmdMatrix34_t pmatTrackedDeviceToOverlayTransform) + { + punTrackedDevice = 0; + EVROverlayError result = FnTable.GetOverlayTransformTrackedDeviceRelative(ulOverlayHandle,ref punTrackedDevice,ref pmatTrackedDeviceToOverlayTransform); + return result; + } + public EVROverlayError SetOverlayTransformTrackedDeviceComponent(ulong ulOverlayHandle,uint unDeviceIndex,string pchComponentName) + { + EVROverlayError result = FnTable.SetOverlayTransformTrackedDeviceComponent(ulOverlayHandle,unDeviceIndex,pchComponentName); + return result; + } + public EVROverlayError GetOverlayTransformTrackedDeviceComponent(ulong ulOverlayHandle,ref uint punDeviceIndex,string pchComponentName,uint unComponentNameSize) + { + punDeviceIndex = 0; + EVROverlayError result = FnTable.GetOverlayTransformTrackedDeviceComponent(ulOverlayHandle,ref punDeviceIndex,pchComponentName,unComponentNameSize); + return result; + } + public EVROverlayError GetOverlayTransformOverlayRelative(ulong ulOverlayHandle,ref ulong ulOverlayHandleParent,ref HmdMatrix34_t pmatParentOverlayToOverlayTransform) + { + ulOverlayHandleParent = 0; + EVROverlayError result = FnTable.GetOverlayTransformOverlayRelative(ulOverlayHandle,ref ulOverlayHandleParent,ref pmatParentOverlayToOverlayTransform); + return result; + } + public EVROverlayError SetOverlayTransformOverlayRelative(ulong ulOverlayHandle,ulong ulOverlayHandleParent,ref HmdMatrix34_t pmatParentOverlayToOverlayTransform) + { + EVROverlayError result = FnTable.SetOverlayTransformOverlayRelative(ulOverlayHandle,ulOverlayHandleParent,ref pmatParentOverlayToOverlayTransform); + return result; + } + public EVROverlayError ShowOverlay(ulong ulOverlayHandle) + { + EVROverlayError result = FnTable.ShowOverlay(ulOverlayHandle); + return result; + } + public EVROverlayError HideOverlay(ulong ulOverlayHandle) + { + EVROverlayError result = FnTable.HideOverlay(ulOverlayHandle); + return result; + } + public bool IsOverlayVisible(ulong ulOverlayHandle) + { + bool result = FnTable.IsOverlayVisible(ulOverlayHandle); + return result; + } + public EVROverlayError GetTransformForOverlayCoordinates(ulong ulOverlayHandle,ETrackingUniverseOrigin eTrackingOrigin,HmdVector2_t coordinatesInOverlay,ref HmdMatrix34_t pmatTransform) + { + EVROverlayError result = FnTable.GetTransformForOverlayCoordinates(ulOverlayHandle,eTrackingOrigin,coordinatesInOverlay,ref pmatTransform); + return result; + } +// This is a terrible hack to workaround the fact that VRControllerState_t and VREvent_t were +// originally mis-compiled with the wrong packing for Linux and OSX. + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _PollNextOverlayEventPacked(ulong ulOverlayHandle,ref VREvent_t_Packed pEvent,uint uncbVREvent); + [StructLayout(LayoutKind.Explicit)] + struct PollNextOverlayEventUnion + { + [FieldOffset(0)] + public IVROverlay._PollNextOverlayEvent pPollNextOverlayEvent; + [FieldOffset(0)] + public _PollNextOverlayEventPacked pPollNextOverlayEventPacked; + } + public bool PollNextOverlayEvent(ulong ulOverlayHandle,ref VREvent_t pEvent,uint uncbVREvent) + { + if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || + (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) + { + PollNextOverlayEventUnion u; + VREvent_t_Packed event_packed = new VREvent_t_Packed(); + u.pPollNextOverlayEventPacked = null; + u.pPollNextOverlayEvent = FnTable.PollNextOverlayEvent; + bool packed_result = u.pPollNextOverlayEventPacked(ulOverlayHandle,ref event_packed,(uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VREvent_t_Packed))); + + event_packed.Unpack(ref pEvent); + return packed_result; + } + bool result = FnTable.PollNextOverlayEvent(ulOverlayHandle,ref pEvent,uncbVREvent); + return result; + } + public EVROverlayError GetOverlayInputMethod(ulong ulOverlayHandle,ref VROverlayInputMethod peInputMethod) + { + EVROverlayError result = FnTable.GetOverlayInputMethod(ulOverlayHandle,ref peInputMethod); + return result; + } + public EVROverlayError SetOverlayInputMethod(ulong ulOverlayHandle,VROverlayInputMethod eInputMethod) + { + EVROverlayError result = FnTable.SetOverlayInputMethod(ulOverlayHandle,eInputMethod); + return result; + } + public EVROverlayError GetOverlayMouseScale(ulong ulOverlayHandle,ref HmdVector2_t pvecMouseScale) + { + EVROverlayError result = FnTable.GetOverlayMouseScale(ulOverlayHandle,ref pvecMouseScale); + return result; + } + public EVROverlayError SetOverlayMouseScale(ulong ulOverlayHandle,ref HmdVector2_t pvecMouseScale) + { + EVROverlayError result = FnTable.SetOverlayMouseScale(ulOverlayHandle,ref pvecMouseScale); + return result; + } + public bool ComputeOverlayIntersection(ulong ulOverlayHandle,ref VROverlayIntersectionParams_t pParams,ref VROverlayIntersectionResults_t pResults) + { + bool result = FnTable.ComputeOverlayIntersection(ulOverlayHandle,ref pParams,ref pResults); + return result; + } + public bool HandleControllerOverlayInteractionAsMouse(ulong ulOverlayHandle,uint unControllerDeviceIndex) + { + bool result = FnTable.HandleControllerOverlayInteractionAsMouse(ulOverlayHandle,unControllerDeviceIndex); + return result; + } + public bool IsHoverTargetOverlay(ulong ulOverlayHandle) + { + bool result = FnTable.IsHoverTargetOverlay(ulOverlayHandle); + return result; + } + public ulong GetGamepadFocusOverlay() + { + ulong result = FnTable.GetGamepadFocusOverlay(); + return result; + } + public EVROverlayError SetGamepadFocusOverlay(ulong ulNewFocusOverlay) + { + EVROverlayError result = FnTable.SetGamepadFocusOverlay(ulNewFocusOverlay); + return result; + } + public EVROverlayError SetOverlayNeighbor(EOverlayDirection eDirection,ulong ulFrom,ulong ulTo) + { + EVROverlayError result = FnTable.SetOverlayNeighbor(eDirection,ulFrom,ulTo); + return result; + } + public EVROverlayError MoveGamepadFocusToNeighbor(EOverlayDirection eDirection,ulong ulFrom) + { + EVROverlayError result = FnTable.MoveGamepadFocusToNeighbor(eDirection,ulFrom); + return result; + } + public EVROverlayError SetOverlayTexture(ulong ulOverlayHandle,ref Texture_t pTexture) + { + EVROverlayError result = FnTable.SetOverlayTexture(ulOverlayHandle,ref pTexture); + return result; + } + public EVROverlayError ClearOverlayTexture(ulong ulOverlayHandle) + { + EVROverlayError result = FnTable.ClearOverlayTexture(ulOverlayHandle); + return result; + } + public EVROverlayError SetOverlayRaw(ulong ulOverlayHandle,IntPtr pvBuffer,uint unWidth,uint unHeight,uint unDepth) + { + EVROverlayError result = FnTable.SetOverlayRaw(ulOverlayHandle,pvBuffer,unWidth,unHeight,unDepth); + return result; + } + public EVROverlayError SetOverlayFromFile(ulong ulOverlayHandle,string pchFilePath) + { + EVROverlayError result = FnTable.SetOverlayFromFile(ulOverlayHandle,pchFilePath); + return result; + } + public EVROverlayError GetOverlayTexture(ulong ulOverlayHandle,ref IntPtr pNativeTextureHandle,IntPtr pNativeTextureRef,ref uint pWidth,ref uint pHeight,ref uint pNativeFormat,ref ETextureType pAPIType,ref EColorSpace pColorSpace,ref VRTextureBounds_t pTextureBounds) + { + pWidth = 0; + pHeight = 0; + pNativeFormat = 0; + EVROverlayError result = FnTable.GetOverlayTexture(ulOverlayHandle,ref pNativeTextureHandle,pNativeTextureRef,ref pWidth,ref pHeight,ref pNativeFormat,ref pAPIType,ref pColorSpace,ref pTextureBounds); + return result; + } + public EVROverlayError ReleaseNativeOverlayHandle(ulong ulOverlayHandle,IntPtr pNativeTextureHandle) + { + EVROverlayError result = FnTable.ReleaseNativeOverlayHandle(ulOverlayHandle,pNativeTextureHandle); + return result; + } + public EVROverlayError GetOverlayTextureSize(ulong ulOverlayHandle,ref uint pWidth,ref uint pHeight) + { + pWidth = 0; + pHeight = 0; + EVROverlayError result = FnTable.GetOverlayTextureSize(ulOverlayHandle,ref pWidth,ref pHeight); + return result; + } + public EVROverlayError CreateDashboardOverlay(string pchOverlayKey,string pchOverlayFriendlyName,ref ulong pMainHandle,ref ulong pThumbnailHandle) + { + pMainHandle = 0; + pThumbnailHandle = 0; + EVROverlayError result = FnTable.CreateDashboardOverlay(pchOverlayKey,pchOverlayFriendlyName,ref pMainHandle,ref pThumbnailHandle); + return result; + } + public bool IsDashboardVisible() + { + bool result = FnTable.IsDashboardVisible(); + return result; + } + public bool IsActiveDashboardOverlay(ulong ulOverlayHandle) + { + bool result = FnTable.IsActiveDashboardOverlay(ulOverlayHandle); + return result; + } + public EVROverlayError SetDashboardOverlaySceneProcess(ulong ulOverlayHandle,uint unProcessId) + { + EVROverlayError result = FnTable.SetDashboardOverlaySceneProcess(ulOverlayHandle,unProcessId); + return result; + } + public EVROverlayError GetDashboardOverlaySceneProcess(ulong ulOverlayHandle,ref uint punProcessId) + { + punProcessId = 0; + EVROverlayError result = FnTable.GetDashboardOverlaySceneProcess(ulOverlayHandle,ref punProcessId); + return result; + } + public void ShowDashboard(string pchOverlayToShow) + { + FnTable.ShowDashboard(pchOverlayToShow); + } + public uint GetPrimaryDashboardDevice() + { + uint result = FnTable.GetPrimaryDashboardDevice(); + return result; + } + public EVROverlayError ShowKeyboard(int eInputMode,int eLineInputMode,string pchDescription,uint unCharMax,string pchExistingText,bool bUseMinimalMode,ulong uUserValue) + { + EVROverlayError result = FnTable.ShowKeyboard(eInputMode,eLineInputMode,pchDescription,unCharMax,pchExistingText,bUseMinimalMode,uUserValue); + return result; + } + public EVROverlayError ShowKeyboardForOverlay(ulong ulOverlayHandle,int eInputMode,int eLineInputMode,string pchDescription,uint unCharMax,string pchExistingText,bool bUseMinimalMode,ulong uUserValue) + { + EVROverlayError result = FnTable.ShowKeyboardForOverlay(ulOverlayHandle,eInputMode,eLineInputMode,pchDescription,unCharMax,pchExistingText,bUseMinimalMode,uUserValue); + return result; + } + public uint GetKeyboardText(System.Text.StringBuilder pchText,uint cchText) + { + uint result = FnTable.GetKeyboardText(pchText,cchText); + return result; + } + public void HideKeyboard() + { + FnTable.HideKeyboard(); + } + public void SetKeyboardTransformAbsolute(ETrackingUniverseOrigin eTrackingOrigin,ref HmdMatrix34_t pmatTrackingOriginToKeyboardTransform) + { + FnTable.SetKeyboardTransformAbsolute(eTrackingOrigin,ref pmatTrackingOriginToKeyboardTransform); + } + public void SetKeyboardPositionForOverlay(ulong ulOverlayHandle,HmdRect2_t avoidRect) + { + FnTable.SetKeyboardPositionForOverlay(ulOverlayHandle,avoidRect); + } + public EVROverlayError SetOverlayIntersectionMask(ulong ulOverlayHandle,ref VROverlayIntersectionMaskPrimitive_t pMaskPrimitives,uint unNumMaskPrimitives,uint unPrimitiveSize) + { + EVROverlayError result = FnTable.SetOverlayIntersectionMask(ulOverlayHandle,ref pMaskPrimitives,unNumMaskPrimitives,unPrimitiveSize); + return result; + } + public EVROverlayError GetOverlayFlags(ulong ulOverlayHandle,ref uint pFlags) + { + pFlags = 0; + EVROverlayError result = FnTable.GetOverlayFlags(ulOverlayHandle,ref pFlags); + return result; + } + public VRMessageOverlayResponse ShowMessageOverlay(string pchText,string pchCaption,string pchButton0Text,string pchButton1Text,string pchButton2Text,string pchButton3Text) + { + VRMessageOverlayResponse result = FnTable.ShowMessageOverlay(pchText,pchCaption,pchButton0Text,pchButton1Text,pchButton2Text,pchButton3Text); + return result; + } +} + + +public class CVRRenderModels +{ + IVRRenderModels FnTable; + internal CVRRenderModels(IntPtr pInterface) + { + FnTable = (IVRRenderModels)Marshal.PtrToStructure(pInterface, typeof(IVRRenderModels)); + } + public EVRRenderModelError LoadRenderModel_Async(string pchRenderModelName,ref IntPtr ppRenderModel) + { + EVRRenderModelError result = FnTable.LoadRenderModel_Async(pchRenderModelName,ref ppRenderModel); + return result; + } + public void FreeRenderModel(IntPtr pRenderModel) + { + FnTable.FreeRenderModel(pRenderModel); + } + public EVRRenderModelError LoadTexture_Async(int textureId,ref IntPtr ppTexture) + { + EVRRenderModelError result = FnTable.LoadTexture_Async(textureId,ref ppTexture); + return result; + } + public void FreeTexture(IntPtr pTexture) + { + FnTable.FreeTexture(pTexture); + } + public EVRRenderModelError LoadTextureD3D11_Async(int textureId,IntPtr pD3D11Device,ref IntPtr ppD3D11Texture2D) + { + EVRRenderModelError result = FnTable.LoadTextureD3D11_Async(textureId,pD3D11Device,ref ppD3D11Texture2D); + return result; + } + public EVRRenderModelError LoadIntoTextureD3D11_Async(int textureId,IntPtr pDstTexture) + { + EVRRenderModelError result = FnTable.LoadIntoTextureD3D11_Async(textureId,pDstTexture); + return result; + } + public void FreeTextureD3D11(IntPtr pD3D11Texture2D) + { + FnTable.FreeTextureD3D11(pD3D11Texture2D); + } + public uint GetRenderModelName(uint unRenderModelIndex,System.Text.StringBuilder pchRenderModelName,uint unRenderModelNameLen) + { + uint result = FnTable.GetRenderModelName(unRenderModelIndex,pchRenderModelName,unRenderModelNameLen); + return result; + } + public uint GetRenderModelCount() + { + uint result = FnTable.GetRenderModelCount(); + return result; + } + public uint GetComponentCount(string pchRenderModelName) + { + uint result = FnTable.GetComponentCount(pchRenderModelName); + return result; + } + public uint GetComponentName(string pchRenderModelName,uint unComponentIndex,System.Text.StringBuilder pchComponentName,uint unComponentNameLen) + { + uint result = FnTable.GetComponentName(pchRenderModelName,unComponentIndex,pchComponentName,unComponentNameLen); + return result; + } + public ulong GetComponentButtonMask(string pchRenderModelName,string pchComponentName) + { + ulong result = FnTable.GetComponentButtonMask(pchRenderModelName,pchComponentName); + return result; + } + public uint GetComponentRenderModelName(string pchRenderModelName,string pchComponentName,System.Text.StringBuilder pchComponentRenderModelName,uint unComponentRenderModelNameLen) + { + uint result = FnTable.GetComponentRenderModelName(pchRenderModelName,pchComponentName,pchComponentRenderModelName,unComponentRenderModelNameLen); + return result; + } +// This is a terrible hack to workaround the fact that VRControllerState_t and VREvent_t were +// originally mis-compiled with the wrong packing for Linux and OSX. + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetComponentStatePacked(string pchRenderModelName,string pchComponentName,ref VRControllerState_t_Packed pControllerState,ref RenderModel_ControllerMode_State_t pState,ref RenderModel_ComponentState_t pComponentState); + [StructLayout(LayoutKind.Explicit)] + struct GetComponentStateUnion + { + [FieldOffset(0)] + public IVRRenderModels._GetComponentState pGetComponentState; + [FieldOffset(0)] + public _GetComponentStatePacked pGetComponentStatePacked; + } + public bool GetComponentState(string pchRenderModelName,string pchComponentName,ref VRControllerState_t pControllerState,ref RenderModel_ControllerMode_State_t pState,ref RenderModel_ComponentState_t pComponentState) + { + if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || + (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) + { + GetComponentStateUnion u; + VRControllerState_t_Packed state_packed = new VRControllerState_t_Packed(pControllerState); + u.pGetComponentStatePacked = null; + u.pGetComponentState = FnTable.GetComponentState; + bool packed_result = u.pGetComponentStatePacked(pchRenderModelName,pchComponentName,ref state_packed,ref pState,ref pComponentState); + + state_packed.Unpack(ref pControllerState); + return packed_result; + } + bool result = FnTable.GetComponentState(pchRenderModelName,pchComponentName,ref pControllerState,ref pState,ref pComponentState); + return result; + } + public bool RenderModelHasComponent(string pchRenderModelName,string pchComponentName) + { + bool result = FnTable.RenderModelHasComponent(pchRenderModelName,pchComponentName); + return result; + } + public uint GetRenderModelThumbnailURL(string pchRenderModelName,System.Text.StringBuilder pchThumbnailURL,uint unThumbnailURLLen,ref EVRRenderModelError peError) + { + uint result = FnTable.GetRenderModelThumbnailURL(pchRenderModelName,pchThumbnailURL,unThumbnailURLLen,ref peError); + return result; + } + public uint GetRenderModelOriginalPath(string pchRenderModelName,System.Text.StringBuilder pchOriginalPath,uint unOriginalPathLen,ref EVRRenderModelError peError) + { + uint result = FnTable.GetRenderModelOriginalPath(pchRenderModelName,pchOriginalPath,unOriginalPathLen,ref peError); + return result; + } + public string GetRenderModelErrorNameFromEnum(EVRRenderModelError error) + { + IntPtr result = FnTable.GetRenderModelErrorNameFromEnum(error); + return Marshal.PtrToStringAnsi(result); + } +} + + +public class CVRNotifications +{ + IVRNotifications FnTable; + internal CVRNotifications(IntPtr pInterface) + { + FnTable = (IVRNotifications)Marshal.PtrToStructure(pInterface, typeof(IVRNotifications)); + } + public EVRNotificationError CreateNotification(ulong ulOverlayHandle,ulong ulUserValue,EVRNotificationType type,string pchText,EVRNotificationStyle style,ref NotificationBitmap_t pImage,ref uint pNotificationId) + { + pNotificationId = 0; + EVRNotificationError result = FnTable.CreateNotification(ulOverlayHandle,ulUserValue,type,pchText,style,ref pImage,ref pNotificationId); + return result; + } + public EVRNotificationError RemoveNotification(uint notificationId) + { + EVRNotificationError result = FnTable.RemoveNotification(notificationId); + return result; + } +} + + +public class CVRSettings +{ + IVRSettings FnTable; + internal CVRSettings(IntPtr pInterface) + { + FnTable = (IVRSettings)Marshal.PtrToStructure(pInterface, typeof(IVRSettings)); + } + public string GetSettingsErrorNameFromEnum(EVRSettingsError eError) + { + IntPtr result = FnTable.GetSettingsErrorNameFromEnum(eError); + return Marshal.PtrToStringAnsi(result); + } + public bool Sync(bool bForce,ref EVRSettingsError peError) + { + bool result = FnTable.Sync(bForce,ref peError); + return result; + } + public void SetBool(string pchSection,string pchSettingsKey,bool bValue,ref EVRSettingsError peError) + { + FnTable.SetBool(pchSection,pchSettingsKey,bValue,ref peError); + } + public void SetInt32(string pchSection,string pchSettingsKey,int nValue,ref EVRSettingsError peError) + { + FnTable.SetInt32(pchSection,pchSettingsKey,nValue,ref peError); + } + public void SetFloat(string pchSection,string pchSettingsKey,float flValue,ref EVRSettingsError peError) + { + FnTable.SetFloat(pchSection,pchSettingsKey,flValue,ref peError); + } + public void SetString(string pchSection,string pchSettingsKey,string pchValue,ref EVRSettingsError peError) + { + FnTable.SetString(pchSection,pchSettingsKey,pchValue,ref peError); + } + public bool GetBool(string pchSection,string pchSettingsKey,ref EVRSettingsError peError) + { + bool result = FnTable.GetBool(pchSection,pchSettingsKey,ref peError); + return result; + } + public int GetInt32(string pchSection,string pchSettingsKey,ref EVRSettingsError peError) + { + int result = FnTable.GetInt32(pchSection,pchSettingsKey,ref peError); + return result; + } + public float GetFloat(string pchSection,string pchSettingsKey,ref EVRSettingsError peError) + { + float result = FnTable.GetFloat(pchSection,pchSettingsKey,ref peError); + return result; + } + public void GetString(string pchSection,string pchSettingsKey,System.Text.StringBuilder pchValue,uint unValueLen,ref EVRSettingsError peError) + { + FnTable.GetString(pchSection,pchSettingsKey,pchValue,unValueLen,ref peError); + } + public void RemoveSection(string pchSection,ref EVRSettingsError peError) + { + FnTable.RemoveSection(pchSection,ref peError); + } + public void RemoveKeyInSection(string pchSection,string pchSettingsKey,ref EVRSettingsError peError) + { + FnTable.RemoveKeyInSection(pchSection,pchSettingsKey,ref peError); + } +} + + +public class CVRScreenshots +{ + IVRScreenshots FnTable; + internal CVRScreenshots(IntPtr pInterface) + { + FnTable = (IVRScreenshots)Marshal.PtrToStructure(pInterface, typeof(IVRScreenshots)); + } + public EVRScreenshotError RequestScreenshot(ref uint pOutScreenshotHandle,EVRScreenshotType type,string pchPreviewFilename,string pchVRFilename) + { + pOutScreenshotHandle = 0; + EVRScreenshotError result = FnTable.RequestScreenshot(ref pOutScreenshotHandle,type,pchPreviewFilename,pchVRFilename); + return result; + } + public EVRScreenshotError HookScreenshot(EVRScreenshotType [] pSupportedTypes) + { + EVRScreenshotError result = FnTable.HookScreenshot(pSupportedTypes,(int) pSupportedTypes.Length); + return result; + } + public EVRScreenshotType GetScreenshotPropertyType(uint screenshotHandle,ref EVRScreenshotError pError) + { + EVRScreenshotType result = FnTable.GetScreenshotPropertyType(screenshotHandle,ref pError); + return result; + } + public uint GetScreenshotPropertyFilename(uint screenshotHandle,EVRScreenshotPropertyFilenames filenameType,System.Text.StringBuilder pchFilename,uint cchFilename,ref EVRScreenshotError pError) + { + uint result = FnTable.GetScreenshotPropertyFilename(screenshotHandle,filenameType,pchFilename,cchFilename,ref pError); + return result; + } + public EVRScreenshotError UpdateScreenshotProgress(uint screenshotHandle,float flProgress) + { + EVRScreenshotError result = FnTable.UpdateScreenshotProgress(screenshotHandle,flProgress); + return result; + } + public EVRScreenshotError TakeStereoScreenshot(ref uint pOutScreenshotHandle,string pchPreviewFilename,string pchVRFilename) + { + pOutScreenshotHandle = 0; + EVRScreenshotError result = FnTable.TakeStereoScreenshot(ref pOutScreenshotHandle,pchPreviewFilename,pchVRFilename); + return result; + } + public EVRScreenshotError SubmitScreenshot(uint screenshotHandle,EVRScreenshotType type,string pchSourcePreviewFilename,string pchSourceVRFilename) + { + EVRScreenshotError result = FnTable.SubmitScreenshot(screenshotHandle,type,pchSourcePreviewFilename,pchSourceVRFilename); + return result; + } +} + + +public class CVRResources +{ + IVRResources FnTable; + internal CVRResources(IntPtr pInterface) + { + FnTable = (IVRResources)Marshal.PtrToStructure(pInterface, typeof(IVRResources)); + } + public uint LoadSharedResource(string pchResourceName,string pchBuffer,uint unBufferLen) + { + uint result = FnTable.LoadSharedResource(pchResourceName,pchBuffer,unBufferLen); + return result; + } + public uint GetResourceFullPath(string pchResourceName,string pchResourceTypeDirectory,string pchPathBuffer,uint unBufferLen) + { + uint result = FnTable.GetResourceFullPath(pchResourceName,pchResourceTypeDirectory,pchPathBuffer,unBufferLen); + return result; + } +} + + +public class CVRDriverManager +{ + IVRDriverManager FnTable; + internal CVRDriverManager(IntPtr pInterface) + { + FnTable = (IVRDriverManager)Marshal.PtrToStructure(pInterface, typeof(IVRDriverManager)); + } + public uint GetDriverCount() + { + uint result = FnTable.GetDriverCount(); + return result; + } + public uint GetDriverName(uint nDriver,System.Text.StringBuilder pchValue,uint unBufferSize) + { + uint result = FnTable.GetDriverName(nDriver,pchValue,unBufferSize); + return result; + } +} + + +public class OpenVRInterop +{ + [DllImportAttribute("openvr_api", EntryPoint = "VR_InitInternal", CallingConvention = CallingConvention.Cdecl)] + internal static extern uint InitInternal(ref EVRInitError peError, EVRApplicationType eApplicationType); + [DllImportAttribute("openvr_api", EntryPoint = "VR_ShutdownInternal", CallingConvention = CallingConvention.Cdecl)] + internal static extern void ShutdownInternal(); + [DllImportAttribute("openvr_api", EntryPoint = "VR_IsHmdPresent", CallingConvention = CallingConvention.Cdecl)] + internal static extern bool IsHmdPresent(); + [DllImportAttribute("openvr_api", EntryPoint = "VR_IsRuntimeInstalled", CallingConvention = CallingConvention.Cdecl)] + internal static extern bool IsRuntimeInstalled(); + [DllImportAttribute("openvr_api", EntryPoint = "VR_GetStringForHmdError", CallingConvention = CallingConvention.Cdecl)] + internal static extern IntPtr GetStringForHmdError(EVRInitError error); + [DllImportAttribute("openvr_api", EntryPoint = "VR_GetGenericInterface", CallingConvention = CallingConvention.Cdecl)] + internal static extern IntPtr GetGenericInterface([In, MarshalAs(UnmanagedType.LPStr)] string pchInterfaceVersion, ref EVRInitError peError); + [DllImportAttribute("openvr_api", EntryPoint = "VR_IsInterfaceVersionValid", CallingConvention = CallingConvention.Cdecl)] + internal static extern bool IsInterfaceVersionValid([In, MarshalAs(UnmanagedType.LPStr)] string pchInterfaceVersion); + [DllImportAttribute("openvr_api", EntryPoint = "VR_GetInitToken", CallingConvention = CallingConvention.Cdecl)] + internal static extern uint GetInitToken(); +} + + +public enum EVREye +{ + Eye_Left = 0, + Eye_Right = 1, +} +public enum ETextureType +{ + DirectX = 0, + OpenGL = 1, + Vulkan = 2, + IOSurface = 3, + DirectX12 = 4, +} +public enum EColorSpace +{ + Auto = 0, + Gamma = 1, + Linear = 2, +} +public enum ETrackingResult +{ + Uninitialized = 1, + Calibrating_InProgress = 100, + Calibrating_OutOfRange = 101, + Running_OK = 200, + Running_OutOfRange = 201, +} +public enum ETrackedDeviceClass +{ + Invalid = 0, + HMD = 1, + Controller = 2, + GenericTracker = 3, + TrackingReference = 4, + DisplayRedirect = 5, +} +public enum ETrackedControllerRole +{ + Invalid = 0, + LeftHand = 1, + RightHand = 2, +} +public enum ETrackingUniverseOrigin +{ + TrackingUniverseSeated = 0, + TrackingUniverseStanding = 1, + TrackingUniverseRawAndUncalibrated = 2, +} +public enum ETrackedDeviceProperty +{ + Prop_Invalid = 0, + Prop_TrackingSystemName_String = 1000, + Prop_ModelNumber_String = 1001, + Prop_SerialNumber_String = 1002, + Prop_RenderModelName_String = 1003, + Prop_WillDriftInYaw_Bool = 1004, + Prop_ManufacturerName_String = 1005, + Prop_TrackingFirmwareVersion_String = 1006, + Prop_HardwareRevision_String = 1007, + Prop_AllWirelessDongleDescriptions_String = 1008, + Prop_ConnectedWirelessDongle_String = 1009, + Prop_DeviceIsWireless_Bool = 1010, + Prop_DeviceIsCharging_Bool = 1011, + Prop_DeviceBatteryPercentage_Float = 1012, + Prop_StatusDisplayTransform_Matrix34 = 1013, + Prop_Firmware_UpdateAvailable_Bool = 1014, + Prop_Firmware_ManualUpdate_Bool = 1015, + Prop_Firmware_ManualUpdateURL_String = 1016, + Prop_HardwareRevision_Uint64 = 1017, + Prop_FirmwareVersion_Uint64 = 1018, + Prop_FPGAVersion_Uint64 = 1019, + Prop_VRCVersion_Uint64 = 1020, + Prop_RadioVersion_Uint64 = 1021, + Prop_DongleVersion_Uint64 = 1022, + Prop_BlockServerShutdown_Bool = 1023, + Prop_CanUnifyCoordinateSystemWithHmd_Bool = 1024, + Prop_ContainsProximitySensor_Bool = 1025, + Prop_DeviceProvidesBatteryStatus_Bool = 1026, + Prop_DeviceCanPowerOff_Bool = 1027, + Prop_Firmware_ProgrammingTarget_String = 1028, + Prop_DeviceClass_Int32 = 1029, + Prop_HasCamera_Bool = 1030, + Prop_DriverVersion_String = 1031, + Prop_Firmware_ForceUpdateRequired_Bool = 1032, + Prop_ViveSystemButtonFixRequired_Bool = 1033, + Prop_ParentDriver_Uint64 = 1034, + Prop_ResourceRoot_String = 1035, + Prop_ReportsTimeSinceVSync_Bool = 2000, + Prop_SecondsFromVsyncToPhotons_Float = 2001, + Prop_DisplayFrequency_Float = 2002, + Prop_UserIpdMeters_Float = 2003, + Prop_CurrentUniverseId_Uint64 = 2004, + Prop_PreviousUniverseId_Uint64 = 2005, + Prop_DisplayFirmwareVersion_Uint64 = 2006, + Prop_IsOnDesktop_Bool = 2007, + Prop_DisplayMCType_Int32 = 2008, + Prop_DisplayMCOffset_Float = 2009, + Prop_DisplayMCScale_Float = 2010, + Prop_EdidVendorID_Int32 = 2011, + Prop_DisplayMCImageLeft_String = 2012, + Prop_DisplayMCImageRight_String = 2013, + Prop_DisplayGCBlackClamp_Float = 2014, + Prop_EdidProductID_Int32 = 2015, + Prop_CameraToHeadTransform_Matrix34 = 2016, + Prop_DisplayGCType_Int32 = 2017, + Prop_DisplayGCOffset_Float = 2018, + Prop_DisplayGCScale_Float = 2019, + Prop_DisplayGCPrescale_Float = 2020, + Prop_DisplayGCImage_String = 2021, + Prop_LensCenterLeftU_Float = 2022, + Prop_LensCenterLeftV_Float = 2023, + Prop_LensCenterRightU_Float = 2024, + Prop_LensCenterRightV_Float = 2025, + Prop_UserHeadToEyeDepthMeters_Float = 2026, + Prop_CameraFirmwareVersion_Uint64 = 2027, + Prop_CameraFirmwareDescription_String = 2028, + Prop_DisplayFPGAVersion_Uint64 = 2029, + Prop_DisplayBootloaderVersion_Uint64 = 2030, + Prop_DisplayHardwareVersion_Uint64 = 2031, + Prop_AudioFirmwareVersion_Uint64 = 2032, + Prop_CameraCompatibilityMode_Int32 = 2033, + Prop_ScreenshotHorizontalFieldOfViewDegrees_Float = 2034, + Prop_ScreenshotVerticalFieldOfViewDegrees_Float = 2035, + Prop_DisplaySuppressed_Bool = 2036, + Prop_DisplayAllowNightMode_Bool = 2037, + Prop_DisplayMCImageWidth_Int32 = 2038, + Prop_DisplayMCImageHeight_Int32 = 2039, + Prop_DisplayMCImageNumChannels_Int32 = 2040, + Prop_DisplayMCImageData_Binary = 2041, + Prop_SecondsFromPhotonsToVblank_Float = 2042, + Prop_DriverDirectModeSendsVsyncEvents_Bool = 2043, + Prop_DisplayDebugMode_Bool = 2044, + Prop_GraphicsAdapterLuid_Uint64 = 2045, + Prop_AttachedDeviceId_String = 3000, + Prop_SupportedButtons_Uint64 = 3001, + Prop_Axis0Type_Int32 = 3002, + Prop_Axis1Type_Int32 = 3003, + Prop_Axis2Type_Int32 = 3004, + Prop_Axis3Type_Int32 = 3005, + Prop_Axis4Type_Int32 = 3006, + Prop_ControllerRoleHint_Int32 = 3007, + Prop_FieldOfViewLeftDegrees_Float = 4000, + Prop_FieldOfViewRightDegrees_Float = 4001, + Prop_FieldOfViewTopDegrees_Float = 4002, + Prop_FieldOfViewBottomDegrees_Float = 4003, + Prop_TrackingRangeMinimumMeters_Float = 4004, + Prop_TrackingRangeMaximumMeters_Float = 4005, + Prop_ModeLabel_String = 4006, + Prop_IconPathName_String = 5000, + Prop_NamedIconPathDeviceOff_String = 5001, + Prop_NamedIconPathDeviceSearching_String = 5002, + Prop_NamedIconPathDeviceSearchingAlert_String = 5003, + Prop_NamedIconPathDeviceReady_String = 5004, + Prop_NamedIconPathDeviceReadyAlert_String = 5005, + Prop_NamedIconPathDeviceNotReady_String = 5006, + Prop_NamedIconPathDeviceStandby_String = 5007, + Prop_NamedIconPathDeviceAlertLow_String = 5008, + Prop_DisplayHiddenArea_Binary_Start = 5100, + Prop_DisplayHiddenArea_Binary_End = 5150, + Prop_UserConfigPath_String = 6000, + Prop_InstallPath_String = 6001, + Prop_HasDisplayComponent_Bool = 6002, + Prop_HasControllerComponent_Bool = 6003, + Prop_HasCameraComponent_Bool = 6004, + Prop_HasDriverDirectModeComponent_Bool = 6005, + Prop_HasVirtualDisplayComponent_Bool = 6006, + Prop_VendorSpecific_Reserved_Start = 10000, + Prop_VendorSpecific_Reserved_End = 10999, +} +public enum ETrackedPropertyError +{ + TrackedProp_Success = 0, + TrackedProp_WrongDataType = 1, + TrackedProp_WrongDeviceClass = 2, + TrackedProp_BufferTooSmall = 3, + TrackedProp_UnknownProperty = 4, + TrackedProp_InvalidDevice = 5, + TrackedProp_CouldNotContactServer = 6, + TrackedProp_ValueNotProvidedByDevice = 7, + TrackedProp_StringExceedsMaximumLength = 8, + TrackedProp_NotYetAvailable = 9, + TrackedProp_PermissionDenied = 10, + TrackedProp_InvalidOperation = 11, +} +public enum EVRSubmitFlags +{ + Submit_Default = 0, + Submit_LensDistortionAlreadyApplied = 1, + Submit_GlRenderBuffer = 2, + Submit_Reserved = 4, +} +public enum EVRState +{ + Undefined = -1, + Off = 0, + Searching = 1, + Searching_Alert = 2, + Ready = 3, + Ready_Alert = 4, + NotReady = 5, + Standby = 6, + Ready_Alert_Low = 7, +} +public enum EVREventType +{ + VREvent_None = 0, + VREvent_TrackedDeviceActivated = 100, + VREvent_TrackedDeviceDeactivated = 101, + VREvent_TrackedDeviceUpdated = 102, + VREvent_TrackedDeviceUserInteractionStarted = 103, + VREvent_TrackedDeviceUserInteractionEnded = 104, + VREvent_IpdChanged = 105, + VREvent_EnterStandbyMode = 106, + VREvent_LeaveStandbyMode = 107, + VREvent_TrackedDeviceRoleChanged = 108, + VREvent_WatchdogWakeUpRequested = 109, + VREvent_LensDistortionChanged = 110, + VREvent_PropertyChanged = 111, + VREvent_ButtonPress = 200, + VREvent_ButtonUnpress = 201, + VREvent_ButtonTouch = 202, + VREvent_ButtonUntouch = 203, + VREvent_MouseMove = 300, + VREvent_MouseButtonDown = 301, + VREvent_MouseButtonUp = 302, + VREvent_FocusEnter = 303, + VREvent_FocusLeave = 304, + VREvent_Scroll = 305, + VREvent_TouchPadMove = 306, + VREvent_OverlayFocusChanged = 307, + VREvent_InputFocusCaptured = 400, + VREvent_InputFocusReleased = 401, + VREvent_SceneFocusLost = 402, + VREvent_SceneFocusGained = 403, + VREvent_SceneApplicationChanged = 404, + VREvent_SceneFocusChanged = 405, + VREvent_InputFocusChanged = 406, + VREvent_SceneApplicationSecondaryRenderingStarted = 407, + VREvent_HideRenderModels = 410, + VREvent_ShowRenderModels = 411, + VREvent_OverlayShown = 500, + VREvent_OverlayHidden = 501, + VREvent_DashboardActivated = 502, + VREvent_DashboardDeactivated = 503, + VREvent_DashboardThumbSelected = 504, + VREvent_DashboardRequested = 505, + VREvent_ResetDashboard = 506, + VREvent_RenderToast = 507, + VREvent_ImageLoaded = 508, + VREvent_ShowKeyboard = 509, + VREvent_HideKeyboard = 510, + VREvent_OverlayGamepadFocusGained = 511, + VREvent_OverlayGamepadFocusLost = 512, + VREvent_OverlaySharedTextureChanged = 513, + VREvent_DashboardGuideButtonDown = 514, + VREvent_DashboardGuideButtonUp = 515, + VREvent_ScreenshotTriggered = 516, + VREvent_ImageFailed = 517, + VREvent_DashboardOverlayCreated = 518, + VREvent_RequestScreenshot = 520, + VREvent_ScreenshotTaken = 521, + VREvent_ScreenshotFailed = 522, + VREvent_SubmitScreenshotToDashboard = 523, + VREvent_ScreenshotProgressToDashboard = 524, + VREvent_PrimaryDashboardDeviceChanged = 525, + VREvent_Notification_Shown = 600, + VREvent_Notification_Hidden = 601, + VREvent_Notification_BeginInteraction = 602, + VREvent_Notification_Destroyed = 603, + VREvent_Quit = 700, + VREvent_ProcessQuit = 701, + VREvent_QuitAborted_UserPrompt = 702, + VREvent_QuitAcknowledged = 703, + VREvent_DriverRequestedQuit = 704, + VREvent_ChaperoneDataHasChanged = 800, + VREvent_ChaperoneUniverseHasChanged = 801, + VREvent_ChaperoneTempDataHasChanged = 802, + VREvent_ChaperoneSettingsHaveChanged = 803, + VREvent_SeatedZeroPoseReset = 804, + VREvent_AudioSettingsHaveChanged = 820, + VREvent_BackgroundSettingHasChanged = 850, + VREvent_CameraSettingsHaveChanged = 851, + VREvent_ReprojectionSettingHasChanged = 852, + VREvent_ModelSkinSettingsHaveChanged = 853, + VREvent_EnvironmentSettingsHaveChanged = 854, + VREvent_PowerSettingsHaveChanged = 855, + VREvent_EnableHomeAppSettingsHaveChanged = 856, + VREvent_StatusUpdate = 900, + VREvent_MCImageUpdated = 1000, + VREvent_FirmwareUpdateStarted = 1100, + VREvent_FirmwareUpdateFinished = 1101, + VREvent_KeyboardClosed = 1200, + VREvent_KeyboardCharInput = 1201, + VREvent_KeyboardDone = 1202, + VREvent_ApplicationTransitionStarted = 1300, + VREvent_ApplicationTransitionAborted = 1301, + VREvent_ApplicationTransitionNewAppStarted = 1302, + VREvent_ApplicationListUpdated = 1303, + VREvent_ApplicationMimeTypeLoad = 1304, + VREvent_ApplicationTransitionNewAppLaunchComplete = 1305, + VREvent_ProcessConnected = 1306, + VREvent_ProcessDisconnected = 1307, + VREvent_Compositor_MirrorWindowShown = 1400, + VREvent_Compositor_MirrorWindowHidden = 1401, + VREvent_Compositor_ChaperoneBoundsShown = 1410, + VREvent_Compositor_ChaperoneBoundsHidden = 1411, + VREvent_TrackedCamera_StartVideoStream = 1500, + VREvent_TrackedCamera_StopVideoStream = 1501, + VREvent_TrackedCamera_PauseVideoStream = 1502, + VREvent_TrackedCamera_ResumeVideoStream = 1503, + VREvent_TrackedCamera_EditingSurface = 1550, + VREvent_PerformanceTest_EnableCapture = 1600, + VREvent_PerformanceTest_DisableCapture = 1601, + VREvent_PerformanceTest_FidelityLevel = 1602, + VREvent_MessageOverlay_Closed = 1650, + VREvent_VendorSpecific_Reserved_Start = 10000, + VREvent_VendorSpecific_Reserved_End = 19999, +} +public enum EDeviceActivityLevel +{ + k_EDeviceActivityLevel_Unknown = -1, + k_EDeviceActivityLevel_Idle = 0, + k_EDeviceActivityLevel_UserInteraction = 1, + k_EDeviceActivityLevel_UserInteraction_Timeout = 2, + k_EDeviceActivityLevel_Standby = 3, +} +public enum EVRButtonId +{ + k_EButton_System = 0, + k_EButton_ApplicationMenu = 1, + k_EButton_Grip = 2, + k_EButton_DPad_Left = 3, + k_EButton_DPad_Up = 4, + k_EButton_DPad_Right = 5, + k_EButton_DPad_Down = 6, + k_EButton_A = 7, + k_EButton_ProximitySensor = 31, + k_EButton_Axis0 = 32, + k_EButton_Axis1 = 33, + k_EButton_Axis2 = 34, + k_EButton_Axis3 = 35, + k_EButton_Axis4 = 36, + k_EButton_SteamVR_Touchpad = 32, + k_EButton_SteamVR_Trigger = 33, + k_EButton_Dashboard_Back = 2, + k_EButton_Max = 64, +} +public enum EVRMouseButton +{ + Left = 1, + Right = 2, + Middle = 4, +} +public enum EHiddenAreaMeshType +{ + k_eHiddenAreaMesh_Standard = 0, + k_eHiddenAreaMesh_Inverse = 1, + k_eHiddenAreaMesh_LineLoop = 2, + k_eHiddenAreaMesh_Max = 3, +} +public enum EVRControllerAxisType +{ + k_eControllerAxis_None = 0, + k_eControllerAxis_TrackPad = 1, + k_eControllerAxis_Joystick = 2, + k_eControllerAxis_Trigger = 3, +} +public enum EVRControllerEventOutputType +{ + ControllerEventOutput_OSEvents = 0, + ControllerEventOutput_VREvents = 1, +} +public enum ECollisionBoundsStyle +{ + COLLISION_BOUNDS_STYLE_BEGINNER = 0, + COLLISION_BOUNDS_STYLE_INTERMEDIATE = 1, + COLLISION_BOUNDS_STYLE_SQUARES = 2, + COLLISION_BOUNDS_STYLE_ADVANCED = 3, + COLLISION_BOUNDS_STYLE_NONE = 4, + COLLISION_BOUNDS_STYLE_COUNT = 5, +} +public enum EVROverlayError +{ + None = 0, + UnknownOverlay = 10, + InvalidHandle = 11, + PermissionDenied = 12, + OverlayLimitExceeded = 13, + WrongVisibilityType = 14, + KeyTooLong = 15, + NameTooLong = 16, + KeyInUse = 17, + WrongTransformType = 18, + InvalidTrackedDevice = 19, + InvalidParameter = 20, + ThumbnailCantBeDestroyed = 21, + ArrayTooSmall = 22, + RequestFailed = 23, + InvalidTexture = 24, + UnableToLoadFile = 25, + KeyboardAlreadyInUse = 26, + NoNeighbor = 27, + TooManyMaskPrimitives = 29, + BadMaskPrimitive = 30, +} +public enum EVRApplicationType +{ + VRApplication_Other = 0, + VRApplication_Scene = 1, + VRApplication_Overlay = 2, + VRApplication_Background = 3, + VRApplication_Utility = 4, + VRApplication_VRMonitor = 5, + VRApplication_SteamWatchdog = 6, + VRApplication_Bootstrapper = 7, + VRApplication_Max = 8, +} +public enum EVRFirmwareError +{ + None = 0, + Success = 1, + Fail = 2, +} +public enum EVRNotificationError +{ + OK = 0, + InvalidNotificationId = 100, + NotificationQueueFull = 101, + InvalidOverlayHandle = 102, + SystemWithUserValueAlreadyExists = 103, +} +public enum EVRInitError +{ + None = 0, + Unknown = 1, + Init_InstallationNotFound = 100, + Init_InstallationCorrupt = 101, + Init_VRClientDLLNotFound = 102, + Init_FileNotFound = 103, + Init_FactoryNotFound = 104, + Init_InterfaceNotFound = 105, + Init_InvalidInterface = 106, + Init_UserConfigDirectoryInvalid = 107, + Init_HmdNotFound = 108, + Init_NotInitialized = 109, + Init_PathRegistryNotFound = 110, + Init_NoConfigPath = 111, + Init_NoLogPath = 112, + Init_PathRegistryNotWritable = 113, + Init_AppInfoInitFailed = 114, + Init_Retry = 115, + Init_InitCanceledByUser = 116, + Init_AnotherAppLaunching = 117, + Init_SettingsInitFailed = 118, + Init_ShuttingDown = 119, + Init_TooManyObjects = 120, + Init_NoServerForBackgroundApp = 121, + Init_NotSupportedWithCompositor = 122, + Init_NotAvailableToUtilityApps = 123, + Init_Internal = 124, + Init_HmdDriverIdIsNone = 125, + Init_HmdNotFoundPresenceFailed = 126, + Init_VRMonitorNotFound = 127, + Init_VRMonitorStartupFailed = 128, + Init_LowPowerWatchdogNotSupported = 129, + Init_InvalidApplicationType = 130, + Init_NotAvailableToWatchdogApps = 131, + Init_WatchdogDisabledInSettings = 132, + Init_VRDashboardNotFound = 133, + Init_VRDashboardStartupFailed = 134, + Init_VRHomeNotFound = 135, + Init_VRHomeStartupFailed = 136, + Driver_Failed = 200, + Driver_Unknown = 201, + Driver_HmdUnknown = 202, + Driver_NotLoaded = 203, + Driver_RuntimeOutOfDate = 204, + Driver_HmdInUse = 205, + Driver_NotCalibrated = 206, + Driver_CalibrationInvalid = 207, + Driver_HmdDisplayNotFound = 208, + Driver_TrackedDeviceInterfaceUnknown = 209, + Driver_HmdDriverIdOutOfBounds = 211, + Driver_HmdDisplayMirrored = 212, + IPC_ServerInitFailed = 300, + IPC_ConnectFailed = 301, + IPC_SharedStateInitFailed = 302, + IPC_CompositorInitFailed = 303, + IPC_MutexInitFailed = 304, + IPC_Failed = 305, + IPC_CompositorConnectFailed = 306, + IPC_CompositorInvalidConnectResponse = 307, + IPC_ConnectFailedAfterMultipleAttempts = 308, + Compositor_Failed = 400, + Compositor_D3D11HardwareRequired = 401, + Compositor_FirmwareRequiresUpdate = 402, + Compositor_OverlayInitFailed = 403, + Compositor_ScreenshotsInitFailed = 404, + Compositor_UnableToCreateDevice = 405, + VendorSpecific_UnableToConnectToOculusRuntime = 1000, + VendorSpecific_HmdFound_CantOpenDevice = 1101, + VendorSpecific_HmdFound_UnableToRequestConfigStart = 1102, + VendorSpecific_HmdFound_NoStoredConfig = 1103, + VendorSpecific_HmdFound_ConfigTooBig = 1104, + VendorSpecific_HmdFound_ConfigTooSmall = 1105, + VendorSpecific_HmdFound_UnableToInitZLib = 1106, + VendorSpecific_HmdFound_CantReadFirmwareVersion = 1107, + VendorSpecific_HmdFound_UnableToSendUserDataStart = 1108, + VendorSpecific_HmdFound_UnableToGetUserDataStart = 1109, + VendorSpecific_HmdFound_UnableToGetUserDataNext = 1110, + VendorSpecific_HmdFound_UserDataAddressRange = 1111, + VendorSpecific_HmdFound_UserDataError = 1112, + VendorSpecific_HmdFound_ConfigFailedSanityCheck = 1113, + Steam_SteamInstallationNotFound = 2000, +} +public enum EVRScreenshotType +{ + None = 0, + Mono = 1, + Stereo = 2, + Cubemap = 3, + MonoPanorama = 4, + StereoPanorama = 5, +} +public enum EVRScreenshotPropertyFilenames +{ + Preview = 0, + VR = 1, +} +public enum EVRTrackedCameraError +{ + None = 0, + OperationFailed = 100, + InvalidHandle = 101, + InvalidFrameHeaderVersion = 102, + OutOfHandles = 103, + IPCFailure = 104, + NotSupportedForThisDevice = 105, + SharedMemoryFailure = 106, + FrameBufferingFailure = 107, + StreamSetupFailure = 108, + InvalidGLTextureId = 109, + InvalidSharedTextureHandle = 110, + FailedToGetGLTextureId = 111, + SharedTextureFailure = 112, + NoFrameAvailable = 113, + InvalidArgument = 114, + InvalidFrameBufferSize = 115, +} +public enum EVRTrackedCameraFrameType +{ + Distorted = 0, + Undistorted = 1, + MaximumUndistorted = 2, + MAX_CAMERA_FRAME_TYPES = 3, +} +public enum EVRApplicationError +{ + None = 0, + AppKeyAlreadyExists = 100, + NoManifest = 101, + NoApplication = 102, + InvalidIndex = 103, + UnknownApplication = 104, + IPCFailed = 105, + ApplicationAlreadyRunning = 106, + InvalidManifest = 107, + InvalidApplication = 108, + LaunchFailed = 109, + ApplicationAlreadyStarting = 110, + LaunchInProgress = 111, + OldApplicationQuitting = 112, + TransitionAborted = 113, + IsTemplate = 114, + BufferTooSmall = 200, + PropertyNotSet = 201, + UnknownProperty = 202, + InvalidParameter = 203, +} +public enum EVRApplicationProperty +{ + Name_String = 0, + LaunchType_String = 11, + WorkingDirectory_String = 12, + BinaryPath_String = 13, + Arguments_String = 14, + URL_String = 15, + Description_String = 50, + NewsURL_String = 51, + ImagePath_String = 52, + Source_String = 53, + IsDashboardOverlay_Bool = 60, + IsTemplate_Bool = 61, + IsInstanced_Bool = 62, + IsInternal_Bool = 63, + LastLaunchTime_Uint64 = 70, +} +public enum EVRApplicationTransitionState +{ + VRApplicationTransition_None = 0, + VRApplicationTransition_OldAppQuitSent = 10, + VRApplicationTransition_WaitingForExternalLaunch = 11, + VRApplicationTransition_NewAppLaunched = 20, +} +public enum ChaperoneCalibrationState +{ + OK = 1, + Warning = 100, + Warning_BaseStationMayHaveMoved = 101, + Warning_BaseStationRemoved = 102, + Warning_SeatedBoundsInvalid = 103, + Error = 200, + Error_BaseStationUninitialized = 201, + Error_BaseStationConflict = 202, + Error_PlayAreaInvalid = 203, + Error_CollisionBoundsInvalid = 204, +} +public enum EChaperoneConfigFile +{ + Live = 1, + Temp = 2, +} +public enum EChaperoneImportFlags +{ + EChaperoneImport_BoundsOnly = 1, +} +public enum EVRCompositorError +{ + None = 0, + RequestFailed = 1, + IncompatibleVersion = 100, + DoNotHaveFocus = 101, + InvalidTexture = 102, + IsNotSceneApplication = 103, + TextureIsOnWrongDevice = 104, + TextureUsesUnsupportedFormat = 105, + SharedTexturesNotSupported = 106, + IndexOutOfRange = 107, + AlreadySubmitted = 108, +} +public enum VROverlayInputMethod +{ + None = 0, + Mouse = 1, +} +public enum VROverlayTransformType +{ + VROverlayTransform_Absolute = 0, + VROverlayTransform_TrackedDeviceRelative = 1, + VROverlayTransform_SystemOverlay = 2, + VROverlayTransform_TrackedComponent = 3, +} +public enum VROverlayFlags +{ + None = 0, + Curved = 1, + RGSS4X = 2, + NoDashboardTab = 3, + AcceptsGamepadEvents = 4, + ShowGamepadFocus = 5, + SendVRScrollEvents = 6, + SendVRTouchpadEvents = 7, + ShowTouchPadScrollWheel = 8, + TransferOwnershipToInternalProcess = 9, + SideBySide_Parallel = 10, + SideBySide_Crossed = 11, + Panorama = 12, + StereoPanorama = 13, + SortWithNonSceneOverlays = 14, + VisibleInDashboard = 15, +} +public enum VRMessageOverlayResponse +{ + ButtonPress_0 = 0, + ButtonPress_1 = 1, + ButtonPress_2 = 2, + ButtonPress_3 = 3, + CouldntFindSystemOverlay = 4, + CouldntFindOrCreateClientOverlay = 5, + ApplicationQuit = 6, +} +public enum EGamepadTextInputMode +{ + k_EGamepadTextInputModeNormal = 0, + k_EGamepadTextInputModePassword = 1, + k_EGamepadTextInputModeSubmit = 2, +} +public enum EGamepadTextInputLineMode +{ + k_EGamepadTextInputLineModeSingleLine = 0, + k_EGamepadTextInputLineModeMultipleLines = 1, +} +public enum EOverlayDirection +{ + Up = 0, + Down = 1, + Left = 2, + Right = 3, + Count = 4, +} +public enum EVROverlayIntersectionMaskPrimitiveType +{ + OverlayIntersectionPrimitiveType_Rectangle = 0, + OverlayIntersectionPrimitiveType_Circle = 1, +} +public enum EVRRenderModelError +{ + None = 0, + Loading = 100, + NotSupported = 200, + InvalidArg = 300, + InvalidModel = 301, + NoShapes = 302, + MultipleShapes = 303, + TooManyVertices = 304, + MultipleTextures = 305, + BufferTooSmall = 306, + NotEnoughNormals = 307, + NotEnoughTexCoords = 308, + InvalidTexture = 400, +} +public enum EVRComponentProperty +{ + IsStatic = 1, + IsVisible = 2, + IsTouched = 4, + IsPressed = 8, + IsScrolled = 16, +} +public enum EVRNotificationType +{ + Transient = 0, + Persistent = 1, + Transient_SystemWithUserValue = 2, +} +public enum EVRNotificationStyle +{ + None = 0, + Application = 100, + Contact_Disabled = 200, + Contact_Enabled = 201, + Contact_Active = 202, +} +public enum EVRSettingsError +{ + None = 0, + IPCFailed = 1, + WriteFailed = 2, + ReadFailed = 3, + JsonParseFailed = 4, + UnsetSettingHasNoDefault = 5, +} +public enum EVRScreenshotError +{ + None = 0, + RequestFailed = 1, + IncompatibleVersion = 100, + NotFound = 101, + BufferTooSmall = 102, + ScreenshotAlreadyInProgress = 108, +} + +[StructLayout(LayoutKind.Explicit)] public struct VREvent_Data_t +{ + [FieldOffset(0)] public VREvent_Reserved_t reserved; + [FieldOffset(0)] public VREvent_Controller_t controller; + [FieldOffset(0)] public VREvent_Mouse_t mouse; + [FieldOffset(0)] public VREvent_Scroll_t scroll; + [FieldOffset(0)] public VREvent_Process_t process; + [FieldOffset(0)] public VREvent_Notification_t notification; + [FieldOffset(0)] public VREvent_Overlay_t overlay; + [FieldOffset(0)] public VREvent_Status_t status; + [FieldOffset(0)] public VREvent_Ipd_t ipd; + [FieldOffset(0)] public VREvent_Chaperone_t chaperone; + [FieldOffset(0)] public VREvent_PerformanceTest_t performanceTest; + [FieldOffset(0)] public VREvent_TouchPadMove_t touchPadMove; + [FieldOffset(0)] public VREvent_SeatedZeroPoseReset_t seatedZeroPoseReset; + [FieldOffset(0)] public VREvent_Screenshot_t screenshot; + [FieldOffset(0)] public VREvent_ScreenshotProgress_t screenshotProgress; + [FieldOffset(0)] public VREvent_ApplicationLaunch_t applicationLaunch; + [FieldOffset(0)] public VREvent_EditingCameraSurface_t cameraSurface; + [FieldOffset(0)] public VREvent_MessageOverlay_t messageOverlay; + [FieldOffset(0)] public VREvent_Keyboard_t keyboard; // This has to be at the end due to a mono bug +} + + +[StructLayout(LayoutKind.Explicit)] public struct VROverlayIntersectionMaskPrimitive_Data_t +{ + [FieldOffset(0)] public IntersectionMaskRectangle_t m_Rectangle; + [FieldOffset(0)] public IntersectionMaskCircle_t m_Circle; +} + +[StructLayout(LayoutKind.Sequential)] public struct HmdMatrix34_t +{ + public float m0; //float[3][4] + public float m1; + public float m2; + public float m3; + public float m4; + public float m5; + public float m6; + public float m7; + public float m8; + public float m9; + public float m10; + public float m11; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdMatrix44_t +{ + public float m0; //float[4][4] + public float m1; + public float m2; + public float m3; + public float m4; + public float m5; + public float m6; + public float m7; + public float m8; + public float m9; + public float m10; + public float m11; + public float m12; + public float m13; + public float m14; + public float m15; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdVector3_t +{ + public float v0; //float[3] + public float v1; + public float v2; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdVector4_t +{ + public float v0; //float[4] + public float v1; + public float v2; + public float v3; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdVector3d_t +{ + public double v0; //double[3] + public double v1; + public double v2; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdVector2_t +{ + public float v0; //float[2] + public float v1; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdQuaternion_t +{ + public double w; + public double x; + public double y; + public double z; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdColor_t +{ + public float r; + public float g; + public float b; + public float a; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdQuad_t +{ + public HmdVector3_t vCorners0; //HmdVector3_t[4] + public HmdVector3_t vCorners1; + public HmdVector3_t vCorners2; + public HmdVector3_t vCorners3; +} +[StructLayout(LayoutKind.Sequential)] public struct HmdRect2_t +{ + public HmdVector2_t vTopLeft; + public HmdVector2_t vBottomRight; +} +[StructLayout(LayoutKind.Sequential)] public struct DistortionCoordinates_t +{ + public float rfRed0; //float[2] + public float rfRed1; + public float rfGreen0; //float[2] + public float rfGreen1; + public float rfBlue0; //float[2] + public float rfBlue1; +} +[StructLayout(LayoutKind.Sequential)] public struct Texture_t +{ + public IntPtr handle; // void * + public ETextureType eType; + public EColorSpace eColorSpace; +} +[StructLayout(LayoutKind.Sequential)] public struct TrackedDevicePose_t +{ + public HmdMatrix34_t mDeviceToAbsoluteTracking; + public HmdVector3_t vVelocity; + public HmdVector3_t vAngularVelocity; + public ETrackingResult eTrackingResult; + [MarshalAs(UnmanagedType.I1)] + public bool bPoseIsValid; + [MarshalAs(UnmanagedType.I1)] + public bool bDeviceIsConnected; +} +[StructLayout(LayoutKind.Sequential)] public struct VRTextureBounds_t +{ + public float uMin; + public float vMin; + public float uMax; + public float vMax; +} +[StructLayout(LayoutKind.Sequential)] public struct VRVulkanTextureData_t +{ + public ulong m_nImage; + public IntPtr m_pDevice; // struct VkDevice_T * + public IntPtr m_pPhysicalDevice; // struct VkPhysicalDevice_T * + public IntPtr m_pInstance; // struct VkInstance_T * + public IntPtr m_pQueue; // struct VkQueue_T * + public uint m_nQueueFamilyIndex; + public uint m_nWidth; + public uint m_nHeight; + public uint m_nFormat; + public uint m_nSampleCount; +} +[StructLayout(LayoutKind.Sequential)] public struct D3D12TextureData_t +{ + public IntPtr m_pResource; // struct ID3D12Resource * + public IntPtr m_pCommandQueue; // struct ID3D12CommandQueue * + public uint m_nNodeMask; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Controller_t +{ + public uint button; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Mouse_t +{ + public float x; + public float y; + public uint button; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Scroll_t +{ + public float xdelta; + public float ydelta; + public uint repeatCount; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_TouchPadMove_t +{ + [MarshalAs(UnmanagedType.I1)] + public bool bFingerDown; + public float flSecondsFingerDown; + public float fValueXFirst; + public float fValueYFirst; + public float fValueXRaw; + public float fValueYRaw; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Notification_t +{ + public ulong ulUserValue; + public uint notificationId; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Process_t +{ + public uint pid; + public uint oldPid; + [MarshalAs(UnmanagedType.I1)] + public bool bForced; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Overlay_t +{ + public ulong overlayHandle; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Status_t +{ + public uint statusState; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Keyboard_t +{ + public byte cNewInput0,cNewInput1,cNewInput2,cNewInput3,cNewInput4,cNewInput5,cNewInput6,cNewInput7; + public ulong uUserValue; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Ipd_t +{ + public float ipdMeters; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Chaperone_t +{ + public ulong m_nPreviousUniverse; + public ulong m_nCurrentUniverse; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Reserved_t +{ + public ulong reserved0; + public ulong reserved1; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_PerformanceTest_t +{ + public uint m_nFidelityLevel; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_SeatedZeroPoseReset_t +{ + [MarshalAs(UnmanagedType.I1)] + public bool bResetBySystemMenu; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Screenshot_t +{ + public uint handle; + public uint type; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_ScreenshotProgress_t +{ + public float progress; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_ApplicationLaunch_t +{ + public uint pid; + public uint unArgsHandle; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_EditingCameraSurface_t +{ + public ulong overlayHandle; + public uint nVisualMode; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_MessageOverlay_t +{ + public uint unVRMessageOverlayResponse; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_Property_t +{ + public ulong container; + public ETrackedDeviceProperty prop; +} +[StructLayout(LayoutKind.Sequential)] public struct VREvent_t +{ + public uint eventType; + public uint trackedDeviceIndex; + public float eventAgeSeconds; + public VREvent_Data_t data; +} +// This structure is for backwards binary compatibility on Linux and OSX only +[StructLayout(LayoutKind.Sequential, Pack = 4)] public struct VREvent_t_Packed +{ + public uint eventType; + public uint trackedDeviceIndex; + public float eventAgeSeconds; + public VREvent_Data_t data; + public VREvent_t_Packed(VREvent_t unpacked) + { + this.eventType = unpacked.eventType; + this.trackedDeviceIndex = unpacked.trackedDeviceIndex; + this.eventAgeSeconds = unpacked.eventAgeSeconds; + this.data = unpacked.data; + } + public void Unpack(ref VREvent_t unpacked) + { + unpacked.eventType = this.eventType; + unpacked.trackedDeviceIndex = this.trackedDeviceIndex; + unpacked.eventAgeSeconds = this.eventAgeSeconds; + unpacked.data = this.data; + } +} +[StructLayout(LayoutKind.Sequential)] public struct HiddenAreaMesh_t +{ + public IntPtr pVertexData; // const struct vr::HmdVector2_t * + public uint unTriangleCount; +} +[StructLayout(LayoutKind.Sequential)] public struct VRControllerAxis_t +{ + public float x; + public float y; +} +[StructLayout(LayoutKind.Sequential)] public struct VRControllerState_t +{ + public uint unPacketNum; + public ulong ulButtonPressed; + public ulong ulButtonTouched; + public VRControllerAxis_t rAxis0; //VRControllerAxis_t[5] + public VRControllerAxis_t rAxis1; + public VRControllerAxis_t rAxis2; + public VRControllerAxis_t rAxis3; + public VRControllerAxis_t rAxis4; +} +// This structure is for backwards binary compatibility on Linux and OSX only +[StructLayout(LayoutKind.Sequential, Pack = 4)] public struct VRControllerState_t_Packed +{ + public uint unPacketNum; + public ulong ulButtonPressed; + public ulong ulButtonTouched; + public VRControllerAxis_t rAxis0; //VRControllerAxis_t[5] + public VRControllerAxis_t rAxis1; + public VRControllerAxis_t rAxis2; + public VRControllerAxis_t rAxis3; + public VRControllerAxis_t rAxis4; + public VRControllerState_t_Packed(VRControllerState_t unpacked) + { + this.unPacketNum = unpacked.unPacketNum; + this.ulButtonPressed = unpacked.ulButtonPressed; + this.ulButtonTouched = unpacked.ulButtonTouched; + this.rAxis0 = unpacked.rAxis0; + this.rAxis1 = unpacked.rAxis1; + this.rAxis2 = unpacked.rAxis2; + this.rAxis3 = unpacked.rAxis3; + this.rAxis4 = unpacked.rAxis4; + } + public void Unpack(ref VRControllerState_t unpacked) + { + unpacked.unPacketNum = this.unPacketNum; + unpacked.ulButtonPressed = this.ulButtonPressed; + unpacked.ulButtonTouched = this.ulButtonTouched; + unpacked.rAxis0 = this.rAxis0; + unpacked.rAxis1 = this.rAxis1; + unpacked.rAxis2 = this.rAxis2; + unpacked.rAxis3 = this.rAxis3; + unpacked.rAxis4 = this.rAxis4; + } +} +[StructLayout(LayoutKind.Sequential)] public struct Compositor_OverlaySettings +{ + public uint size; + [MarshalAs(UnmanagedType.I1)] + public bool curved; + [MarshalAs(UnmanagedType.I1)] + public bool antialias; + public float scale; + public float distance; + public float alpha; + public float uOffset; + public float vOffset; + public float uScale; + public float vScale; + public float gridDivs; + public float gridWidth; + public float gridScale; + public HmdMatrix44_t transform; +} +[StructLayout(LayoutKind.Sequential)] public struct CameraVideoStreamFrameHeader_t +{ + public EVRTrackedCameraFrameType eFrameType; + public uint nWidth; + public uint nHeight; + public uint nBytesPerPixel; + public uint nFrameSequence; + public TrackedDevicePose_t standingTrackedDevicePose; +} +[StructLayout(LayoutKind.Sequential)] public struct AppOverrideKeys_t +{ + public IntPtr pchKey; // const char * + public IntPtr pchValue; // const char * +} +[StructLayout(LayoutKind.Sequential)] public struct Compositor_FrameTiming +{ + public uint m_nSize; + public uint m_nFrameIndex; + public uint m_nNumFramePresents; + public uint m_nNumMisPresented; + public uint m_nNumDroppedFrames; + public uint m_nReprojectionFlags; + public double m_flSystemTimeInSeconds; + public float m_flPreSubmitGpuMs; + public float m_flPostSubmitGpuMs; + public float m_flTotalRenderGpuMs; + public float m_flCompositorRenderGpuMs; + public float m_flCompositorRenderCpuMs; + public float m_flCompositorIdleCpuMs; + public float m_flClientFrameIntervalMs; + public float m_flPresentCallCpuMs; + public float m_flWaitForPresentCpuMs; + public float m_flSubmitFrameMs; + public float m_flWaitGetPosesCalledMs; + public float m_flNewPosesReadyMs; + public float m_flNewFrameReadyMs; + public float m_flCompositorUpdateStartMs; + public float m_flCompositorUpdateEndMs; + public float m_flCompositorRenderStartMs; + public TrackedDevicePose_t m_HmdPose; +} +[StructLayout(LayoutKind.Sequential)] public struct Compositor_CumulativeStats +{ + public uint m_nPid; + public uint m_nNumFramePresents; + public uint m_nNumDroppedFrames; + public uint m_nNumReprojectedFrames; + public uint m_nNumFramePresentsOnStartup; + public uint m_nNumDroppedFramesOnStartup; + public uint m_nNumReprojectedFramesOnStartup; + public uint m_nNumLoading; + public uint m_nNumFramePresentsLoading; + public uint m_nNumDroppedFramesLoading; + public uint m_nNumReprojectedFramesLoading; + public uint m_nNumTimedOut; + public uint m_nNumFramePresentsTimedOut; + public uint m_nNumDroppedFramesTimedOut; + public uint m_nNumReprojectedFramesTimedOut; +} +[StructLayout(LayoutKind.Sequential)] public struct VROverlayIntersectionParams_t +{ + public HmdVector3_t vSource; + public HmdVector3_t vDirection; + public ETrackingUniverseOrigin eOrigin; +} +[StructLayout(LayoutKind.Sequential)] public struct VROverlayIntersectionResults_t +{ + public HmdVector3_t vPoint; + public HmdVector3_t vNormal; + public HmdVector2_t vUVs; + public float fDistance; +} +[StructLayout(LayoutKind.Sequential)] public struct IntersectionMaskRectangle_t +{ + public float m_flTopLeftX; + public float m_flTopLeftY; + public float m_flWidth; + public float m_flHeight; +} +[StructLayout(LayoutKind.Sequential)] public struct IntersectionMaskCircle_t +{ + public float m_flCenterX; + public float m_flCenterY; + public float m_flRadius; +} +[StructLayout(LayoutKind.Sequential)] public struct VROverlayIntersectionMaskPrimitive_t +{ + public EVROverlayIntersectionMaskPrimitiveType m_nPrimitiveType; + public VROverlayIntersectionMaskPrimitive_Data_t m_Primitive; +} +[StructLayout(LayoutKind.Sequential)] public struct RenderModel_ComponentState_t +{ + public HmdMatrix34_t mTrackingToComponentRenderModel; + public HmdMatrix34_t mTrackingToComponentLocal; + public uint uProperties; +} +[StructLayout(LayoutKind.Sequential)] public struct RenderModel_Vertex_t +{ + public HmdVector3_t vPosition; + public HmdVector3_t vNormal; + public float rfTextureCoord0; //float[2] + public float rfTextureCoord1; +} +[StructLayout(LayoutKind.Sequential)] public struct RenderModel_TextureMap_t +{ + public char unWidth; + public char unHeight; + public IntPtr rubTextureMapData; // const uint8_t * +} +// This structure is for backwards binary compatibility on Linux and OSX only +[StructLayout(LayoutKind.Sequential, Pack = 4)] public struct RenderModel_TextureMap_t_Packed +{ + public char unWidth; + public char unHeight; + public IntPtr rubTextureMapData; // const uint8_t * + public RenderModel_TextureMap_t_Packed(RenderModel_TextureMap_t unpacked) + { + this.unWidth = unpacked.unWidth; + this.unHeight = unpacked.unHeight; + this.rubTextureMapData = unpacked.rubTextureMapData; + } + public void Unpack(ref RenderModel_TextureMap_t unpacked) + { + unpacked.unWidth = this.unWidth; + unpacked.unHeight = this.unHeight; + unpacked.rubTextureMapData = this.rubTextureMapData; + } +} +[StructLayout(LayoutKind.Sequential)] public struct RenderModel_t +{ + public IntPtr rVertexData; // const struct vr::RenderModel_Vertex_t * + public uint unVertexCount; + public IntPtr rIndexData; // const uint16_t * + public uint unTriangleCount; + public int diffuseTextureId; +} +// This structure is for backwards binary compatibility on Linux and OSX only +[StructLayout(LayoutKind.Sequential, Pack = 4)] public struct RenderModel_t_Packed +{ + public IntPtr rVertexData; // const struct vr::RenderModel_Vertex_t * + public uint unVertexCount; + public IntPtr rIndexData; // const uint16_t * + public uint unTriangleCount; + public int diffuseTextureId; + public RenderModel_t_Packed(RenderModel_t unpacked) + { + this.rVertexData = unpacked.rVertexData; + this.unVertexCount = unpacked.unVertexCount; + this.rIndexData = unpacked.rIndexData; + this.unTriangleCount = unpacked.unTriangleCount; + this.diffuseTextureId = unpacked.diffuseTextureId; + } + public void Unpack(ref RenderModel_t unpacked) + { + unpacked.rVertexData = this.rVertexData; + unpacked.unVertexCount = this.unVertexCount; + unpacked.rIndexData = this.rIndexData; + unpacked.unTriangleCount = this.unTriangleCount; + unpacked.diffuseTextureId = this.diffuseTextureId; + } +} +[StructLayout(LayoutKind.Sequential)] public struct RenderModel_ControllerMode_State_t +{ + [MarshalAs(UnmanagedType.I1)] + public bool bScrollWheelVisible; +} +[StructLayout(LayoutKind.Sequential)] public struct NotificationBitmap_t +{ + public IntPtr m_pImageData; // void * + public int m_nWidth; + public int m_nHeight; + public int m_nBytesPerPixel; +} +[StructLayout(LayoutKind.Sequential)] public struct COpenVRContext +{ + public IntPtr m_pVRSystem; // class vr::IVRSystem * + public IntPtr m_pVRChaperone; // class vr::IVRChaperone * + public IntPtr m_pVRChaperoneSetup; // class vr::IVRChaperoneSetup * + public IntPtr m_pVRCompositor; // class vr::IVRCompositor * + public IntPtr m_pVROverlay; // class vr::IVROverlay * + public IntPtr m_pVRResources; // class vr::IVRResources * + public IntPtr m_pVRRenderModels; // class vr::IVRRenderModels * + public IntPtr m_pVRExtendedDisplay; // class vr::IVRExtendedDisplay * + public IntPtr m_pVRSettings; // class vr::IVRSettings * + public IntPtr m_pVRApplications; // class vr::IVRApplications * + public IntPtr m_pVRTrackedCamera; // class vr::IVRTrackedCamera * + public IntPtr m_pVRScreenshots; // class vr::IVRScreenshots * + public IntPtr m_pVRDriverManager; // class vr::IVRDriverManager * +} + +public class OpenVR +{ + + public static uint InitInternal(ref EVRInitError peError, EVRApplicationType eApplicationType) + { + return OpenVRInterop.InitInternal(ref peError, eApplicationType); + } + + public static void ShutdownInternal() + { + OpenVRInterop.ShutdownInternal(); + } + + public static bool IsHmdPresent() + { + return OpenVRInterop.IsHmdPresent(); + } + + public static bool IsRuntimeInstalled() + { + return OpenVRInterop.IsRuntimeInstalled(); + } + + public static string GetStringForHmdError(EVRInitError error) + { + return Marshal.PtrToStringAnsi(OpenVRInterop.GetStringForHmdError(error)); + } + + public static IntPtr GetGenericInterface(string pchInterfaceVersion, ref EVRInitError peError) + { + return OpenVRInterop.GetGenericInterface(pchInterfaceVersion, ref peError); + } + + public static bool IsInterfaceVersionValid(string pchInterfaceVersion) + { + return OpenVRInterop.IsInterfaceVersionValid(pchInterfaceVersion); + } + + public static uint GetInitToken() + { + return OpenVRInterop.GetInitToken(); + } + + public const uint k_nDriverNone = 4294967295; + public const uint k_unMaxDriverDebugResponseSize = 32768; + public const uint k_unTrackedDeviceIndex_Hmd = 0; + public const uint k_unMaxTrackedDeviceCount = 16; + public const uint k_unTrackedDeviceIndexOther = 4294967294; + public const uint k_unTrackedDeviceIndexInvalid = 4294967295; + public const ulong k_ulInvalidPropertyContainer = 0; + public const uint k_unInvalidPropertyTag = 0; + public const uint k_unFloatPropertyTag = 1; + public const uint k_unInt32PropertyTag = 2; + public const uint k_unUint64PropertyTag = 3; + public const uint k_unBoolPropertyTag = 4; + public const uint k_unStringPropertyTag = 5; + public const uint k_unHmdMatrix34PropertyTag = 20; + public const uint k_unHmdMatrix44PropertyTag = 21; + public const uint k_unHmdVector3PropertyTag = 22; + public const uint k_unHmdVector4PropertyTag = 23; + public const uint k_unHiddenAreaPropertyTag = 30; + public const uint k_unOpenVRInternalReserved_Start = 1000; + public const uint k_unOpenVRInternalReserved_End = 10000; + public const uint k_unMaxPropertyStringSize = 32768; + public const uint k_unControllerStateAxisCount = 5; + public const ulong k_ulOverlayHandleInvalid = 0; + public const uint k_unScreenshotHandleInvalid = 0; + public const string IVRSystem_Version = "IVRSystem_016"; + public const string IVRExtendedDisplay_Version = "IVRExtendedDisplay_001"; + public const string IVRTrackedCamera_Version = "IVRTrackedCamera_003"; + public const uint k_unMaxApplicationKeyLength = 128; + public const string k_pch_MimeType_HomeApp = "vr/home"; + public const string k_pch_MimeType_GameTheater = "vr/game_theater"; + public const string IVRApplications_Version = "IVRApplications_006"; + public const string IVRChaperone_Version = "IVRChaperone_003"; + public const string IVRChaperoneSetup_Version = "IVRChaperoneSetup_005"; + public const string IVRCompositor_Version = "IVRCompositor_020"; + public const uint k_unVROverlayMaxKeyLength = 128; + public const uint k_unVROverlayMaxNameLength = 128; + public const uint k_unMaxOverlayCount = 64; + public const uint k_unMaxOverlayIntersectionMaskPrimitivesCount = 32; + public const string IVROverlay_Version = "IVROverlay_016"; + public const string k_pch_Controller_Component_GDC2015 = "gdc2015"; + public const string k_pch_Controller_Component_Base = "base"; + public const string k_pch_Controller_Component_Tip = "tip"; + public const string k_pch_Controller_Component_HandGrip = "handgrip"; + public const string k_pch_Controller_Component_Status = "status"; + public const string IVRRenderModels_Version = "IVRRenderModels_005"; + public const uint k_unNotificationTextMaxSize = 256; + public const string IVRNotifications_Version = "IVRNotifications_002"; + public const uint k_unMaxSettingsKeyLength = 128; + public const string IVRSettings_Version = "IVRSettings_002"; + public const string k_pch_SteamVR_Section = "steamvr"; + public const string k_pch_SteamVR_RequireHmd_String = "requireHmd"; + public const string k_pch_SteamVR_ForcedDriverKey_String = "forcedDriver"; + public const string k_pch_SteamVR_ForcedHmdKey_String = "forcedHmd"; + public const string k_pch_SteamVR_DisplayDebug_Bool = "displayDebug"; + public const string k_pch_SteamVR_DebugProcessPipe_String = "debugProcessPipe"; + public const string k_pch_SteamVR_DisplayDebugX_Int32 = "displayDebugX"; + public const string k_pch_SteamVR_DisplayDebugY_Int32 = "displayDebugY"; + public const string k_pch_SteamVR_SendSystemButtonToAllApps_Bool = "sendSystemButtonToAllApps"; + public const string k_pch_SteamVR_LogLevel_Int32 = "loglevel"; + public const string k_pch_SteamVR_IPD_Float = "ipd"; + public const string k_pch_SteamVR_Background_String = "background"; + public const string k_pch_SteamVR_BackgroundUseDomeProjection_Bool = "backgroundUseDomeProjection"; + public const string k_pch_SteamVR_BackgroundCameraHeight_Float = "backgroundCameraHeight"; + public const string k_pch_SteamVR_BackgroundDomeRadius_Float = "backgroundDomeRadius"; + public const string k_pch_SteamVR_GridColor_String = "gridColor"; + public const string k_pch_SteamVR_PlayAreaColor_String = "playAreaColor"; + public const string k_pch_SteamVR_ShowStage_Bool = "showStage"; + public const string k_pch_SteamVR_ActivateMultipleDrivers_Bool = "activateMultipleDrivers"; + public const string k_pch_SteamVR_DirectMode_Bool = "directMode"; + public const string k_pch_SteamVR_DirectModeEdidVid_Int32 = "directModeEdidVid"; + public const string k_pch_SteamVR_DirectModeEdidPid_Int32 = "directModeEdidPid"; + public const string k_pch_SteamVR_UsingSpeakers_Bool = "usingSpeakers"; + public const string k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float = "speakersForwardYawOffsetDegrees"; + public const string k_pch_SteamVR_BaseStationPowerManagement_Bool = "basestationPowerManagement"; + public const string k_pch_SteamVR_NeverKillProcesses_Bool = "neverKillProcesses"; + public const string k_pch_SteamVR_SupersampleScale_Float = "supersampleScale"; + public const string k_pch_SteamVR_AllowAsyncReprojection_Bool = "allowAsyncReprojection"; + public const string k_pch_SteamVR_AllowReprojection_Bool = "allowInterleavedReprojection"; + public const string k_pch_SteamVR_ForceReprojection_Bool = "forceReprojection"; + public const string k_pch_SteamVR_ForceFadeOnBadTracking_Bool = "forceFadeOnBadTracking"; + public const string k_pch_SteamVR_DefaultMirrorView_Int32 = "defaultMirrorView"; + public const string k_pch_SteamVR_ShowMirrorView_Bool = "showMirrorView"; + public const string k_pch_SteamVR_MirrorViewGeometry_String = "mirrorViewGeometry"; + public const string k_pch_SteamVR_StartMonitorFromAppLaunch = "startMonitorFromAppLaunch"; + public const string k_pch_SteamVR_StartCompositorFromAppLaunch_Bool = "startCompositorFromAppLaunch"; + public const string k_pch_SteamVR_StartDashboardFromAppLaunch_Bool = "startDashboardFromAppLaunch"; + public const string k_pch_SteamVR_StartOverlayAppsFromDashboard_Bool = "startOverlayAppsFromDashboard"; + public const string k_pch_SteamVR_EnableHomeApp = "enableHomeApp"; + public const string k_pch_SteamVR_CycleBackgroundImageTimeSec_Int32 = "CycleBackgroundImageTimeSec"; + public const string k_pch_SteamVR_RetailDemo_Bool = "retailDemo"; + public const string k_pch_SteamVR_IpdOffset_Float = "ipdOffset"; + public const string k_pch_SteamVR_AllowSupersampleFiltering_Bool = "allowSupersampleFiltering"; + public const string k_pch_Lighthouse_Section = "driver_lighthouse"; + public const string k_pch_Lighthouse_DisableIMU_Bool = "disableimu"; + public const string k_pch_Lighthouse_UseDisambiguation_String = "usedisambiguation"; + public const string k_pch_Lighthouse_DisambiguationDebug_Int32 = "disambiguationdebug"; + public const string k_pch_Lighthouse_PrimaryBasestation_Int32 = "primarybasestation"; + public const string k_pch_Lighthouse_DBHistory_Bool = "dbhistory"; + public const string k_pch_Null_Section = "driver_null"; + public const string k_pch_Null_SerialNumber_String = "serialNumber"; + public const string k_pch_Null_ModelNumber_String = "modelNumber"; + public const string k_pch_Null_WindowX_Int32 = "windowX"; + public const string k_pch_Null_WindowY_Int32 = "windowY"; + public const string k_pch_Null_WindowWidth_Int32 = "windowWidth"; + public const string k_pch_Null_WindowHeight_Int32 = "windowHeight"; + public const string k_pch_Null_RenderWidth_Int32 = "renderWidth"; + public const string k_pch_Null_RenderHeight_Int32 = "renderHeight"; + public const string k_pch_Null_SecondsFromVsyncToPhotons_Float = "secondsFromVsyncToPhotons"; + public const string k_pch_Null_DisplayFrequency_Float = "displayFrequency"; + public const string k_pch_UserInterface_Section = "userinterface"; + public const string k_pch_UserInterface_StatusAlwaysOnTop_Bool = "StatusAlwaysOnTop"; + public const string k_pch_UserInterface_MinimizeToTray_Bool = "MinimizeToTray"; + public const string k_pch_UserInterface_Screenshots_Bool = "screenshots"; + public const string k_pch_UserInterface_ScreenshotType_Int = "screenshotType"; + public const string k_pch_Notifications_Section = "notifications"; + public const string k_pch_Notifications_DoNotDisturb_Bool = "DoNotDisturb"; + public const string k_pch_Keyboard_Section = "keyboard"; + public const string k_pch_Keyboard_TutorialCompletions = "TutorialCompletions"; + public const string k_pch_Keyboard_ScaleX = "ScaleX"; + public const string k_pch_Keyboard_ScaleY = "ScaleY"; + public const string k_pch_Keyboard_OffsetLeftX = "OffsetLeftX"; + public const string k_pch_Keyboard_OffsetRightX = "OffsetRightX"; + public const string k_pch_Keyboard_OffsetY = "OffsetY"; + public const string k_pch_Keyboard_Smoothing = "Smoothing"; + public const string k_pch_Perf_Section = "perfcheck"; + public const string k_pch_Perf_HeuristicActive_Bool = "heuristicActive"; + public const string k_pch_Perf_NotifyInHMD_Bool = "warnInHMD"; + public const string k_pch_Perf_NotifyOnlyOnce_Bool = "warnOnlyOnce"; + public const string k_pch_Perf_AllowTimingStore_Bool = "allowTimingStore"; + public const string k_pch_Perf_SaveTimingsOnExit_Bool = "saveTimingsOnExit"; + public const string k_pch_Perf_TestData_Float = "perfTestData"; + public const string k_pch_Perf_LinuxGPUProfiling_Bool = "linuxGPUProfiling"; + public const string k_pch_CollisionBounds_Section = "collisionBounds"; + public const string k_pch_CollisionBounds_Style_Int32 = "CollisionBoundsStyle"; + public const string k_pch_CollisionBounds_GroundPerimeterOn_Bool = "CollisionBoundsGroundPerimeterOn"; + public const string k_pch_CollisionBounds_CenterMarkerOn_Bool = "CollisionBoundsCenterMarkerOn"; + public const string k_pch_CollisionBounds_PlaySpaceOn_Bool = "CollisionBoundsPlaySpaceOn"; + public const string k_pch_CollisionBounds_FadeDistance_Float = "CollisionBoundsFadeDistance"; + public const string k_pch_CollisionBounds_ColorGammaR_Int32 = "CollisionBoundsColorGammaR"; + public const string k_pch_CollisionBounds_ColorGammaG_Int32 = "CollisionBoundsColorGammaG"; + public const string k_pch_CollisionBounds_ColorGammaB_Int32 = "CollisionBoundsColorGammaB"; + public const string k_pch_CollisionBounds_ColorGammaA_Int32 = "CollisionBoundsColorGammaA"; + public const string k_pch_Camera_Section = "camera"; + public const string k_pch_Camera_EnableCamera_Bool = "enableCamera"; + public const string k_pch_Camera_EnableCameraInDashboard_Bool = "enableCameraInDashboard"; + public const string k_pch_Camera_EnableCameraForCollisionBounds_Bool = "enableCameraForCollisionBounds"; + public const string k_pch_Camera_EnableCameraForRoomView_Bool = "enableCameraForRoomView"; + public const string k_pch_Camera_BoundsColorGammaR_Int32 = "cameraBoundsColorGammaR"; + public const string k_pch_Camera_BoundsColorGammaG_Int32 = "cameraBoundsColorGammaG"; + public const string k_pch_Camera_BoundsColorGammaB_Int32 = "cameraBoundsColorGammaB"; + public const string k_pch_Camera_BoundsColorGammaA_Int32 = "cameraBoundsColorGammaA"; + public const string k_pch_Camera_BoundsStrength_Int32 = "cameraBoundsStrength"; + public const string k_pch_audio_Section = "audio"; + public const string k_pch_audio_OnPlaybackDevice_String = "onPlaybackDevice"; + public const string k_pch_audio_OnRecordDevice_String = "onRecordDevice"; + public const string k_pch_audio_OnPlaybackMirrorDevice_String = "onPlaybackMirrorDevice"; + public const string k_pch_audio_OffPlaybackDevice_String = "offPlaybackDevice"; + public const string k_pch_audio_OffRecordDevice_String = "offRecordDevice"; + public const string k_pch_audio_VIVEHDMIGain = "viveHDMIGain"; + public const string k_pch_Power_Section = "power"; + public const string k_pch_Power_PowerOffOnExit_Bool = "powerOffOnExit"; + public const string k_pch_Power_TurnOffScreensTimeout_Float = "turnOffScreensTimeout"; + public const string k_pch_Power_TurnOffControllersTimeout_Float = "turnOffControllersTimeout"; + public const string k_pch_Power_ReturnToWatchdogTimeout_Float = "returnToWatchdogTimeout"; + public const string k_pch_Power_AutoLaunchSteamVROnButtonPress = "autoLaunchSteamVROnButtonPress"; + public const string k_pch_Dashboard_Section = "dashboard"; + public const string k_pch_Dashboard_EnableDashboard_Bool = "enableDashboard"; + public const string k_pch_Dashboard_ArcadeMode_Bool = "arcadeMode"; + public const string k_pch_modelskin_Section = "modelskins"; + public const string k_pch_Driver_Enable_Bool = "enable"; + public const string IVRScreenshots_Version = "IVRScreenshots_001"; + public const string IVRResources_Version = "IVRResources_001"; + public const string IVRDriverManager_Version = "IVRDriverManager_001"; + + static uint VRToken { get; set; } + + const string FnTable_Prefix = "FnTable:"; + + class COpenVRContext + { + public COpenVRContext() { Clear(); } + + public void Clear() + { + m_pVRSystem = null; + m_pVRChaperone = null; + m_pVRChaperoneSetup = null; + m_pVRCompositor = null; + m_pVROverlay = null; + m_pVRRenderModels = null; + m_pVRExtendedDisplay = null; + m_pVRSettings = null; + m_pVRApplications = null; + m_pVRScreenshots = null; + m_pVRTrackedCamera = null; + } + + void CheckClear() + { + if (VRToken != GetInitToken()) + { + Clear(); + VRToken = GetInitToken(); + } + } + + public CVRSystem VRSystem() + { + CheckClear(); + if (m_pVRSystem == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRSystem_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRSystem = new CVRSystem(pInterface); + } + return m_pVRSystem; + } + + public CVRChaperone VRChaperone() + { + CheckClear(); + if (m_pVRChaperone == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRChaperone_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRChaperone = new CVRChaperone(pInterface); + } + return m_pVRChaperone; + } + + public CVRChaperoneSetup VRChaperoneSetup() + { + CheckClear(); + if (m_pVRChaperoneSetup == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRChaperoneSetup_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRChaperoneSetup = new CVRChaperoneSetup(pInterface); + } + return m_pVRChaperoneSetup; + } + + public CVRCompositor VRCompositor() + { + CheckClear(); + if (m_pVRCompositor == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRCompositor_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRCompositor = new CVRCompositor(pInterface); + } + return m_pVRCompositor; + } + + public CVROverlay VROverlay() + { + CheckClear(); + if (m_pVROverlay == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVROverlay_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVROverlay = new CVROverlay(pInterface); + } + return m_pVROverlay; + } + + public CVRRenderModels VRRenderModels() + { + CheckClear(); + if (m_pVRRenderModels == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRRenderModels_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRRenderModels = new CVRRenderModels(pInterface); + } + return m_pVRRenderModels; + } + + public CVRExtendedDisplay VRExtendedDisplay() + { + CheckClear(); + if (m_pVRExtendedDisplay == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRExtendedDisplay_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRExtendedDisplay = new CVRExtendedDisplay(pInterface); + } + return m_pVRExtendedDisplay; + } + + public CVRSettings VRSettings() + { + CheckClear(); + if (m_pVRSettings == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRSettings_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRSettings = new CVRSettings(pInterface); + } + return m_pVRSettings; + } + + public CVRApplications VRApplications() + { + CheckClear(); + if (m_pVRApplications == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRApplications_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRApplications = new CVRApplications(pInterface); + } + return m_pVRApplications; + } + + public CVRScreenshots VRScreenshots() + { + CheckClear(); + if (m_pVRScreenshots == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRScreenshots_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRScreenshots = new CVRScreenshots(pInterface); + } + return m_pVRScreenshots; + } + + public CVRTrackedCamera VRTrackedCamera() + { + CheckClear(); + if (m_pVRTrackedCamera == null) + { + var eError = EVRInitError.None; + var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRTrackedCamera_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EVRInitError.None) + m_pVRTrackedCamera = new CVRTrackedCamera(pInterface); + } + return m_pVRTrackedCamera; + } + + private CVRSystem m_pVRSystem; + private CVRChaperone m_pVRChaperone; + private CVRChaperoneSetup m_pVRChaperoneSetup; + private CVRCompositor m_pVRCompositor; + private CVROverlay m_pVROverlay; + private CVRRenderModels m_pVRRenderModels; + private CVRExtendedDisplay m_pVRExtendedDisplay; + private CVRSettings m_pVRSettings; + private CVRApplications m_pVRApplications; + private CVRScreenshots m_pVRScreenshots; + private CVRTrackedCamera m_pVRTrackedCamera; + }; + + private static COpenVRContext _OpenVRInternal_ModuleContext = null; + static COpenVRContext OpenVRInternal_ModuleContext + { + get + { + if (_OpenVRInternal_ModuleContext == null) + _OpenVRInternal_ModuleContext = new COpenVRContext(); + return _OpenVRInternal_ModuleContext; + } + } + + public static CVRSystem System { get { return OpenVRInternal_ModuleContext.VRSystem(); } } + public static CVRChaperone Chaperone { get { return OpenVRInternal_ModuleContext.VRChaperone(); } } + public static CVRChaperoneSetup ChaperoneSetup { get { return OpenVRInternal_ModuleContext.VRChaperoneSetup(); } } + public static CVRCompositor Compositor { get { return OpenVRInternal_ModuleContext.VRCompositor(); } } + public static CVROverlay Overlay { get { return OpenVRInternal_ModuleContext.VROverlay(); } } + public static CVRRenderModels RenderModels { get { return OpenVRInternal_ModuleContext.VRRenderModels(); } } + public static CVRExtendedDisplay ExtendedDisplay { get { return OpenVRInternal_ModuleContext.VRExtendedDisplay(); } } + public static CVRSettings Settings { get { return OpenVRInternal_ModuleContext.VRSettings(); } } + public static CVRApplications Applications { get { return OpenVRInternal_ModuleContext.VRApplications(); } } + public static CVRScreenshots Screenshots { get { return OpenVRInternal_ModuleContext.VRScreenshots(); } } + public static CVRTrackedCamera TrackedCamera { get { return OpenVRInternal_ModuleContext.VRTrackedCamera(); } } + + /** Finds the active installation of vrclient.dll and initializes it */ + public static CVRSystem Init(ref EVRInitError peError, EVRApplicationType eApplicationType = EVRApplicationType.VRApplication_Scene) + { + VRToken = InitInternal(ref peError, eApplicationType); + OpenVRInternal_ModuleContext.Clear(); + + if (peError != EVRInitError.None) + return null; + + bool bInterfaceValid = IsInterfaceVersionValid(IVRSystem_Version); + if (!bInterfaceValid) + { + ShutdownInternal(); + peError = EVRInitError.Init_InterfaceNotFound; + return null; + } + + return OpenVR.System; + } + + /** unloads vrclient.dll. Any interface pointers from the interface are + * invalid after this point */ + public static void Shutdown() + { + ShutdownInternal(); + } + +} + + + +} + diff --git a/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Headers/openvr_api.json b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Headers/openvr_api.json new file mode 100644 index 000000000..bd76ded9f --- /dev/null +++ b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Headers/openvr_api.json @@ -0,0 +1,3887 @@ +{"typedefs":[{"typedef": "vr::glSharedTextureHandle_t","type": "void *"} +,{"typedef": "vr::glInt_t","type": "int32_t"} +,{"typedef": "vr::glUInt_t","type": "uint32_t"} +,{"typedef": "vr::SharedTextureHandle_t","type": "uint64_t"} +,{"typedef": "vr::DriverId_t","type": "uint32_t"} +,{"typedef": "vr::TrackedDeviceIndex_t","type": "uint32_t"} +,{"typedef": "vr::PropertyContainerHandle_t","type": "uint64_t"} +,{"typedef": "vr::PropertyTypeTag_t","type": "uint32_t"} +,{"typedef": "vr::VREvent_Data_t","type": "union VREvent_Data_t"} +,{"typedef": "vr::VRControllerState_t","type": "struct vr::VRControllerState001_t"} +,{"typedef": "vr::VROverlayHandle_t","type": "uint64_t"} +,{"typedef": "vr::TrackedCameraHandle_t","type": "uint64_t"} +,{"typedef": "vr::ScreenshotHandle_t","type": "uint32_t"} +,{"typedef": "vr::VROverlayIntersectionMaskPrimitive_Data_t","type": "union VROverlayIntersectionMaskPrimitive_Data_t"} +,{"typedef": "vr::VRComponentProperties","type": "uint32_t"} +,{"typedef": "vr::TextureID_t","type": "int32_t"} +,{"typedef": "vr::VRNotificationId","type": "uint32_t"} +,{"typedef": "vr::HmdError","type": "enum vr::EVRInitError"} +,{"typedef": "vr::Hmd_Eye","type": "enum vr::EVREye"} +,{"typedef": "vr::ColorSpace","type": "enum vr::EColorSpace"} +,{"typedef": "vr::HmdTrackingResult","type": "enum vr::ETrackingResult"} +,{"typedef": "vr::TrackedDeviceClass","type": "enum vr::ETrackedDeviceClass"} +,{"typedef": "vr::TrackingUniverseOrigin","type": "enum vr::ETrackingUniverseOrigin"} +,{"typedef": "vr::TrackedDeviceProperty","type": "enum vr::ETrackedDeviceProperty"} +,{"typedef": "vr::TrackedPropertyError","type": "enum vr::ETrackedPropertyError"} +,{"typedef": "vr::VRSubmitFlags_t","type": "enum vr::EVRSubmitFlags"} +,{"typedef": "vr::VRState_t","type": "enum vr::EVRState"} +,{"typedef": "vr::CollisionBoundsStyle_t","type": "enum vr::ECollisionBoundsStyle"} +,{"typedef": "vr::VROverlayError","type": "enum vr::EVROverlayError"} +,{"typedef": "vr::VRFirmwareError","type": "enum vr::EVRFirmwareError"} +,{"typedef": "vr::VRCompositorError","type": "enum vr::EVRCompositorError"} +,{"typedef": "vr::VRScreenshotsError","type": "enum vr::EVRScreenshotError"} +], +"enums":[ + {"enumname": "vr::EVREye","values": [ + {"name": "Eye_Left","value": "0"} + ,{"name": "Eye_Right","value": "1"} +]} +, {"enumname": "vr::ETextureType","values": [ + {"name": "TextureType_DirectX","value": "0"} + ,{"name": "TextureType_OpenGL","value": "1"} + ,{"name": "TextureType_Vulkan","value": "2"} + ,{"name": "TextureType_IOSurface","value": "3"} + ,{"name": "TextureType_DirectX12","value": "4"} +]} +, {"enumname": "vr::EColorSpace","values": [ + {"name": "ColorSpace_Auto","value": "0"} + ,{"name": "ColorSpace_Gamma","value": "1"} + ,{"name": "ColorSpace_Linear","value": "2"} +]} +, {"enumname": "vr::ETrackingResult","values": [ + {"name": "TrackingResult_Uninitialized","value": "1"} + ,{"name": "TrackingResult_Calibrating_InProgress","value": "100"} + ,{"name": "TrackingResult_Calibrating_OutOfRange","value": "101"} + ,{"name": "TrackingResult_Running_OK","value": "200"} + ,{"name": "TrackingResult_Running_OutOfRange","value": "201"} +]} +, {"enumname": "vr::ETrackedDeviceClass","values": [ + {"name": "TrackedDeviceClass_Invalid","value": "0"} + ,{"name": "TrackedDeviceClass_HMD","value": "1"} + ,{"name": "TrackedDeviceClass_Controller","value": "2"} + ,{"name": "TrackedDeviceClass_GenericTracker","value": "3"} + ,{"name": "TrackedDeviceClass_TrackingReference","value": "4"} + ,{"name": "TrackedDeviceClass_DisplayRedirect","value": "5"} +]} +, {"enumname": "vr::ETrackedControllerRole","values": [ + {"name": "TrackedControllerRole_Invalid","value": "0"} + ,{"name": "TrackedControllerRole_LeftHand","value": "1"} + ,{"name": "TrackedControllerRole_RightHand","value": "2"} +]} +, {"enumname": "vr::ETrackingUniverseOrigin","values": [ + {"name": "TrackingUniverseSeated","value": "0"} + ,{"name": "TrackingUniverseStanding","value": "1"} + ,{"name": "TrackingUniverseRawAndUncalibrated","value": "2"} +]} +, {"enumname": "vr::ETrackedDeviceProperty","values": [ + {"name": "Prop_Invalid","value": "0"} + ,{"name": "Prop_TrackingSystemName_String","value": "1000"} + ,{"name": "Prop_ModelNumber_String","value": "1001"} + ,{"name": "Prop_SerialNumber_String","value": "1002"} + ,{"name": "Prop_RenderModelName_String","value": "1003"} + ,{"name": "Prop_WillDriftInYaw_Bool","value": "1004"} + ,{"name": "Prop_ManufacturerName_String","value": "1005"} + ,{"name": "Prop_TrackingFirmwareVersion_String","value": "1006"} + ,{"name": "Prop_HardwareRevision_String","value": "1007"} + ,{"name": "Prop_AllWirelessDongleDescriptions_String","value": "1008"} + ,{"name": "Prop_ConnectedWirelessDongle_String","value": "1009"} + ,{"name": "Prop_DeviceIsWireless_Bool","value": "1010"} + ,{"name": "Prop_DeviceIsCharging_Bool","value": "1011"} + ,{"name": "Prop_DeviceBatteryPercentage_Float","value": "1012"} + ,{"name": "Prop_StatusDisplayTransform_Matrix34","value": "1013"} + ,{"name": "Prop_Firmware_UpdateAvailable_Bool","value": "1014"} + ,{"name": "Prop_Firmware_ManualUpdate_Bool","value": "1015"} + ,{"name": "Prop_Firmware_ManualUpdateURL_String","value": "1016"} + ,{"name": "Prop_HardwareRevision_Uint64","value": "1017"} + ,{"name": "Prop_FirmwareVersion_Uint64","value": "1018"} + ,{"name": "Prop_FPGAVersion_Uint64","value": "1019"} + ,{"name": "Prop_VRCVersion_Uint64","value": "1020"} + ,{"name": "Prop_RadioVersion_Uint64","value": "1021"} + ,{"name": "Prop_DongleVersion_Uint64","value": "1022"} + ,{"name": "Prop_BlockServerShutdown_Bool","value": "1023"} + ,{"name": "Prop_CanUnifyCoordinateSystemWithHmd_Bool","value": "1024"} + ,{"name": "Prop_ContainsProximitySensor_Bool","value": "1025"} + ,{"name": "Prop_DeviceProvidesBatteryStatus_Bool","value": "1026"} + ,{"name": "Prop_DeviceCanPowerOff_Bool","value": "1027"} + ,{"name": "Prop_Firmware_ProgrammingTarget_String","value": "1028"} + ,{"name": "Prop_DeviceClass_Int32","value": "1029"} + ,{"name": "Prop_HasCamera_Bool","value": "1030"} + ,{"name": "Prop_DriverVersion_String","value": "1031"} + ,{"name": "Prop_Firmware_ForceUpdateRequired_Bool","value": "1032"} + ,{"name": "Prop_ViveSystemButtonFixRequired_Bool","value": "1033"} + ,{"name": "Prop_ParentDriver_Uint64","value": "1034"} + ,{"name": "Prop_ResourceRoot_String","value": "1035"} + ,{"name": "Prop_ReportsTimeSinceVSync_Bool","value": "2000"} + ,{"name": "Prop_SecondsFromVsyncToPhotons_Float","value": "2001"} + ,{"name": "Prop_DisplayFrequency_Float","value": "2002"} + ,{"name": "Prop_UserIpdMeters_Float","value": "2003"} + ,{"name": "Prop_CurrentUniverseId_Uint64","value": "2004"} + ,{"name": "Prop_PreviousUniverseId_Uint64","value": "2005"} + ,{"name": "Prop_DisplayFirmwareVersion_Uint64","value": "2006"} + ,{"name": "Prop_IsOnDesktop_Bool","value": "2007"} + ,{"name": "Prop_DisplayMCType_Int32","value": "2008"} + ,{"name": "Prop_DisplayMCOffset_Float","value": "2009"} + ,{"name": "Prop_DisplayMCScale_Float","value": "2010"} + ,{"name": "Prop_EdidVendorID_Int32","value": "2011"} + ,{"name": "Prop_DisplayMCImageLeft_String","value": "2012"} + ,{"name": "Prop_DisplayMCImageRight_String","value": "2013"} + ,{"name": "Prop_DisplayGCBlackClamp_Float","value": "2014"} + ,{"name": "Prop_EdidProductID_Int32","value": "2015"} + ,{"name": "Prop_CameraToHeadTransform_Matrix34","value": "2016"} + ,{"name": "Prop_DisplayGCType_Int32","value": "2017"} + ,{"name": "Prop_DisplayGCOffset_Float","value": "2018"} + ,{"name": "Prop_DisplayGCScale_Float","value": "2019"} + ,{"name": "Prop_DisplayGCPrescale_Float","value": "2020"} + ,{"name": "Prop_DisplayGCImage_String","value": "2021"} + ,{"name": "Prop_LensCenterLeftU_Float","value": "2022"} + ,{"name": "Prop_LensCenterLeftV_Float","value": "2023"} + ,{"name": "Prop_LensCenterRightU_Float","value": "2024"} + ,{"name": "Prop_LensCenterRightV_Float","value": "2025"} + ,{"name": "Prop_UserHeadToEyeDepthMeters_Float","value": "2026"} + ,{"name": "Prop_CameraFirmwareVersion_Uint64","value": "2027"} + ,{"name": "Prop_CameraFirmwareDescription_String","value": "2028"} + ,{"name": "Prop_DisplayFPGAVersion_Uint64","value": "2029"} + ,{"name": "Prop_DisplayBootloaderVersion_Uint64","value": "2030"} + ,{"name": "Prop_DisplayHardwareVersion_Uint64","value": "2031"} + ,{"name": "Prop_AudioFirmwareVersion_Uint64","value": "2032"} + ,{"name": "Prop_CameraCompatibilityMode_Int32","value": "2033"} + ,{"name": "Prop_ScreenshotHorizontalFieldOfViewDegrees_Float","value": "2034"} + ,{"name": "Prop_ScreenshotVerticalFieldOfViewDegrees_Float","value": "2035"} + ,{"name": "Prop_DisplaySuppressed_Bool","value": "2036"} + ,{"name": "Prop_DisplayAllowNightMode_Bool","value": "2037"} + ,{"name": "Prop_DisplayMCImageWidth_Int32","value": "2038"} + ,{"name": "Prop_DisplayMCImageHeight_Int32","value": "2039"} + ,{"name": "Prop_DisplayMCImageNumChannels_Int32","value": "2040"} + ,{"name": "Prop_DisplayMCImageData_Binary","value": "2041"} + ,{"name": "Prop_SecondsFromPhotonsToVblank_Float","value": "2042"} + ,{"name": "Prop_DriverDirectModeSendsVsyncEvents_Bool","value": "2043"} + ,{"name": "Prop_DisplayDebugMode_Bool","value": "2044"} + ,{"name": "Prop_GraphicsAdapterLuid_Uint64","value": "2045"} + ,{"name": "Prop_AttachedDeviceId_String","value": "3000"} + ,{"name": "Prop_SupportedButtons_Uint64","value": "3001"} + ,{"name": "Prop_Axis0Type_Int32","value": "3002"} + ,{"name": "Prop_Axis1Type_Int32","value": "3003"} + ,{"name": "Prop_Axis2Type_Int32","value": "3004"} + ,{"name": "Prop_Axis3Type_Int32","value": "3005"} + ,{"name": "Prop_Axis4Type_Int32","value": "3006"} + ,{"name": "Prop_ControllerRoleHint_Int32","value": "3007"} + ,{"name": "Prop_FieldOfViewLeftDegrees_Float","value": "4000"} + ,{"name": "Prop_FieldOfViewRightDegrees_Float","value": "4001"} + ,{"name": "Prop_FieldOfViewTopDegrees_Float","value": "4002"} + ,{"name": "Prop_FieldOfViewBottomDegrees_Float","value": "4003"} + ,{"name": "Prop_TrackingRangeMinimumMeters_Float","value": "4004"} + ,{"name": "Prop_TrackingRangeMaximumMeters_Float","value": "4005"} + ,{"name": "Prop_ModeLabel_String","value": "4006"} + ,{"name": "Prop_IconPathName_String","value": "5000"} + ,{"name": "Prop_NamedIconPathDeviceOff_String","value": "5001"} + ,{"name": "Prop_NamedIconPathDeviceSearching_String","value": "5002"} + ,{"name": "Prop_NamedIconPathDeviceSearchingAlert_String","value": "5003"} + ,{"name": "Prop_NamedIconPathDeviceReady_String","value": "5004"} + ,{"name": "Prop_NamedIconPathDeviceReadyAlert_String","value": "5005"} + ,{"name": "Prop_NamedIconPathDeviceNotReady_String","value": "5006"} + ,{"name": "Prop_NamedIconPathDeviceStandby_String","value": "5007"} + ,{"name": "Prop_NamedIconPathDeviceAlertLow_String","value": "5008"} + ,{"name": "Prop_DisplayHiddenArea_Binary_Start","value": "5100"} + ,{"name": "Prop_DisplayHiddenArea_Binary_End","value": "5150"} + ,{"name": "Prop_UserConfigPath_String","value": "6000"} + ,{"name": "Prop_InstallPath_String","value": "6001"} + ,{"name": "Prop_HasDisplayComponent_Bool","value": "6002"} + ,{"name": "Prop_HasControllerComponent_Bool","value": "6003"} + ,{"name": "Prop_HasCameraComponent_Bool","value": "6004"} + ,{"name": "Prop_HasDriverDirectModeComponent_Bool","value": "6005"} + ,{"name": "Prop_HasVirtualDisplayComponent_Bool","value": "6006"} + ,{"name": "Prop_VendorSpecific_Reserved_Start","value": "10000"} + ,{"name": "Prop_VendorSpecific_Reserved_End","value": "10999"} +]} +, {"enumname": "vr::ETrackedPropertyError","values": [ + {"name": "TrackedProp_Success","value": "0"} + ,{"name": "TrackedProp_WrongDataType","value": "1"} + ,{"name": "TrackedProp_WrongDeviceClass","value": "2"} + ,{"name": "TrackedProp_BufferTooSmall","value": "3"} + ,{"name": "TrackedProp_UnknownProperty","value": "4"} + ,{"name": "TrackedProp_InvalidDevice","value": "5"} + ,{"name": "TrackedProp_CouldNotContactServer","value": "6"} + ,{"name": "TrackedProp_ValueNotProvidedByDevice","value": "7"} + ,{"name": "TrackedProp_StringExceedsMaximumLength","value": "8"} + ,{"name": "TrackedProp_NotYetAvailable","value": "9"} + ,{"name": "TrackedProp_PermissionDenied","value": "10"} + ,{"name": "TrackedProp_InvalidOperation","value": "11"} +]} +, {"enumname": "vr::EVRSubmitFlags","values": [ + {"name": "Submit_Default","value": "0"} + ,{"name": "Submit_LensDistortionAlreadyApplied","value": "1"} + ,{"name": "Submit_GlRenderBuffer","value": "2"} + ,{"name": "Submit_Reserved","value": "4"} +]} +, {"enumname": "vr::EVRState","values": [ + {"name": "VRState_Undefined","value": "-1"} + ,{"name": "VRState_Off","value": "0"} + ,{"name": "VRState_Searching","value": "1"} + ,{"name": "VRState_Searching_Alert","value": "2"} + ,{"name": "VRState_Ready","value": "3"} + ,{"name": "VRState_Ready_Alert","value": "4"} + ,{"name": "VRState_NotReady","value": "5"} + ,{"name": "VRState_Standby","value": "6"} + ,{"name": "VRState_Ready_Alert_Low","value": "7"} +]} +, {"enumname": "vr::EVREventType","values": [ + {"name": "VREvent_None","value": "0"} + ,{"name": "VREvent_TrackedDeviceActivated","value": "100"} + ,{"name": "VREvent_TrackedDeviceDeactivated","value": "101"} + ,{"name": "VREvent_TrackedDeviceUpdated","value": "102"} + ,{"name": "VREvent_TrackedDeviceUserInteractionStarted","value": "103"} + ,{"name": "VREvent_TrackedDeviceUserInteractionEnded","value": "104"} + ,{"name": "VREvent_IpdChanged","value": "105"} + ,{"name": "VREvent_EnterStandbyMode","value": "106"} + ,{"name": "VREvent_LeaveStandbyMode","value": "107"} + ,{"name": "VREvent_TrackedDeviceRoleChanged","value": "108"} + ,{"name": "VREvent_WatchdogWakeUpRequested","value": "109"} + ,{"name": "VREvent_LensDistortionChanged","value": "110"} + ,{"name": "VREvent_PropertyChanged","value": "111"} + ,{"name": "VREvent_ButtonPress","value": "200"} + ,{"name": "VREvent_ButtonUnpress","value": "201"} + ,{"name": "VREvent_ButtonTouch","value": "202"} + ,{"name": "VREvent_ButtonUntouch","value": "203"} + ,{"name": "VREvent_MouseMove","value": "300"} + ,{"name": "VREvent_MouseButtonDown","value": "301"} + ,{"name": "VREvent_MouseButtonUp","value": "302"} + ,{"name": "VREvent_FocusEnter","value": "303"} + ,{"name": "VREvent_FocusLeave","value": "304"} + ,{"name": "VREvent_Scroll","value": "305"} + ,{"name": "VREvent_TouchPadMove","value": "306"} + ,{"name": "VREvent_OverlayFocusChanged","value": "307"} + ,{"name": "VREvent_InputFocusCaptured","value": "400"} + ,{"name": "VREvent_InputFocusReleased","value": "401"} + ,{"name": "VREvent_SceneFocusLost","value": "402"} + ,{"name": "VREvent_SceneFocusGained","value": "403"} + ,{"name": "VREvent_SceneApplicationChanged","value": "404"} + ,{"name": "VREvent_SceneFocusChanged","value": "405"} + ,{"name": "VREvent_InputFocusChanged","value": "406"} + ,{"name": "VREvent_SceneApplicationSecondaryRenderingStarted","value": "407"} + ,{"name": "VREvent_HideRenderModels","value": "410"} + ,{"name": "VREvent_ShowRenderModels","value": "411"} + ,{"name": "VREvent_OverlayShown","value": "500"} + ,{"name": "VREvent_OverlayHidden","value": "501"} + ,{"name": "VREvent_DashboardActivated","value": "502"} + ,{"name": "VREvent_DashboardDeactivated","value": "503"} + ,{"name": "VREvent_DashboardThumbSelected","value": "504"} + ,{"name": "VREvent_DashboardRequested","value": "505"} + ,{"name": "VREvent_ResetDashboard","value": "506"} + ,{"name": "VREvent_RenderToast","value": "507"} + ,{"name": "VREvent_ImageLoaded","value": "508"} + ,{"name": "VREvent_ShowKeyboard","value": "509"} + ,{"name": "VREvent_HideKeyboard","value": "510"} + ,{"name": "VREvent_OverlayGamepadFocusGained","value": "511"} + ,{"name": "VREvent_OverlayGamepadFocusLost","value": "512"} + ,{"name": "VREvent_OverlaySharedTextureChanged","value": "513"} + ,{"name": "VREvent_DashboardGuideButtonDown","value": "514"} + ,{"name": "VREvent_DashboardGuideButtonUp","value": "515"} + ,{"name": "VREvent_ScreenshotTriggered","value": "516"} + ,{"name": "VREvent_ImageFailed","value": "517"} + ,{"name": "VREvent_DashboardOverlayCreated","value": "518"} + ,{"name": "VREvent_RequestScreenshot","value": "520"} + ,{"name": "VREvent_ScreenshotTaken","value": "521"} + ,{"name": "VREvent_ScreenshotFailed","value": "522"} + ,{"name": "VREvent_SubmitScreenshotToDashboard","value": "523"} + ,{"name": "VREvent_ScreenshotProgressToDashboard","value": "524"} + ,{"name": "VREvent_PrimaryDashboardDeviceChanged","value": "525"} + ,{"name": "VREvent_Notification_Shown","value": "600"} + ,{"name": "VREvent_Notification_Hidden","value": "601"} + ,{"name": "VREvent_Notification_BeginInteraction","value": "602"} + ,{"name": "VREvent_Notification_Destroyed","value": "603"} + ,{"name": "VREvent_Quit","value": "700"} + ,{"name": "VREvent_ProcessQuit","value": "701"} + ,{"name": "VREvent_QuitAborted_UserPrompt","value": "702"} + ,{"name": "VREvent_QuitAcknowledged","value": "703"} + ,{"name": "VREvent_DriverRequestedQuit","value": "704"} + ,{"name": "VREvent_ChaperoneDataHasChanged","value": "800"} + ,{"name": "VREvent_ChaperoneUniverseHasChanged","value": "801"} + ,{"name": "VREvent_ChaperoneTempDataHasChanged","value": "802"} + ,{"name": "VREvent_ChaperoneSettingsHaveChanged","value": "803"} + ,{"name": "VREvent_SeatedZeroPoseReset","value": "804"} + ,{"name": "VREvent_AudioSettingsHaveChanged","value": "820"} + ,{"name": "VREvent_BackgroundSettingHasChanged","value": "850"} + ,{"name": "VREvent_CameraSettingsHaveChanged","value": "851"} + ,{"name": "VREvent_ReprojectionSettingHasChanged","value": "852"} + ,{"name": "VREvent_ModelSkinSettingsHaveChanged","value": "853"} + ,{"name": "VREvent_EnvironmentSettingsHaveChanged","value": "854"} + ,{"name": "VREvent_PowerSettingsHaveChanged","value": "855"} + ,{"name": "VREvent_EnableHomeAppSettingsHaveChanged","value": "856"} + ,{"name": "VREvent_StatusUpdate","value": "900"} + ,{"name": "VREvent_MCImageUpdated","value": "1000"} + ,{"name": "VREvent_FirmwareUpdateStarted","value": "1100"} + ,{"name": "VREvent_FirmwareUpdateFinished","value": "1101"} + ,{"name": "VREvent_KeyboardClosed","value": "1200"} + ,{"name": "VREvent_KeyboardCharInput","value": "1201"} + ,{"name": "VREvent_KeyboardDone","value": "1202"} + ,{"name": "VREvent_ApplicationTransitionStarted","value": "1300"} + ,{"name": "VREvent_ApplicationTransitionAborted","value": "1301"} + ,{"name": "VREvent_ApplicationTransitionNewAppStarted","value": "1302"} + ,{"name": "VREvent_ApplicationListUpdated","value": "1303"} + ,{"name": "VREvent_ApplicationMimeTypeLoad","value": "1304"} + ,{"name": "VREvent_ApplicationTransitionNewAppLaunchComplete","value": "1305"} + ,{"name": "VREvent_ProcessConnected","value": "1306"} + ,{"name": "VREvent_ProcessDisconnected","value": "1307"} + ,{"name": "VREvent_Compositor_MirrorWindowShown","value": "1400"} + ,{"name": "VREvent_Compositor_MirrorWindowHidden","value": "1401"} + ,{"name": "VREvent_Compositor_ChaperoneBoundsShown","value": "1410"} + ,{"name": "VREvent_Compositor_ChaperoneBoundsHidden","value": "1411"} + ,{"name": "VREvent_TrackedCamera_StartVideoStream","value": "1500"} + ,{"name": "VREvent_TrackedCamera_StopVideoStream","value": "1501"} + ,{"name": "VREvent_TrackedCamera_PauseVideoStream","value": "1502"} + ,{"name": "VREvent_TrackedCamera_ResumeVideoStream","value": "1503"} + ,{"name": "VREvent_TrackedCamera_EditingSurface","value": "1550"} + ,{"name": "VREvent_PerformanceTest_EnableCapture","value": "1600"} + ,{"name": "VREvent_PerformanceTest_DisableCapture","value": "1601"} + ,{"name": "VREvent_PerformanceTest_FidelityLevel","value": "1602"} + ,{"name": "VREvent_MessageOverlay_Closed","value": "1650"} + ,{"name": "VREvent_VendorSpecific_Reserved_Start","value": "10000"} + ,{"name": "VREvent_VendorSpecific_Reserved_End","value": "19999"} +]} +, {"enumname": "vr::EDeviceActivityLevel","values": [ + {"name": "k_EDeviceActivityLevel_Unknown","value": "-1"} + ,{"name": "k_EDeviceActivityLevel_Idle","value": "0"} + ,{"name": "k_EDeviceActivityLevel_UserInteraction","value": "1"} + ,{"name": "k_EDeviceActivityLevel_UserInteraction_Timeout","value": "2"} + ,{"name": "k_EDeviceActivityLevel_Standby","value": "3"} +]} +, {"enumname": "vr::EVRButtonId","values": [ + {"name": "k_EButton_System","value": "0"} + ,{"name": "k_EButton_ApplicationMenu","value": "1"} + ,{"name": "k_EButton_Grip","value": "2"} + ,{"name": "k_EButton_DPad_Left","value": "3"} + ,{"name": "k_EButton_DPad_Up","value": "4"} + ,{"name": "k_EButton_DPad_Right","value": "5"} + ,{"name": "k_EButton_DPad_Down","value": "6"} + ,{"name": "k_EButton_A","value": "7"} + ,{"name": "k_EButton_ProximitySensor","value": "31"} + ,{"name": "k_EButton_Axis0","value": "32"} + ,{"name": "k_EButton_Axis1","value": "33"} + ,{"name": "k_EButton_Axis2","value": "34"} + ,{"name": "k_EButton_Axis3","value": "35"} + ,{"name": "k_EButton_Axis4","value": "36"} + ,{"name": "k_EButton_SteamVR_Touchpad","value": "32"} + ,{"name": "k_EButton_SteamVR_Trigger","value": "33"} + ,{"name": "k_EButton_Dashboard_Back","value": "2"} + ,{"name": "k_EButton_Max","value": "64"} +]} +, {"enumname": "vr::EVRMouseButton","values": [ + {"name": "VRMouseButton_Left","value": "1"} + ,{"name": "VRMouseButton_Right","value": "2"} + ,{"name": "VRMouseButton_Middle","value": "4"} +]} +, {"enumname": "vr::EHiddenAreaMeshType","values": [ + {"name": "k_eHiddenAreaMesh_Standard","value": "0"} + ,{"name": "k_eHiddenAreaMesh_Inverse","value": "1"} + ,{"name": "k_eHiddenAreaMesh_LineLoop","value": "2"} + ,{"name": "k_eHiddenAreaMesh_Max","value": "3"} +]} +, {"enumname": "vr::EVRControllerAxisType","values": [ + {"name": "k_eControllerAxis_None","value": "0"} + ,{"name": "k_eControllerAxis_TrackPad","value": "1"} + ,{"name": "k_eControllerAxis_Joystick","value": "2"} + ,{"name": "k_eControllerAxis_Trigger","value": "3"} +]} +, {"enumname": "vr::EVRControllerEventOutputType","values": [ + {"name": "ControllerEventOutput_OSEvents","value": "0"} + ,{"name": "ControllerEventOutput_VREvents","value": "1"} +]} +, {"enumname": "vr::ECollisionBoundsStyle","values": [ + {"name": "COLLISION_BOUNDS_STYLE_BEGINNER","value": "0"} + ,{"name": "COLLISION_BOUNDS_STYLE_INTERMEDIATE","value": "1"} + ,{"name": "COLLISION_BOUNDS_STYLE_SQUARES","value": "2"} + ,{"name": "COLLISION_BOUNDS_STYLE_ADVANCED","value": "3"} + ,{"name": "COLLISION_BOUNDS_STYLE_NONE","value": "4"} + ,{"name": "COLLISION_BOUNDS_STYLE_COUNT","value": "5"} +]} +, {"enumname": "vr::EVROverlayError","values": [ + {"name": "VROverlayError_None","value": "0"} + ,{"name": "VROverlayError_UnknownOverlay","value": "10"} + ,{"name": "VROverlayError_InvalidHandle","value": "11"} + ,{"name": "VROverlayError_PermissionDenied","value": "12"} + ,{"name": "VROverlayError_OverlayLimitExceeded","value": "13"} + ,{"name": "VROverlayError_WrongVisibilityType","value": "14"} + ,{"name": "VROverlayError_KeyTooLong","value": "15"} + ,{"name": "VROverlayError_NameTooLong","value": "16"} + ,{"name": "VROverlayError_KeyInUse","value": "17"} + ,{"name": "VROverlayError_WrongTransformType","value": "18"} + ,{"name": "VROverlayError_InvalidTrackedDevice","value": "19"} + ,{"name": "VROverlayError_InvalidParameter","value": "20"} + ,{"name": "VROverlayError_ThumbnailCantBeDestroyed","value": "21"} + ,{"name": "VROverlayError_ArrayTooSmall","value": "22"} + ,{"name": "VROverlayError_RequestFailed","value": "23"} + ,{"name": "VROverlayError_InvalidTexture","value": "24"} + ,{"name": "VROverlayError_UnableToLoadFile","value": "25"} + ,{"name": "VROverlayError_KeyboardAlreadyInUse","value": "26"} + ,{"name": "VROverlayError_NoNeighbor","value": "27"} + ,{"name": "VROverlayError_TooManyMaskPrimitives","value": "29"} + ,{"name": "VROverlayError_BadMaskPrimitive","value": "30"} +]} +, {"enumname": "vr::EVRApplicationType","values": [ + {"name": "VRApplication_Other","value": "0"} + ,{"name": "VRApplication_Scene","value": "1"} + ,{"name": "VRApplication_Overlay","value": "2"} + ,{"name": "VRApplication_Background","value": "3"} + ,{"name": "VRApplication_Utility","value": "4"} + ,{"name": "VRApplication_VRMonitor","value": "5"} + ,{"name": "VRApplication_SteamWatchdog","value": "6"} + ,{"name": "VRApplication_Bootstrapper","value": "7"} + ,{"name": "VRApplication_Max","value": "8"} +]} +, {"enumname": "vr::EVRFirmwareError","values": [ + {"name": "VRFirmwareError_None","value": "0"} + ,{"name": "VRFirmwareError_Success","value": "1"} + ,{"name": "VRFirmwareError_Fail","value": "2"} +]} +, {"enumname": "vr::EVRNotificationError","values": [ + {"name": "VRNotificationError_OK","value": "0"} + ,{"name": "VRNotificationError_InvalidNotificationId","value": "100"} + ,{"name": "VRNotificationError_NotificationQueueFull","value": "101"} + ,{"name": "VRNotificationError_InvalidOverlayHandle","value": "102"} + ,{"name": "VRNotificationError_SystemWithUserValueAlreadyExists","value": "103"} +]} +, {"enumname": "vr::EVRInitError","values": [ + {"name": "VRInitError_None","value": "0"} + ,{"name": "VRInitError_Unknown","value": "1"} + ,{"name": "VRInitError_Init_InstallationNotFound","value": "100"} + ,{"name": "VRInitError_Init_InstallationCorrupt","value": "101"} + ,{"name": "VRInitError_Init_VRClientDLLNotFound","value": "102"} + ,{"name": "VRInitError_Init_FileNotFound","value": "103"} + ,{"name": "VRInitError_Init_FactoryNotFound","value": "104"} + ,{"name": "VRInitError_Init_InterfaceNotFound","value": "105"} + ,{"name": "VRInitError_Init_InvalidInterface","value": "106"} + ,{"name": "VRInitError_Init_UserConfigDirectoryInvalid","value": "107"} + ,{"name": "VRInitError_Init_HmdNotFound","value": "108"} + ,{"name": "VRInitError_Init_NotInitialized","value": "109"} + ,{"name": "VRInitError_Init_PathRegistryNotFound","value": "110"} + ,{"name": "VRInitError_Init_NoConfigPath","value": "111"} + ,{"name": "VRInitError_Init_NoLogPath","value": "112"} + ,{"name": "VRInitError_Init_PathRegistryNotWritable","value": "113"} + ,{"name": "VRInitError_Init_AppInfoInitFailed","value": "114"} + ,{"name": "VRInitError_Init_Retry","value": "115"} + ,{"name": "VRInitError_Init_InitCanceledByUser","value": "116"} + ,{"name": "VRInitError_Init_AnotherAppLaunching","value": "117"} + ,{"name": "VRInitError_Init_SettingsInitFailed","value": "118"} + ,{"name": "VRInitError_Init_ShuttingDown","value": "119"} + ,{"name": "VRInitError_Init_TooManyObjects","value": "120"} + ,{"name": "VRInitError_Init_NoServerForBackgroundApp","value": "121"} + ,{"name": "VRInitError_Init_NotSupportedWithCompositor","value": "122"} + ,{"name": "VRInitError_Init_NotAvailableToUtilityApps","value": "123"} + ,{"name": "VRInitError_Init_Internal","value": "124"} + ,{"name": "VRInitError_Init_HmdDriverIdIsNone","value": "125"} + ,{"name": "VRInitError_Init_HmdNotFoundPresenceFailed","value": "126"} + ,{"name": "VRInitError_Init_VRMonitorNotFound","value": "127"} + ,{"name": "VRInitError_Init_VRMonitorStartupFailed","value": "128"} + ,{"name": "VRInitError_Init_LowPowerWatchdogNotSupported","value": "129"} + ,{"name": "VRInitError_Init_InvalidApplicationType","value": "130"} + ,{"name": "VRInitError_Init_NotAvailableToWatchdogApps","value": "131"} + ,{"name": "VRInitError_Init_WatchdogDisabledInSettings","value": "132"} + ,{"name": "VRInitError_Init_VRDashboardNotFound","value": "133"} + ,{"name": "VRInitError_Init_VRDashboardStartupFailed","value": "134"} + ,{"name": "VRInitError_Init_VRHomeNotFound","value": "135"} + ,{"name": "VRInitError_Init_VRHomeStartupFailed","value": "136"} + ,{"name": "VRInitError_Driver_Failed","value": "200"} + ,{"name": "VRInitError_Driver_Unknown","value": "201"} + ,{"name": "VRInitError_Driver_HmdUnknown","value": "202"} + ,{"name": "VRInitError_Driver_NotLoaded","value": "203"} + ,{"name": "VRInitError_Driver_RuntimeOutOfDate","value": "204"} + ,{"name": "VRInitError_Driver_HmdInUse","value": "205"} + ,{"name": "VRInitError_Driver_NotCalibrated","value": "206"} + ,{"name": "VRInitError_Driver_CalibrationInvalid","value": "207"} + ,{"name": "VRInitError_Driver_HmdDisplayNotFound","value": "208"} + ,{"name": "VRInitError_Driver_TrackedDeviceInterfaceUnknown","value": "209"} + ,{"name": "VRInitError_Driver_HmdDriverIdOutOfBounds","value": "211"} + ,{"name": "VRInitError_Driver_HmdDisplayMirrored","value": "212"} + ,{"name": "VRInitError_IPC_ServerInitFailed","value": "300"} + ,{"name": "VRInitError_IPC_ConnectFailed","value": "301"} + ,{"name": "VRInitError_IPC_SharedStateInitFailed","value": "302"} + ,{"name": "VRInitError_IPC_CompositorInitFailed","value": "303"} + ,{"name": "VRInitError_IPC_MutexInitFailed","value": "304"} + ,{"name": "VRInitError_IPC_Failed","value": "305"} + ,{"name": "VRInitError_IPC_CompositorConnectFailed","value": "306"} + ,{"name": "VRInitError_IPC_CompositorInvalidConnectResponse","value": "307"} + ,{"name": "VRInitError_IPC_ConnectFailedAfterMultipleAttempts","value": "308"} + ,{"name": "VRInitError_Compositor_Failed","value": "400"} + ,{"name": "VRInitError_Compositor_D3D11HardwareRequired","value": "401"} + ,{"name": "VRInitError_Compositor_FirmwareRequiresUpdate","value": "402"} + ,{"name": "VRInitError_Compositor_OverlayInitFailed","value": "403"} + ,{"name": "VRInitError_Compositor_ScreenshotsInitFailed","value": "404"} + ,{"name": "VRInitError_Compositor_UnableToCreateDevice","value": "405"} + ,{"name": "VRInitError_VendorSpecific_UnableToConnectToOculusRuntime","value": "1000"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_CantOpenDevice","value": "1101"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_UnableToRequestConfigStart","value": "1102"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_NoStoredConfig","value": "1103"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_ConfigTooBig","value": "1104"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_ConfigTooSmall","value": "1105"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_UnableToInitZLib","value": "1106"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_CantReadFirmwareVersion","value": "1107"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_UnableToSendUserDataStart","value": "1108"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataStart","value": "1109"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataNext","value": "1110"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_UserDataAddressRange","value": "1111"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_UserDataError","value": "1112"} + ,{"name": "VRInitError_VendorSpecific_HmdFound_ConfigFailedSanityCheck","value": "1113"} + ,{"name": "VRInitError_Steam_SteamInstallationNotFound","value": "2000"} +]} +, {"enumname": "vr::EVRScreenshotType","values": [ + {"name": "VRScreenshotType_None","value": "0"} + ,{"name": "VRScreenshotType_Mono","value": "1"} + ,{"name": "VRScreenshotType_Stereo","value": "2"} + ,{"name": "VRScreenshotType_Cubemap","value": "3"} + ,{"name": "VRScreenshotType_MonoPanorama","value": "4"} + ,{"name": "VRScreenshotType_StereoPanorama","value": "5"} +]} +, {"enumname": "vr::EVRScreenshotPropertyFilenames","values": [ + {"name": "VRScreenshotPropertyFilenames_Preview","value": "0"} + ,{"name": "VRScreenshotPropertyFilenames_VR","value": "1"} +]} +, {"enumname": "vr::EVRTrackedCameraError","values": [ + {"name": "VRTrackedCameraError_None","value": "0"} + ,{"name": "VRTrackedCameraError_OperationFailed","value": "100"} + ,{"name": "VRTrackedCameraError_InvalidHandle","value": "101"} + ,{"name": "VRTrackedCameraError_InvalidFrameHeaderVersion","value": "102"} + ,{"name": "VRTrackedCameraError_OutOfHandles","value": "103"} + ,{"name": "VRTrackedCameraError_IPCFailure","value": "104"} + ,{"name": "VRTrackedCameraError_NotSupportedForThisDevice","value": "105"} + ,{"name": "VRTrackedCameraError_SharedMemoryFailure","value": "106"} + ,{"name": "VRTrackedCameraError_FrameBufferingFailure","value": "107"} + ,{"name": "VRTrackedCameraError_StreamSetupFailure","value": "108"} + ,{"name": "VRTrackedCameraError_InvalidGLTextureId","value": "109"} + ,{"name": "VRTrackedCameraError_InvalidSharedTextureHandle","value": "110"} + ,{"name": "VRTrackedCameraError_FailedToGetGLTextureId","value": "111"} + ,{"name": "VRTrackedCameraError_SharedTextureFailure","value": "112"} + ,{"name": "VRTrackedCameraError_NoFrameAvailable","value": "113"} + ,{"name": "VRTrackedCameraError_InvalidArgument","value": "114"} + ,{"name": "VRTrackedCameraError_InvalidFrameBufferSize","value": "115"} +]} +, {"enumname": "vr::EVRTrackedCameraFrameType","values": [ + {"name": "VRTrackedCameraFrameType_Distorted","value": "0"} + ,{"name": "VRTrackedCameraFrameType_Undistorted","value": "1"} + ,{"name": "VRTrackedCameraFrameType_MaximumUndistorted","value": "2"} + ,{"name": "MAX_CAMERA_FRAME_TYPES","value": "3"} +]} +, {"enumname": "vr::EVRApplicationError","values": [ + {"name": "VRApplicationError_None","value": "0"} + ,{"name": "VRApplicationError_AppKeyAlreadyExists","value": "100"} + ,{"name": "VRApplicationError_NoManifest","value": "101"} + ,{"name": "VRApplicationError_NoApplication","value": "102"} + ,{"name": "VRApplicationError_InvalidIndex","value": "103"} + ,{"name": "VRApplicationError_UnknownApplication","value": "104"} + ,{"name": "VRApplicationError_IPCFailed","value": "105"} + ,{"name": "VRApplicationError_ApplicationAlreadyRunning","value": "106"} + ,{"name": "VRApplicationError_InvalidManifest","value": "107"} + ,{"name": "VRApplicationError_InvalidApplication","value": "108"} + ,{"name": "VRApplicationError_LaunchFailed","value": "109"} + ,{"name": "VRApplicationError_ApplicationAlreadyStarting","value": "110"} + ,{"name": "VRApplicationError_LaunchInProgress","value": "111"} + ,{"name": "VRApplicationError_OldApplicationQuitting","value": "112"} + ,{"name": "VRApplicationError_TransitionAborted","value": "113"} + ,{"name": "VRApplicationError_IsTemplate","value": "114"} + ,{"name": "VRApplicationError_BufferTooSmall","value": "200"} + ,{"name": "VRApplicationError_PropertyNotSet","value": "201"} + ,{"name": "VRApplicationError_UnknownProperty","value": "202"} + ,{"name": "VRApplicationError_InvalidParameter","value": "203"} +]} +, {"enumname": "vr::EVRApplicationProperty","values": [ + {"name": "VRApplicationProperty_Name_String","value": "0"} + ,{"name": "VRApplicationProperty_LaunchType_String","value": "11"} + ,{"name": "VRApplicationProperty_WorkingDirectory_String","value": "12"} + ,{"name": "VRApplicationProperty_BinaryPath_String","value": "13"} + ,{"name": "VRApplicationProperty_Arguments_String","value": "14"} + ,{"name": "VRApplicationProperty_URL_String","value": "15"} + ,{"name": "VRApplicationProperty_Description_String","value": "50"} + ,{"name": "VRApplicationProperty_NewsURL_String","value": "51"} + ,{"name": "VRApplicationProperty_ImagePath_String","value": "52"} + ,{"name": "VRApplicationProperty_Source_String","value": "53"} + ,{"name": "VRApplicationProperty_IsDashboardOverlay_Bool","value": "60"} + ,{"name": "VRApplicationProperty_IsTemplate_Bool","value": "61"} + ,{"name": "VRApplicationProperty_IsInstanced_Bool","value": "62"} + ,{"name": "VRApplicationProperty_IsInternal_Bool","value": "63"} + ,{"name": "VRApplicationProperty_LastLaunchTime_Uint64","value": "70"} +]} +, {"enumname": "vr::EVRApplicationTransitionState","values": [ + {"name": "VRApplicationTransition_None","value": "0"} + ,{"name": "VRApplicationTransition_OldAppQuitSent","value": "10"} + ,{"name": "VRApplicationTransition_WaitingForExternalLaunch","value": "11"} + ,{"name": "VRApplicationTransition_NewAppLaunched","value": "20"} +]} +, {"enumname": "vr::ChaperoneCalibrationState","values": [ + {"name": "ChaperoneCalibrationState_OK","value": "1"} + ,{"name": "ChaperoneCalibrationState_Warning","value": "100"} + ,{"name": "ChaperoneCalibrationState_Warning_BaseStationMayHaveMoved","value": "101"} + ,{"name": "ChaperoneCalibrationState_Warning_BaseStationRemoved","value": "102"} + ,{"name": "ChaperoneCalibrationState_Warning_SeatedBoundsInvalid","value": "103"} + ,{"name": "ChaperoneCalibrationState_Error","value": "200"} + ,{"name": "ChaperoneCalibrationState_Error_BaseStationUninitialized","value": "201"} + ,{"name": "ChaperoneCalibrationState_Error_BaseStationConflict","value": "202"} + ,{"name": "ChaperoneCalibrationState_Error_PlayAreaInvalid","value": "203"} + ,{"name": "ChaperoneCalibrationState_Error_CollisionBoundsInvalid","value": "204"} +]} +, {"enumname": "vr::EChaperoneConfigFile","values": [ + {"name": "EChaperoneConfigFile_Live","value": "1"} + ,{"name": "EChaperoneConfigFile_Temp","value": "2"} +]} +, {"enumname": "vr::EChaperoneImportFlags","values": [ + {"name": "EChaperoneImport_BoundsOnly","value": "1"} +]} +, {"enumname": "vr::EVRCompositorError","values": [ + {"name": "VRCompositorError_None","value": "0"} + ,{"name": "VRCompositorError_RequestFailed","value": "1"} + ,{"name": "VRCompositorError_IncompatibleVersion","value": "100"} + ,{"name": "VRCompositorError_DoNotHaveFocus","value": "101"} + ,{"name": "VRCompositorError_InvalidTexture","value": "102"} + ,{"name": "VRCompositorError_IsNotSceneApplication","value": "103"} + ,{"name": "VRCompositorError_TextureIsOnWrongDevice","value": "104"} + ,{"name": "VRCompositorError_TextureUsesUnsupportedFormat","value": "105"} + ,{"name": "VRCompositorError_SharedTexturesNotSupported","value": "106"} + ,{"name": "VRCompositorError_IndexOutOfRange","value": "107"} + ,{"name": "VRCompositorError_AlreadySubmitted","value": "108"} +]} +, {"enumname": "vr::VROverlayInputMethod","values": [ + {"name": "VROverlayInputMethod_None","value": "0"} + ,{"name": "VROverlayInputMethod_Mouse","value": "1"} +]} +, {"enumname": "vr::VROverlayTransformType","values": [ + {"name": "VROverlayTransform_Absolute","value": "0"} + ,{"name": "VROverlayTransform_TrackedDeviceRelative","value": "1"} + ,{"name": "VROverlayTransform_SystemOverlay","value": "2"} + ,{"name": "VROverlayTransform_TrackedComponent","value": "3"} +]} +, {"enumname": "vr::VROverlayFlags","values": [ + {"name": "VROverlayFlags_None","value": "0"} + ,{"name": "VROverlayFlags_Curved","value": "1"} + ,{"name": "VROverlayFlags_RGSS4X","value": "2"} + ,{"name": "VROverlayFlags_NoDashboardTab","value": "3"} + ,{"name": "VROverlayFlags_AcceptsGamepadEvents","value": "4"} + ,{"name": "VROverlayFlags_ShowGamepadFocus","value": "5"} + ,{"name": "VROverlayFlags_SendVRScrollEvents","value": "6"} + ,{"name": "VROverlayFlags_SendVRTouchpadEvents","value": "7"} + ,{"name": "VROverlayFlags_ShowTouchPadScrollWheel","value": "8"} + ,{"name": "VROverlayFlags_TransferOwnershipToInternalProcess","value": "9"} + ,{"name": "VROverlayFlags_SideBySide_Parallel","value": "10"} + ,{"name": "VROverlayFlags_SideBySide_Crossed","value": "11"} + ,{"name": "VROverlayFlags_Panorama","value": "12"} + ,{"name": "VROverlayFlags_StereoPanorama","value": "13"} + ,{"name": "VROverlayFlags_SortWithNonSceneOverlays","value": "14"} + ,{"name": "VROverlayFlags_VisibleInDashboard","value": "15"} +]} +, {"enumname": "vr::VRMessageOverlayResponse","values": [ + {"name": "VRMessageOverlayResponse_ButtonPress_0","value": "0"} + ,{"name": "VRMessageOverlayResponse_ButtonPress_1","value": "1"} + ,{"name": "VRMessageOverlayResponse_ButtonPress_2","value": "2"} + ,{"name": "VRMessageOverlayResponse_ButtonPress_3","value": "3"} + ,{"name": "VRMessageOverlayResponse_CouldntFindSystemOverlay","value": "4"} + ,{"name": "VRMessageOverlayResponse_CouldntFindOrCreateClientOverlay","value": "5"} + ,{"name": "VRMessageOverlayResponse_ApplicationQuit","value": "6"} +]} +, {"enumname": "vr::EGamepadTextInputMode","values": [ + {"name": "k_EGamepadTextInputModeNormal","value": "0"} + ,{"name": "k_EGamepadTextInputModePassword","value": "1"} + ,{"name": "k_EGamepadTextInputModeSubmit","value": "2"} +]} +, {"enumname": "vr::EGamepadTextInputLineMode","values": [ + {"name": "k_EGamepadTextInputLineModeSingleLine","value": "0"} + ,{"name": "k_EGamepadTextInputLineModeMultipleLines","value": "1"} +]} +, {"enumname": "vr::EOverlayDirection","values": [ + {"name": "OverlayDirection_Up","value": "0"} + ,{"name": "OverlayDirection_Down","value": "1"} + ,{"name": "OverlayDirection_Left","value": "2"} + ,{"name": "OverlayDirection_Right","value": "3"} + ,{"name": "OverlayDirection_Count","value": "4"} +]} +, {"enumname": "vr::EVROverlayIntersectionMaskPrimitiveType","values": [ + {"name": "OverlayIntersectionPrimitiveType_Rectangle","value": "0"} + ,{"name": "OverlayIntersectionPrimitiveType_Circle","value": "1"} +]} +, {"enumname": "vr::EVRRenderModelError","values": [ + {"name": "VRRenderModelError_None","value": "0"} + ,{"name": "VRRenderModelError_Loading","value": "100"} + ,{"name": "VRRenderModelError_NotSupported","value": "200"} + ,{"name": "VRRenderModelError_InvalidArg","value": "300"} + ,{"name": "VRRenderModelError_InvalidModel","value": "301"} + ,{"name": "VRRenderModelError_NoShapes","value": "302"} + ,{"name": "VRRenderModelError_MultipleShapes","value": "303"} + ,{"name": "VRRenderModelError_TooManyVertices","value": "304"} + ,{"name": "VRRenderModelError_MultipleTextures","value": "305"} + ,{"name": "VRRenderModelError_BufferTooSmall","value": "306"} + ,{"name": "VRRenderModelError_NotEnoughNormals","value": "307"} + ,{"name": "VRRenderModelError_NotEnoughTexCoords","value": "308"} + ,{"name": "VRRenderModelError_InvalidTexture","value": "400"} +]} +, {"enumname": "vr::EVRComponentProperty","values": [ + {"name": "VRComponentProperty_IsStatic","value": "1"} + ,{"name": "VRComponentProperty_IsVisible","value": "2"} + ,{"name": "VRComponentProperty_IsTouched","value": "4"} + ,{"name": "VRComponentProperty_IsPressed","value": "8"} + ,{"name": "VRComponentProperty_IsScrolled","value": "16"} +]} +, {"enumname": "vr::EVRNotificationType","values": [ + {"name": "EVRNotificationType_Transient","value": "0"} + ,{"name": "EVRNotificationType_Persistent","value": "1"} + ,{"name": "EVRNotificationType_Transient_SystemWithUserValue","value": "2"} +]} +, {"enumname": "vr::EVRNotificationStyle","values": [ + {"name": "EVRNotificationStyle_None","value": "0"} + ,{"name": "EVRNotificationStyle_Application","value": "100"} + ,{"name": "EVRNotificationStyle_Contact_Disabled","value": "200"} + ,{"name": "EVRNotificationStyle_Contact_Enabled","value": "201"} + ,{"name": "EVRNotificationStyle_Contact_Active","value": "202"} +]} +, {"enumname": "vr::EVRSettingsError","values": [ + {"name": "VRSettingsError_None","value": "0"} + ,{"name": "VRSettingsError_IPCFailed","value": "1"} + ,{"name": "VRSettingsError_WriteFailed","value": "2"} + ,{"name": "VRSettingsError_ReadFailed","value": "3"} + ,{"name": "VRSettingsError_JsonParseFailed","value": "4"} + ,{"name": "VRSettingsError_UnsetSettingHasNoDefault","value": "5"} +]} +, {"enumname": "vr::EVRScreenshotError","values": [ + {"name": "VRScreenshotError_None","value": "0"} + ,{"name": "VRScreenshotError_RequestFailed","value": "1"} + ,{"name": "VRScreenshotError_IncompatibleVersion","value": "100"} + ,{"name": "VRScreenshotError_NotFound","value": "101"} + ,{"name": "VRScreenshotError_BufferTooSmall","value": "102"} + ,{"name": "VRScreenshotError_ScreenshotAlreadyInProgress","value": "108"} +]} +], +"consts":[{ + "constname": "k_nDriverNone","consttype": "const uint32_t", "constval": "4294967295"} +,{ + "constname": "k_unMaxDriverDebugResponseSize","consttype": "const uint32_t", "constval": "32768"} +,{ + "constname": "k_unTrackedDeviceIndex_Hmd","consttype": "const uint32_t", "constval": "0"} +,{ + "constname": "k_unMaxTrackedDeviceCount","consttype": "const uint32_t", "constval": "16"} +,{ + "constname": "k_unTrackedDeviceIndexOther","consttype": "const uint32_t", "constval": "4294967294"} +,{ + "constname": "k_unTrackedDeviceIndexInvalid","consttype": "const uint32_t", "constval": "4294967295"} +,{ + "constname": "k_ulInvalidPropertyContainer","consttype": "const PropertyContainerHandle_t", "constval": "0"} +,{ + "constname": "k_unInvalidPropertyTag","consttype": "const PropertyTypeTag_t", "constval": "0"} +,{ + "constname": "k_unFloatPropertyTag","consttype": "const PropertyTypeTag_t", "constval": "1"} +,{ + "constname": "k_unInt32PropertyTag","consttype": "const PropertyTypeTag_t", "constval": "2"} +,{ + "constname": "k_unUint64PropertyTag","consttype": "const PropertyTypeTag_t", "constval": "3"} +,{ + "constname": "k_unBoolPropertyTag","consttype": "const PropertyTypeTag_t", "constval": "4"} +,{ + "constname": "k_unStringPropertyTag","consttype": "const PropertyTypeTag_t", "constval": "5"} +,{ + "constname": "k_unHmdMatrix34PropertyTag","consttype": "const PropertyTypeTag_t", "constval": "20"} +,{ + "constname": "k_unHmdMatrix44PropertyTag","consttype": "const PropertyTypeTag_t", "constval": "21"} +,{ + "constname": "k_unHmdVector3PropertyTag","consttype": "const PropertyTypeTag_t", "constval": "22"} +,{ + "constname": "k_unHmdVector4PropertyTag","consttype": "const PropertyTypeTag_t", "constval": "23"} +,{ + "constname": "k_unHiddenAreaPropertyTag","consttype": "const PropertyTypeTag_t", "constval": "30"} +,{ + "constname": "k_unOpenVRInternalReserved_Start","consttype": "const PropertyTypeTag_t", "constval": "1000"} +,{ + "constname": "k_unOpenVRInternalReserved_End","consttype": "const PropertyTypeTag_t", "constval": "10000"} +,{ + "constname": "k_unMaxPropertyStringSize","consttype": "const uint32_t", "constval": "32768"} +,{ + "constname": "k_unControllerStateAxisCount","consttype": "const uint32_t", "constval": "5"} +,{ + "constname": "k_ulOverlayHandleInvalid","consttype": "const VROverlayHandle_t", "constval": "0"} +,{ + "constname": "k_unScreenshotHandleInvalid","consttype": "const uint32_t", "constval": "0"} +,{ + "constname": "IVRSystem_Version","consttype": "const char *const", "constval": "IVRSystem_016"} +,{ + "constname": "IVRExtendedDisplay_Version","consttype": "const char *const", "constval": "IVRExtendedDisplay_001"} +,{ + "constname": "IVRTrackedCamera_Version","consttype": "const char *const", "constval": "IVRTrackedCamera_003"} +,{ + "constname": "k_unMaxApplicationKeyLength","consttype": "const uint32_t", "constval": "128"} +,{ + "constname": "k_pch_MimeType_HomeApp","consttype": "const char *const", "constval": "vr/home"} +,{ + "constname": "k_pch_MimeType_GameTheater","consttype": "const char *const", "constval": "vr/game_theater"} +,{ + "constname": "IVRApplications_Version","consttype": "const char *const", "constval": "IVRApplications_006"} +,{ + "constname": "IVRChaperone_Version","consttype": "const char *const", "constval": "IVRChaperone_003"} +,{ + "constname": "IVRChaperoneSetup_Version","consttype": "const char *const", "constval": "IVRChaperoneSetup_005"} +,{ + "constname": "IVRCompositor_Version","consttype": "const char *const", "constval": "IVRCompositor_020"} +,{ + "constname": "k_unVROverlayMaxKeyLength","consttype": "const uint32_t", "constval": "128"} +,{ + "constname": "k_unVROverlayMaxNameLength","consttype": "const uint32_t", "constval": "128"} +,{ + "constname": "k_unMaxOverlayCount","consttype": "const uint32_t", "constval": "64"} +,{ + "constname": "k_unMaxOverlayIntersectionMaskPrimitivesCount","consttype": "const uint32_t", "constval": "32"} +,{ + "constname": "IVROverlay_Version","consttype": "const char *const", "constval": "IVROverlay_016"} +,{ + "constname": "k_pch_Controller_Component_GDC2015","consttype": "const char *const", "constval": "gdc2015"} +,{ + "constname": "k_pch_Controller_Component_Base","consttype": "const char *const", "constval": "base"} +,{ + "constname": "k_pch_Controller_Component_Tip","consttype": "const char *const", "constval": "tip"} +,{ + "constname": "k_pch_Controller_Component_HandGrip","consttype": "const char *const", "constval": "handgrip"} +,{ + "constname": "k_pch_Controller_Component_Status","consttype": "const char *const", "constval": "status"} +,{ + "constname": "IVRRenderModels_Version","consttype": "const char *const", "constval": "IVRRenderModels_005"} +,{ + "constname": "k_unNotificationTextMaxSize","consttype": "const uint32_t", "constval": "256"} +,{ + "constname": "IVRNotifications_Version","consttype": "const char *const", "constval": "IVRNotifications_002"} +,{ + "constname": "k_unMaxSettingsKeyLength","consttype": "const uint32_t", "constval": "128"} +,{ + "constname": "IVRSettings_Version","consttype": "const char *const", "constval": "IVRSettings_002"} +,{ + "constname": "k_pch_SteamVR_Section","consttype": "const char *const", "constval": "steamvr"} +,{ + "constname": "k_pch_SteamVR_RequireHmd_String","consttype": "const char *const", "constval": "requireHmd"} +,{ + "constname": "k_pch_SteamVR_ForcedDriverKey_String","consttype": "const char *const", "constval": "forcedDriver"} +,{ + "constname": "k_pch_SteamVR_ForcedHmdKey_String","consttype": "const char *const", "constval": "forcedHmd"} +,{ + "constname": "k_pch_SteamVR_DisplayDebug_Bool","consttype": "const char *const", "constval": "displayDebug"} +,{ + "constname": "k_pch_SteamVR_DebugProcessPipe_String","consttype": "const char *const", "constval": "debugProcessPipe"} +,{ + "constname": "k_pch_SteamVR_DisplayDebugX_Int32","consttype": "const char *const", "constval": "displayDebugX"} +,{ + "constname": "k_pch_SteamVR_DisplayDebugY_Int32","consttype": "const char *const", "constval": "displayDebugY"} +,{ + "constname": "k_pch_SteamVR_SendSystemButtonToAllApps_Bool","consttype": "const char *const", "constval": "sendSystemButtonToAllApps"} +,{ + "constname": "k_pch_SteamVR_LogLevel_Int32","consttype": "const char *const", "constval": "loglevel"} +,{ + "constname": "k_pch_SteamVR_IPD_Float","consttype": "const char *const", "constval": "ipd"} +,{ + "constname": "k_pch_SteamVR_Background_String","consttype": "const char *const", "constval": "background"} +,{ + "constname": "k_pch_SteamVR_BackgroundUseDomeProjection_Bool","consttype": "const char *const", "constval": "backgroundUseDomeProjection"} +,{ + "constname": "k_pch_SteamVR_BackgroundCameraHeight_Float","consttype": "const char *const", "constval": "backgroundCameraHeight"} +,{ + "constname": "k_pch_SteamVR_BackgroundDomeRadius_Float","consttype": "const char *const", "constval": "backgroundDomeRadius"} +,{ + "constname": "k_pch_SteamVR_GridColor_String","consttype": "const char *const", "constval": "gridColor"} +,{ + "constname": "k_pch_SteamVR_PlayAreaColor_String","consttype": "const char *const", "constval": "playAreaColor"} +,{ + "constname": "k_pch_SteamVR_ShowStage_Bool","consttype": "const char *const", "constval": "showStage"} +,{ + "constname": "k_pch_SteamVR_ActivateMultipleDrivers_Bool","consttype": "const char *const", "constval": "activateMultipleDrivers"} +,{ + "constname": "k_pch_SteamVR_DirectMode_Bool","consttype": "const char *const", "constval": "directMode"} +,{ + "constname": "k_pch_SteamVR_DirectModeEdidVid_Int32","consttype": "const char *const", "constval": "directModeEdidVid"} +,{ + "constname": "k_pch_SteamVR_DirectModeEdidPid_Int32","consttype": "const char *const", "constval": "directModeEdidPid"} +,{ + "constname": "k_pch_SteamVR_UsingSpeakers_Bool","consttype": "const char *const", "constval": "usingSpeakers"} +,{ + "constname": "k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float","consttype": "const char *const", "constval": "speakersForwardYawOffsetDegrees"} +,{ + "constname": "k_pch_SteamVR_BaseStationPowerManagement_Bool","consttype": "const char *const", "constval": "basestationPowerManagement"} +,{ + "constname": "k_pch_SteamVR_NeverKillProcesses_Bool","consttype": "const char *const", "constval": "neverKillProcesses"} +,{ + "constname": "k_pch_SteamVR_SupersampleScale_Float","consttype": "const char *const", "constval": "supersampleScale"} +,{ + "constname": "k_pch_SteamVR_AllowAsyncReprojection_Bool","consttype": "const char *const", "constval": "allowAsyncReprojection"} +,{ + "constname": "k_pch_SteamVR_AllowReprojection_Bool","consttype": "const char *const", "constval": "allowInterleavedReprojection"} +,{ + "constname": "k_pch_SteamVR_ForceReprojection_Bool","consttype": "const char *const", "constval": "forceReprojection"} +,{ + "constname": "k_pch_SteamVR_ForceFadeOnBadTracking_Bool","consttype": "const char *const", "constval": "forceFadeOnBadTracking"} +,{ + "constname": "k_pch_SteamVR_DefaultMirrorView_Int32","consttype": "const char *const", "constval": "defaultMirrorView"} +,{ + "constname": "k_pch_SteamVR_ShowMirrorView_Bool","consttype": "const char *const", "constval": "showMirrorView"} +,{ + "constname": "k_pch_SteamVR_MirrorViewGeometry_String","consttype": "const char *const", "constval": "mirrorViewGeometry"} +,{ + "constname": "k_pch_SteamVR_StartMonitorFromAppLaunch","consttype": "const char *const", "constval": "startMonitorFromAppLaunch"} +,{ + "constname": "k_pch_SteamVR_StartCompositorFromAppLaunch_Bool","consttype": "const char *const", "constval": "startCompositorFromAppLaunch"} +,{ + "constname": "k_pch_SteamVR_StartDashboardFromAppLaunch_Bool","consttype": "const char *const", "constval": "startDashboardFromAppLaunch"} +,{ + "constname": "k_pch_SteamVR_StartOverlayAppsFromDashboard_Bool","consttype": "const char *const", "constval": "startOverlayAppsFromDashboard"} +,{ + "constname": "k_pch_SteamVR_EnableHomeApp","consttype": "const char *const", "constval": "enableHomeApp"} +,{ + "constname": "k_pch_SteamVR_CycleBackgroundImageTimeSec_Int32","consttype": "const char *const", "constval": "CycleBackgroundImageTimeSec"} +,{ + "constname": "k_pch_SteamVR_RetailDemo_Bool","consttype": "const char *const", "constval": "retailDemo"} +,{ + "constname": "k_pch_SteamVR_IpdOffset_Float","consttype": "const char *const", "constval": "ipdOffset"} +,{ + "constname": "k_pch_SteamVR_AllowSupersampleFiltering_Bool","consttype": "const char *const", "constval": "allowSupersampleFiltering"} +,{ + "constname": "k_pch_Lighthouse_Section","consttype": "const char *const", "constval": "driver_lighthouse"} +,{ + "constname": "k_pch_Lighthouse_DisableIMU_Bool","consttype": "const char *const", "constval": "disableimu"} +,{ + "constname": "k_pch_Lighthouse_UseDisambiguation_String","consttype": "const char *const", "constval": "usedisambiguation"} +,{ + "constname": "k_pch_Lighthouse_DisambiguationDebug_Int32","consttype": "const char *const", "constval": "disambiguationdebug"} +,{ + "constname": "k_pch_Lighthouse_PrimaryBasestation_Int32","consttype": "const char *const", "constval": "primarybasestation"} +,{ + "constname": "k_pch_Lighthouse_DBHistory_Bool","consttype": "const char *const", "constval": "dbhistory"} +,{ + "constname": "k_pch_Null_Section","consttype": "const char *const", "constval": "driver_null"} +,{ + "constname": "k_pch_Null_SerialNumber_String","consttype": "const char *const", "constval": "serialNumber"} +,{ + "constname": "k_pch_Null_ModelNumber_String","consttype": "const char *const", "constval": "modelNumber"} +,{ + "constname": "k_pch_Null_WindowX_Int32","consttype": "const char *const", "constval": "windowX"} +,{ + "constname": "k_pch_Null_WindowY_Int32","consttype": "const char *const", "constval": "windowY"} +,{ + "constname": "k_pch_Null_WindowWidth_Int32","consttype": "const char *const", "constval": "windowWidth"} +,{ + "constname": "k_pch_Null_WindowHeight_Int32","consttype": "const char *const", "constval": "windowHeight"} +,{ + "constname": "k_pch_Null_RenderWidth_Int32","consttype": "const char *const", "constval": "renderWidth"} +,{ + "constname": "k_pch_Null_RenderHeight_Int32","consttype": "const char *const", "constval": "renderHeight"} +,{ + "constname": "k_pch_Null_SecondsFromVsyncToPhotons_Float","consttype": "const char *const", "constval": "secondsFromVsyncToPhotons"} +,{ + "constname": "k_pch_Null_DisplayFrequency_Float","consttype": "const char *const", "constval": "displayFrequency"} +,{ + "constname": "k_pch_UserInterface_Section","consttype": "const char *const", "constval": "userinterface"} +,{ + "constname": "k_pch_UserInterface_StatusAlwaysOnTop_Bool","consttype": "const char *const", "constval": "StatusAlwaysOnTop"} +,{ + "constname": "k_pch_UserInterface_MinimizeToTray_Bool","consttype": "const char *const", "constval": "MinimizeToTray"} +,{ + "constname": "k_pch_UserInterface_Screenshots_Bool","consttype": "const char *const", "constval": "screenshots"} +,{ + "constname": "k_pch_UserInterface_ScreenshotType_Int","consttype": "const char *const", "constval": "screenshotType"} +,{ + "constname": "k_pch_Notifications_Section","consttype": "const char *const", "constval": "notifications"} +,{ + "constname": "k_pch_Notifications_DoNotDisturb_Bool","consttype": "const char *const", "constval": "DoNotDisturb"} +,{ + "constname": "k_pch_Keyboard_Section","consttype": "const char *const", "constval": "keyboard"} +,{ + "constname": "k_pch_Keyboard_TutorialCompletions","consttype": "const char *const", "constval": "TutorialCompletions"} +,{ + "constname": "k_pch_Keyboard_ScaleX","consttype": "const char *const", "constval": "ScaleX"} +,{ + "constname": "k_pch_Keyboard_ScaleY","consttype": "const char *const", "constval": "ScaleY"} +,{ + "constname": "k_pch_Keyboard_OffsetLeftX","consttype": "const char *const", "constval": "OffsetLeftX"} +,{ + "constname": "k_pch_Keyboard_OffsetRightX","consttype": "const char *const", "constval": "OffsetRightX"} +,{ + "constname": "k_pch_Keyboard_OffsetY","consttype": "const char *const", "constval": "OffsetY"} +,{ + "constname": "k_pch_Keyboard_Smoothing","consttype": "const char *const", "constval": "Smoothing"} +,{ + "constname": "k_pch_Perf_Section","consttype": "const char *const", "constval": "perfcheck"} +,{ + "constname": "k_pch_Perf_HeuristicActive_Bool","consttype": "const char *const", "constval": "heuristicActive"} +,{ + "constname": "k_pch_Perf_NotifyInHMD_Bool","consttype": "const char *const", "constval": "warnInHMD"} +,{ + "constname": "k_pch_Perf_NotifyOnlyOnce_Bool","consttype": "const char *const", "constval": "warnOnlyOnce"} +,{ + "constname": "k_pch_Perf_AllowTimingStore_Bool","consttype": "const char *const", "constval": "allowTimingStore"} +,{ + "constname": "k_pch_Perf_SaveTimingsOnExit_Bool","consttype": "const char *const", "constval": "saveTimingsOnExit"} +,{ + "constname": "k_pch_Perf_TestData_Float","consttype": "const char *const", "constval": "perfTestData"} +,{ + "constname": "k_pch_Perf_LinuxGPUProfiling_Bool","consttype": "const char *const", "constval": "linuxGPUProfiling"} +,{ + "constname": "k_pch_CollisionBounds_Section","consttype": "const char *const", "constval": "collisionBounds"} +,{ + "constname": "k_pch_CollisionBounds_Style_Int32","consttype": "const char *const", "constval": "CollisionBoundsStyle"} +,{ + "constname": "k_pch_CollisionBounds_GroundPerimeterOn_Bool","consttype": "const char *const", "constval": "CollisionBoundsGroundPerimeterOn"} +,{ + "constname": "k_pch_CollisionBounds_CenterMarkerOn_Bool","consttype": "const char *const", "constval": "CollisionBoundsCenterMarkerOn"} +,{ + "constname": "k_pch_CollisionBounds_PlaySpaceOn_Bool","consttype": "const char *const", "constval": "CollisionBoundsPlaySpaceOn"} +,{ + "constname": "k_pch_CollisionBounds_FadeDistance_Float","consttype": "const char *const", "constval": "CollisionBoundsFadeDistance"} +,{ + "constname": "k_pch_CollisionBounds_ColorGammaR_Int32","consttype": "const char *const", "constval": "CollisionBoundsColorGammaR"} +,{ + "constname": "k_pch_CollisionBounds_ColorGammaG_Int32","consttype": "const char *const", "constval": "CollisionBoundsColorGammaG"} +,{ + "constname": "k_pch_CollisionBounds_ColorGammaB_Int32","consttype": "const char *const", "constval": "CollisionBoundsColorGammaB"} +,{ + "constname": "k_pch_CollisionBounds_ColorGammaA_Int32","consttype": "const char *const", "constval": "CollisionBoundsColorGammaA"} +,{ + "constname": "k_pch_Camera_Section","consttype": "const char *const", "constval": "camera"} +,{ + "constname": "k_pch_Camera_EnableCamera_Bool","consttype": "const char *const", "constval": "enableCamera"} +,{ + "constname": "k_pch_Camera_EnableCameraInDashboard_Bool","consttype": "const char *const", "constval": "enableCameraInDashboard"} +,{ + "constname": "k_pch_Camera_EnableCameraForCollisionBounds_Bool","consttype": "const char *const", "constval": "enableCameraForCollisionBounds"} +,{ + "constname": "k_pch_Camera_EnableCameraForRoomView_Bool","consttype": "const char *const", "constval": "enableCameraForRoomView"} +,{ + "constname": "k_pch_Camera_BoundsColorGammaR_Int32","consttype": "const char *const", "constval": "cameraBoundsColorGammaR"} +,{ + "constname": "k_pch_Camera_BoundsColorGammaG_Int32","consttype": "const char *const", "constval": "cameraBoundsColorGammaG"} +,{ + "constname": "k_pch_Camera_BoundsColorGammaB_Int32","consttype": "const char *const", "constval": "cameraBoundsColorGammaB"} +,{ + "constname": "k_pch_Camera_BoundsColorGammaA_Int32","consttype": "const char *const", "constval": "cameraBoundsColorGammaA"} +,{ + "constname": "k_pch_Camera_BoundsStrength_Int32","consttype": "const char *const", "constval": "cameraBoundsStrength"} +,{ + "constname": "k_pch_audio_Section","consttype": "const char *const", "constval": "audio"} +,{ + "constname": "k_pch_audio_OnPlaybackDevice_String","consttype": "const char *const", "constval": "onPlaybackDevice"} +,{ + "constname": "k_pch_audio_OnRecordDevice_String","consttype": "const char *const", "constval": "onRecordDevice"} +,{ + "constname": "k_pch_audio_OnPlaybackMirrorDevice_String","consttype": "const char *const", "constval": "onPlaybackMirrorDevice"} +,{ + "constname": "k_pch_audio_OffPlaybackDevice_String","consttype": "const char *const", "constval": "offPlaybackDevice"} +,{ + "constname": "k_pch_audio_OffRecordDevice_String","consttype": "const char *const", "constval": "offRecordDevice"} +,{ + "constname": "k_pch_audio_VIVEHDMIGain","consttype": "const char *const", "constval": "viveHDMIGain"} +,{ + "constname": "k_pch_Power_Section","consttype": "const char *const", "constval": "power"} +,{ + "constname": "k_pch_Power_PowerOffOnExit_Bool","consttype": "const char *const", "constval": "powerOffOnExit"} +,{ + "constname": "k_pch_Power_TurnOffScreensTimeout_Float","consttype": "const char *const", "constval": "turnOffScreensTimeout"} +,{ + "constname": "k_pch_Power_TurnOffControllersTimeout_Float","consttype": "const char *const", "constval": "turnOffControllersTimeout"} +,{ + "constname": "k_pch_Power_ReturnToWatchdogTimeout_Float","consttype": "const char *const", "constval": "returnToWatchdogTimeout"} +,{ + "constname": "k_pch_Power_AutoLaunchSteamVROnButtonPress","consttype": "const char *const", "constval": "autoLaunchSteamVROnButtonPress"} +,{ + "constname": "k_pch_Dashboard_Section","consttype": "const char *const", "constval": "dashboard"} +,{ + "constname": "k_pch_Dashboard_EnableDashboard_Bool","consttype": "const char *const", "constval": "enableDashboard"} +,{ + "constname": "k_pch_Dashboard_ArcadeMode_Bool","consttype": "const char *const", "constval": "arcadeMode"} +,{ + "constname": "k_pch_modelskin_Section","consttype": "const char *const", "constval": "modelskins"} +,{ + "constname": "k_pch_Driver_Enable_Bool","consttype": "const char *const", "constval": "enable"} +,{ + "constname": "IVRScreenshots_Version","consttype": "const char *const", "constval": "IVRScreenshots_001"} +,{ + "constname": "IVRResources_Version","consttype": "const char *const", "constval": "IVRResources_001"} +,{ + "constname": "IVRDriverManager_Version","consttype": "const char *const", "constval": "IVRDriverManager_001"} +], +"structs":[{"struct": "vr::HmdMatrix34_t","fields": [ +{ "fieldname": "m", "fieldtype": "float [3][4]"}]} +,{"struct": "vr::HmdMatrix44_t","fields": [ +{ "fieldname": "m", "fieldtype": "float [4][4]"}]} +,{"struct": "vr::HmdVector3_t","fields": [ +{ "fieldname": "v", "fieldtype": "float [3]"}]} +,{"struct": "vr::HmdVector4_t","fields": [ +{ "fieldname": "v", "fieldtype": "float [4]"}]} +,{"struct": "vr::HmdVector3d_t","fields": [ +{ "fieldname": "v", "fieldtype": "double [3]"}]} +,{"struct": "vr::HmdVector2_t","fields": [ +{ "fieldname": "v", "fieldtype": "float [2]"}]} +,{"struct": "vr::HmdQuaternion_t","fields": [ +{ "fieldname": "w", "fieldtype": "double"}, +{ "fieldname": "x", "fieldtype": "double"}, +{ "fieldname": "y", "fieldtype": "double"}, +{ "fieldname": "z", "fieldtype": "double"}]} +,{"struct": "vr::HmdColor_t","fields": [ +{ "fieldname": "r", "fieldtype": "float"}, +{ "fieldname": "g", "fieldtype": "float"}, +{ "fieldname": "b", "fieldtype": "float"}, +{ "fieldname": "a", "fieldtype": "float"}]} +,{"struct": "vr::HmdQuad_t","fields": [ +{ "fieldname": "vCorners", "fieldtype": "struct vr::HmdVector3_t [4]"}]} +,{"struct": "vr::HmdRect2_t","fields": [ +{ "fieldname": "vTopLeft", "fieldtype": "struct vr::HmdVector2_t"}, +{ "fieldname": "vBottomRight", "fieldtype": "struct vr::HmdVector2_t"}]} +,{"struct": "vr::DistortionCoordinates_t","fields": [ +{ "fieldname": "rfRed", "fieldtype": "float [2]"}, +{ "fieldname": "rfGreen", "fieldtype": "float [2]"}, +{ "fieldname": "rfBlue", "fieldtype": "float [2]"}]} +,{"struct": "vr::Texture_t","fields": [ +{ "fieldname": "handle", "fieldtype": "void *"}, +{ "fieldname": "eType", "fieldtype": "enum vr::ETextureType"}, +{ "fieldname": "eColorSpace", "fieldtype": "enum vr::EColorSpace"}]} +,{"struct": "vr::TrackedDevicePose_t","fields": [ +{ "fieldname": "mDeviceToAbsoluteTracking", "fieldtype": "struct vr::HmdMatrix34_t"}, +{ "fieldname": "vVelocity", "fieldtype": "struct vr::HmdVector3_t"}, +{ "fieldname": "vAngularVelocity", "fieldtype": "struct vr::HmdVector3_t"}, +{ "fieldname": "eTrackingResult", "fieldtype": "enum vr::ETrackingResult"}, +{ "fieldname": "bPoseIsValid", "fieldtype": "_Bool"}, +{ "fieldname": "bDeviceIsConnected", "fieldtype": "_Bool"}]} +,{"struct": "vr::VRTextureBounds_t","fields": [ +{ "fieldname": "uMin", "fieldtype": "float"}, +{ "fieldname": "vMin", "fieldtype": "float"}, +{ "fieldname": "uMax", "fieldtype": "float"}, +{ "fieldname": "vMax", "fieldtype": "float"}]} +,{"struct": "vr::VRVulkanTextureData_t","fields": [ +{ "fieldname": "m_nImage", "fieldtype": "uint64_t"}, +{ "fieldname": "m_pDevice", "fieldtype": "struct VkDevice_T *"}, +{ "fieldname": "m_pPhysicalDevice", "fieldtype": "struct VkPhysicalDevice_T *"}, +{ "fieldname": "m_pInstance", "fieldtype": "struct VkInstance_T *"}, +{ "fieldname": "m_pQueue", "fieldtype": "struct VkQueue_T *"}, +{ "fieldname": "m_nQueueFamilyIndex", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nWidth", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nHeight", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nFormat", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nSampleCount", "fieldtype": "uint32_t"}]} +,{"struct": "vr::D3D12TextureData_t","fields": [ +{ "fieldname": "m_pResource", "fieldtype": "struct ID3D12Resource *"}, +{ "fieldname": "m_pCommandQueue", "fieldtype": "struct ID3D12CommandQueue *"}, +{ "fieldname": "m_nNodeMask", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_Controller_t","fields": [ +{ "fieldname": "button", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_Mouse_t","fields": [ +{ "fieldname": "x", "fieldtype": "float"}, +{ "fieldname": "y", "fieldtype": "float"}, +{ "fieldname": "button", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_Scroll_t","fields": [ +{ "fieldname": "xdelta", "fieldtype": "float"}, +{ "fieldname": "ydelta", "fieldtype": "float"}, +{ "fieldname": "repeatCount", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_TouchPadMove_t","fields": [ +{ "fieldname": "bFingerDown", "fieldtype": "_Bool"}, +{ "fieldname": "flSecondsFingerDown", "fieldtype": "float"}, +{ "fieldname": "fValueXFirst", "fieldtype": "float"}, +{ "fieldname": "fValueYFirst", "fieldtype": "float"}, +{ "fieldname": "fValueXRaw", "fieldtype": "float"}, +{ "fieldname": "fValueYRaw", "fieldtype": "float"}]} +,{"struct": "vr::VREvent_Notification_t","fields": [ +{ "fieldname": "ulUserValue", "fieldtype": "uint64_t"}, +{ "fieldname": "notificationId", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_Process_t","fields": [ +{ "fieldname": "pid", "fieldtype": "uint32_t"}, +{ "fieldname": "oldPid", "fieldtype": "uint32_t"}, +{ "fieldname": "bForced", "fieldtype": "_Bool"}]} +,{"struct": "vr::VREvent_Overlay_t","fields": [ +{ "fieldname": "overlayHandle", "fieldtype": "uint64_t"}]} +,{"struct": "vr::VREvent_Status_t","fields": [ +{ "fieldname": "statusState", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_Keyboard_t","fields": [ +{ "fieldname": "cNewInput", "fieldtype": "char [8]"}, +{ "fieldname": "uUserValue", "fieldtype": "uint64_t"}]} +,{"struct": "vr::VREvent_Ipd_t","fields": [ +{ "fieldname": "ipdMeters", "fieldtype": "float"}]} +,{"struct": "vr::VREvent_Chaperone_t","fields": [ +{ "fieldname": "m_nPreviousUniverse", "fieldtype": "uint64_t"}, +{ "fieldname": "m_nCurrentUniverse", "fieldtype": "uint64_t"}]} +,{"struct": "vr::VREvent_Reserved_t","fields": [ +{ "fieldname": "reserved0", "fieldtype": "uint64_t"}, +{ "fieldname": "reserved1", "fieldtype": "uint64_t"}]} +,{"struct": "vr::VREvent_PerformanceTest_t","fields": [ +{ "fieldname": "m_nFidelityLevel", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_SeatedZeroPoseReset_t","fields": [ +{ "fieldname": "bResetBySystemMenu", "fieldtype": "_Bool"}]} +,{"struct": "vr::VREvent_Screenshot_t","fields": [ +{ "fieldname": "handle", "fieldtype": "uint32_t"}, +{ "fieldname": "type", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_ScreenshotProgress_t","fields": [ +{ "fieldname": "progress", "fieldtype": "float"}]} +,{"struct": "vr::VREvent_ApplicationLaunch_t","fields": [ +{ "fieldname": "pid", "fieldtype": "uint32_t"}, +{ "fieldname": "unArgsHandle", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_EditingCameraSurface_t","fields": [ +{ "fieldname": "overlayHandle", "fieldtype": "uint64_t"}, +{ "fieldname": "nVisualMode", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_MessageOverlay_t","fields": [ +{ "fieldname": "unVRMessageOverlayResponse", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VREvent_Property_t","fields": [ +{ "fieldname": "container", "fieldtype": "PropertyContainerHandle_t"}, +{ "fieldname": "prop", "fieldtype": "enum vr::ETrackedDeviceProperty"}]} +,{"struct": "vr::(anonymous)","fields": [ +{ "fieldname": "reserved", "fieldtype": "struct vr::VREvent_Reserved_t"}, +{ "fieldname": "controller", "fieldtype": "struct vr::VREvent_Controller_t"}, +{ "fieldname": "mouse", "fieldtype": "struct vr::VREvent_Mouse_t"}, +{ "fieldname": "scroll", "fieldtype": "struct vr::VREvent_Scroll_t"}, +{ "fieldname": "process", "fieldtype": "struct vr::VREvent_Process_t"}, +{ "fieldname": "notification", "fieldtype": "struct vr::VREvent_Notification_t"}, +{ "fieldname": "overlay", "fieldtype": "struct vr::VREvent_Overlay_t"}, +{ "fieldname": "status", "fieldtype": "struct vr::VREvent_Status_t"}, +{ "fieldname": "keyboard", "fieldtype": "struct vr::VREvent_Keyboard_t"}, +{ "fieldname": "ipd", "fieldtype": "struct vr::VREvent_Ipd_t"}, +{ "fieldname": "chaperone", "fieldtype": "struct vr::VREvent_Chaperone_t"}, +{ "fieldname": "performanceTest", "fieldtype": "struct vr::VREvent_PerformanceTest_t"}, +{ "fieldname": "touchPadMove", "fieldtype": "struct vr::VREvent_TouchPadMove_t"}, +{ "fieldname": "seatedZeroPoseReset", "fieldtype": "struct vr::VREvent_SeatedZeroPoseReset_t"}, +{ "fieldname": "screenshot", "fieldtype": "struct vr::VREvent_Screenshot_t"}, +{ "fieldname": "screenshotProgress", "fieldtype": "struct vr::VREvent_ScreenshotProgress_t"}, +{ "fieldname": "applicationLaunch", "fieldtype": "struct vr::VREvent_ApplicationLaunch_t"}, +{ "fieldname": "cameraSurface", "fieldtype": "struct vr::VREvent_EditingCameraSurface_t"}, +{ "fieldname": "messageOverlay", "fieldtype": "struct vr::VREvent_MessageOverlay_t"}, +{ "fieldname": "property", "fieldtype": "struct vr::VREvent_Property_t"}]} +,{"struct": "vr::VREvent_t","fields": [ +{ "fieldname": "eventType", "fieldtype": "uint32_t"}, +{ "fieldname": "trackedDeviceIndex", "fieldtype": "TrackedDeviceIndex_t"}, +{ "fieldname": "eventAgeSeconds", "fieldtype": "float"}, +{ "fieldname": "data", "fieldtype": "VREvent_Data_t"}]} +,{"struct": "vr::HiddenAreaMesh_t","fields": [ +{ "fieldname": "pVertexData", "fieldtype": "const struct vr::HmdVector2_t *"}, +{ "fieldname": "unTriangleCount", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VRControllerAxis_t","fields": [ +{ "fieldname": "x", "fieldtype": "float"}, +{ "fieldname": "y", "fieldtype": "float"}]} +,{"struct": "vr::VRControllerState001_t","fields": [ +{ "fieldname": "unPacketNum", "fieldtype": "uint32_t"}, +{ "fieldname": "ulButtonPressed", "fieldtype": "uint64_t"}, +{ "fieldname": "ulButtonTouched", "fieldtype": "uint64_t"}, +{ "fieldname": "rAxis", "fieldtype": "struct vr::VRControllerAxis_t [5]"}]} +,{"struct": "vr::Compositor_OverlaySettings","fields": [ +{ "fieldname": "size", "fieldtype": "uint32_t"}, +{ "fieldname": "curved", "fieldtype": "_Bool"}, +{ "fieldname": "antialias", "fieldtype": "_Bool"}, +{ "fieldname": "scale", "fieldtype": "float"}, +{ "fieldname": "distance", "fieldtype": "float"}, +{ "fieldname": "alpha", "fieldtype": "float"}, +{ "fieldname": "uOffset", "fieldtype": "float"}, +{ "fieldname": "vOffset", "fieldtype": "float"}, +{ "fieldname": "uScale", "fieldtype": "float"}, +{ "fieldname": "vScale", "fieldtype": "float"}, +{ "fieldname": "gridDivs", "fieldtype": "float"}, +{ "fieldname": "gridWidth", "fieldtype": "float"}, +{ "fieldname": "gridScale", "fieldtype": "float"}, +{ "fieldname": "transform", "fieldtype": "struct vr::HmdMatrix44_t"}]} +,{"struct": "vr::CameraVideoStreamFrameHeader_t","fields": [ +{ "fieldname": "eFrameType", "fieldtype": "enum vr::EVRTrackedCameraFrameType"}, +{ "fieldname": "nWidth", "fieldtype": "uint32_t"}, +{ "fieldname": "nHeight", "fieldtype": "uint32_t"}, +{ "fieldname": "nBytesPerPixel", "fieldtype": "uint32_t"}, +{ "fieldname": "nFrameSequence", "fieldtype": "uint32_t"}, +{ "fieldname": "standingTrackedDevicePose", "fieldtype": "struct vr::TrackedDevicePose_t"}]} +,{"struct": "vr::AppOverrideKeys_t","fields": [ +{ "fieldname": "pchKey", "fieldtype": "const char *"}, +{ "fieldname": "pchValue", "fieldtype": "const char *"}]} +,{"struct": "vr::Compositor_FrameTiming","fields": [ +{ "fieldname": "m_nSize", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nFrameIndex", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumFramePresents", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumMisPresented", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumDroppedFrames", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nReprojectionFlags", "fieldtype": "uint32_t"}, +{ "fieldname": "m_flSystemTimeInSeconds", "fieldtype": "double"}, +{ "fieldname": "m_flPreSubmitGpuMs", "fieldtype": "float"}, +{ "fieldname": "m_flPostSubmitGpuMs", "fieldtype": "float"}, +{ "fieldname": "m_flTotalRenderGpuMs", "fieldtype": "float"}, +{ "fieldname": "m_flCompositorRenderGpuMs", "fieldtype": "float"}, +{ "fieldname": "m_flCompositorRenderCpuMs", "fieldtype": "float"}, +{ "fieldname": "m_flCompositorIdleCpuMs", "fieldtype": "float"}, +{ "fieldname": "m_flClientFrameIntervalMs", "fieldtype": "float"}, +{ "fieldname": "m_flPresentCallCpuMs", "fieldtype": "float"}, +{ "fieldname": "m_flWaitForPresentCpuMs", "fieldtype": "float"}, +{ "fieldname": "m_flSubmitFrameMs", "fieldtype": "float"}, +{ "fieldname": "m_flWaitGetPosesCalledMs", "fieldtype": "float"}, +{ "fieldname": "m_flNewPosesReadyMs", "fieldtype": "float"}, +{ "fieldname": "m_flNewFrameReadyMs", "fieldtype": "float"}, +{ "fieldname": "m_flCompositorUpdateStartMs", "fieldtype": "float"}, +{ "fieldname": "m_flCompositorUpdateEndMs", "fieldtype": "float"}, +{ "fieldname": "m_flCompositorRenderStartMs", "fieldtype": "float"}, +{ "fieldname": "m_HmdPose", "fieldtype": "vr::TrackedDevicePose_t"}]} +,{"struct": "vr::Compositor_CumulativeStats","fields": [ +{ "fieldname": "m_nPid", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumFramePresents", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumDroppedFrames", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumReprojectedFrames", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumFramePresentsOnStartup", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumDroppedFramesOnStartup", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumReprojectedFramesOnStartup", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumLoading", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumFramePresentsLoading", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumDroppedFramesLoading", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumReprojectedFramesLoading", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumTimedOut", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumFramePresentsTimedOut", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumDroppedFramesTimedOut", "fieldtype": "uint32_t"}, +{ "fieldname": "m_nNumReprojectedFramesTimedOut", "fieldtype": "uint32_t"}]} +,{"struct": "vr::VROverlayIntersectionParams_t","fields": [ +{ "fieldname": "vSource", "fieldtype": "struct vr::HmdVector3_t"}, +{ "fieldname": "vDirection", "fieldtype": "struct vr::HmdVector3_t"}, +{ "fieldname": "eOrigin", "fieldtype": "enum vr::ETrackingUniverseOrigin"}]} +,{"struct": "vr::VROverlayIntersectionResults_t","fields": [ +{ "fieldname": "vPoint", "fieldtype": "struct vr::HmdVector3_t"}, +{ "fieldname": "vNormal", "fieldtype": "struct vr::HmdVector3_t"}, +{ "fieldname": "vUVs", "fieldtype": "struct vr::HmdVector2_t"}, +{ "fieldname": "fDistance", "fieldtype": "float"}]} +,{"struct": "vr::IntersectionMaskRectangle_t","fields": [ +{ "fieldname": "m_flTopLeftX", "fieldtype": "float"}, +{ "fieldname": "m_flTopLeftY", "fieldtype": "float"}, +{ "fieldname": "m_flWidth", "fieldtype": "float"}, +{ "fieldname": "m_flHeight", "fieldtype": "float"}]} +,{"struct": "vr::IntersectionMaskCircle_t","fields": [ +{ "fieldname": "m_flCenterX", "fieldtype": "float"}, +{ "fieldname": "m_flCenterY", "fieldtype": "float"}, +{ "fieldname": "m_flRadius", "fieldtype": "float"}]} +,{"struct": "vr::(anonymous)","fields": [ +{ "fieldname": "m_Rectangle", "fieldtype": "struct vr::IntersectionMaskRectangle_t"}, +{ "fieldname": "m_Circle", "fieldtype": "struct vr::IntersectionMaskCircle_t"}]} +,{"struct": "vr::VROverlayIntersectionMaskPrimitive_t","fields": [ +{ "fieldname": "m_nPrimitiveType", "fieldtype": "enum vr::EVROverlayIntersectionMaskPrimitiveType"}, +{ "fieldname": "m_Primitive", "fieldtype": "VROverlayIntersectionMaskPrimitive_Data_t"}]} +,{"struct": "vr::RenderModel_ComponentState_t","fields": [ +{ "fieldname": "mTrackingToComponentRenderModel", "fieldtype": "struct vr::HmdMatrix34_t"}, +{ "fieldname": "mTrackingToComponentLocal", "fieldtype": "struct vr::HmdMatrix34_t"}, +{ "fieldname": "uProperties", "fieldtype": "VRComponentProperties"}]} +,{"struct": "vr::RenderModel_Vertex_t","fields": [ +{ "fieldname": "vPosition", "fieldtype": "struct vr::HmdVector3_t"}, +{ "fieldname": "vNormal", "fieldtype": "struct vr::HmdVector3_t"}, +{ "fieldname": "rfTextureCoord", "fieldtype": "float [2]"}]} +,{"struct": "vr::RenderModel_TextureMap_t","fields": [ +{ "fieldname": "unWidth", "fieldtype": "uint16_t"}, +{ "fieldname": "unHeight", "fieldtype": "uint16_t"}, +{ "fieldname": "rubTextureMapData", "fieldtype": "const uint8_t *"}]} +,{"struct": "vr::RenderModel_t","fields": [ +{ "fieldname": "rVertexData", "fieldtype": "const struct vr::RenderModel_Vertex_t *"}, +{ "fieldname": "unVertexCount", "fieldtype": "uint32_t"}, +{ "fieldname": "rIndexData", "fieldtype": "const uint16_t *"}, +{ "fieldname": "unTriangleCount", "fieldtype": "uint32_t"}, +{ "fieldname": "diffuseTextureId", "fieldtype": "TextureID_t"}]} +,{"struct": "vr::RenderModel_ControllerMode_State_t","fields": [ +{ "fieldname": "bScrollWheelVisible", "fieldtype": "_Bool"}]} +,{"struct": "vr::NotificationBitmap_t","fields": [ +{ "fieldname": "m_pImageData", "fieldtype": "void *"}, +{ "fieldname": "m_nWidth", "fieldtype": "int32_t"}, +{ "fieldname": "m_nHeight", "fieldtype": "int32_t"}, +{ "fieldname": "m_nBytesPerPixel", "fieldtype": "int32_t"}]} +,{"struct": "vr::COpenVRContext","fields": [ +{ "fieldname": "m_pVRSystem", "fieldtype": "class vr::IVRSystem *"}, +{ "fieldname": "m_pVRChaperone", "fieldtype": "class vr::IVRChaperone *"}, +{ "fieldname": "m_pVRChaperoneSetup", "fieldtype": "class vr::IVRChaperoneSetup *"}, +{ "fieldname": "m_pVRCompositor", "fieldtype": "class vr::IVRCompositor *"}, +{ "fieldname": "m_pVROverlay", "fieldtype": "class vr::IVROverlay *"}, +{ "fieldname": "m_pVRResources", "fieldtype": "class vr::IVRResources *"}, +{ "fieldname": "m_pVRRenderModels", "fieldtype": "class vr::IVRRenderModels *"}, +{ "fieldname": "m_pVRExtendedDisplay", "fieldtype": "class vr::IVRExtendedDisplay *"}, +{ "fieldname": "m_pVRSettings", "fieldtype": "class vr::IVRSettings *"}, +{ "fieldname": "m_pVRApplications", "fieldtype": "class vr::IVRApplications *"}, +{ "fieldname": "m_pVRTrackedCamera", "fieldtype": "class vr::IVRTrackedCamera *"}, +{ "fieldname": "m_pVRScreenshots", "fieldtype": "class vr::IVRScreenshots *"}, +{ "fieldname": "m_pVRDriverManager", "fieldtype": "class vr::IVRDriverManager *"}]} +], +"methods":[{ + "classname": "vr::IVRSystem", + "methodname": "GetRecommendedRenderTargetSize", + "returntype": "void", + "params": [ +{ "paramname": "pnWidth" ,"paramtype": "uint32_t *"}, +{ "paramname": "pnHeight" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetProjectionMatrix", + "returntype": "struct vr::HmdMatrix44_t", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"}, +{ "paramname": "fNearZ" ,"paramtype": "float"}, +{ "paramname": "fFarZ" ,"paramtype": "float"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetProjectionRaw", + "returntype": "void", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"}, +{ "paramname": "pfLeft" ,"paramtype": "float *"}, +{ "paramname": "pfRight" ,"paramtype": "float *"}, +{ "paramname": "pfTop" ,"paramtype": "float *"}, +{ "paramname": "pfBottom" ,"paramtype": "float *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "ComputeDistortion", + "returntype": "bool", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"}, +{ "paramname": "fU" ,"paramtype": "float"}, +{ "paramname": "fV" ,"paramtype": "float"}, +{ "paramname": "pDistortionCoordinates" ,"paramtype": "struct vr::DistortionCoordinates_t *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetEyeToHeadTransform", + "returntype": "struct vr::HmdMatrix34_t", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetTimeSinceLastVsync", + "returntype": "bool", + "params": [ +{ "paramname": "pfSecondsSinceLastVsync" ,"paramtype": "float *"}, +{ "paramname": "pulFrameCounter" ,"paramtype": "uint64_t *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetD3D9AdapterIndex", + "returntype": "int32_t" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetDXGIOutputInfo", + "returntype": "void", + "params": [ +{ "paramname": "pnAdapterIndex" ,"paramtype": "int32_t *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetOutputDevice", + "returntype": "void", + "params": [ +{ "paramname": "pnDevice" ,"paramtype": "uint64_t *"}, +{ "paramname": "textureType" ,"paramtype": "vr::ETextureType"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "IsDisplayOnDesktop", + "returntype": "bool" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "SetDisplayVisibility", + "returntype": "bool", + "params": [ +{ "paramname": "bIsVisibleOnDesktop" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetDeviceToAbsoluteTrackingPose", + "returntype": "void", + "params": [ +{ "paramname": "eOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin"}, +{ "paramname": "fPredictedSecondsToPhotonsFromNow" ,"paramtype": "float"}, +{ "paramname": "pTrackedDevicePoseArray" ,"array_count": "unTrackedDevicePoseArrayCount" ,"paramtype": "struct vr::TrackedDevicePose_t *"}, +{ "paramname": "unTrackedDevicePoseArrayCount" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "ResetSeatedZeroPose", + "returntype": "void" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetSeatedZeroPoseToStandingAbsoluteTrackingPose", + "returntype": "struct vr::HmdMatrix34_t" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetRawZeroPoseToStandingAbsoluteTrackingPose", + "returntype": "struct vr::HmdMatrix34_t" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetSortedTrackedDeviceIndicesOfClass", + "returntype": "uint32_t", + "params": [ +{ "paramname": "eTrackedDeviceClass" ,"paramtype": "vr::ETrackedDeviceClass"}, +{ "paramname": "punTrackedDeviceIndexArray" ,"array_count": "unTrackedDeviceIndexArrayCount" ,"paramtype": "vr::TrackedDeviceIndex_t *"}, +{ "paramname": "unTrackedDeviceIndexArrayCount" ,"paramtype": "uint32_t"}, +{ "paramname": "unRelativeToTrackedDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetTrackedDeviceActivityLevel", + "returntype": "vr::EDeviceActivityLevel", + "params": [ +{ "paramname": "unDeviceId" ,"paramtype": "vr::TrackedDeviceIndex_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "ApplyTransform", + "returntype": "void", + "params": [ +{ "paramname": "pOutputPose" ,"paramtype": "struct vr::TrackedDevicePose_t *"}, +{ "paramname": "pTrackedDevicePose" ,"paramtype": "const struct vr::TrackedDevicePose_t *"}, +{ "paramname": "pTransform" ,"paramtype": "const struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetTrackedDeviceIndexForControllerRole", + "returntype": "vr::TrackedDeviceIndex_t", + "params": [ +{ "paramname": "unDeviceType" ,"paramtype": "vr::ETrackedControllerRole"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetControllerRoleForTrackedDeviceIndex", + "returntype": "vr::ETrackedControllerRole", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetTrackedDeviceClass", + "returntype": "vr::ETrackedDeviceClass", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "IsTrackedDeviceConnected", + "returntype": "bool", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetBoolTrackedDeviceProperty", + "returntype": "bool", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "prop" ,"paramtype": "vr::ETrackedDeviceProperty"}, +{ "paramname": "pError" ,"paramtype": "vr::ETrackedPropertyError *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetFloatTrackedDeviceProperty", + "returntype": "float", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "prop" ,"paramtype": "vr::ETrackedDeviceProperty"}, +{ "paramname": "pError" ,"paramtype": "vr::ETrackedPropertyError *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetInt32TrackedDeviceProperty", + "returntype": "int32_t", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "prop" ,"paramtype": "vr::ETrackedDeviceProperty"}, +{ "paramname": "pError" ,"paramtype": "vr::ETrackedPropertyError *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetUint64TrackedDeviceProperty", + "returntype": "uint64_t", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "prop" ,"paramtype": "vr::ETrackedDeviceProperty"}, +{ "paramname": "pError" ,"paramtype": "vr::ETrackedPropertyError *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetMatrix34TrackedDeviceProperty", + "returntype": "struct vr::HmdMatrix34_t", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "prop" ,"paramtype": "vr::ETrackedDeviceProperty"}, +{ "paramname": "pError" ,"paramtype": "vr::ETrackedPropertyError *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetStringTrackedDeviceProperty", + "returntype": "uint32_t", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "prop" ,"paramtype": "vr::ETrackedDeviceProperty"}, +{ "paramname": "pchValue" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"}, +{ "paramname": "pError" ,"paramtype": "vr::ETrackedPropertyError *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetPropErrorNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "error" ,"paramtype": "vr::ETrackedPropertyError"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "PollNextEvent", + "returntype": "bool", + "params": [ +{ "paramname": "pEvent" ,"paramtype": "struct vr::VREvent_t *"}, +{ "paramname": "uncbVREvent" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "PollNextEventWithPose", + "returntype": "bool", + "params": [ +{ "paramname": "eOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin"}, +{ "paramname": "pEvent" ,"paramtype": "struct vr::VREvent_t *"}, +{ "paramname": "uncbVREvent" ,"paramtype": "uint32_t"}, +{ "paramname": "pTrackedDevicePose" ,"paramtype": "vr::TrackedDevicePose_t *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetEventTypeNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "eType" ,"paramtype": "vr::EVREventType"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetHiddenAreaMesh", + "returntype": "struct vr::HiddenAreaMesh_t", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"}, +{ "paramname": "type" ,"paramtype": "vr::EHiddenAreaMeshType"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetControllerState", + "returntype": "bool", + "params": [ +{ "paramname": "unControllerDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "pControllerState" ,"paramtype": "vr::VRControllerState_t *"}, +{ "paramname": "unControllerStateSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetControllerStateWithPose", + "returntype": "bool", + "params": [ +{ "paramname": "eOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin"}, +{ "paramname": "unControllerDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "pControllerState" ,"paramtype": "vr::VRControllerState_t *"}, +{ "paramname": "unControllerStateSize" ,"paramtype": "uint32_t"}, +{ "paramname": "pTrackedDevicePose" ,"paramtype": "struct vr::TrackedDevicePose_t *"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "TriggerHapticPulse", + "returntype": "void", + "params": [ +{ "paramname": "unControllerDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "unAxisId" ,"paramtype": "uint32_t"}, +{ "paramname": "usDurationMicroSec" ,"paramtype": "unsigned short"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetButtonIdNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "eButtonId" ,"paramtype": "vr::EVRButtonId"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "GetControllerAxisTypeNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "eAxisType" ,"paramtype": "vr::EVRControllerAxisType"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "CaptureInputFocus", + "returntype": "bool" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "ReleaseInputFocus", + "returntype": "void" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "IsInputFocusCapturedByAnotherProcess", + "returntype": "bool" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "DriverDebugRequest", + "returntype": "uint32_t", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "pchRequest" ,"paramtype": "const char *"}, +{ "paramname": "pchResponseBuffer" ,"paramtype": "char *"}, +{ "paramname": "unResponseBufferSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "PerformFirmwareUpdate", + "returntype": "vr::EVRFirmwareError", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"} + ] +} +,{ + "classname": "vr::IVRSystem", + "methodname": "AcknowledgeQuit_Exiting", + "returntype": "void" +} +,{ + "classname": "vr::IVRSystem", + "methodname": "AcknowledgeQuit_UserPrompt", + "returntype": "void" +} +,{ + "classname": "vr::IVRExtendedDisplay", + "methodname": "GetWindowBounds", + "returntype": "void", + "params": [ +{ "paramname": "pnX" ,"paramtype": "int32_t *"}, +{ "paramname": "pnY" ,"paramtype": "int32_t *"}, +{ "paramname": "pnWidth" ,"paramtype": "uint32_t *"}, +{ "paramname": "pnHeight" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRExtendedDisplay", + "methodname": "GetEyeOutputViewport", + "returntype": "void", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"}, +{ "paramname": "pnX" ,"paramtype": "uint32_t *"}, +{ "paramname": "pnY" ,"paramtype": "uint32_t *"}, +{ "paramname": "pnWidth" ,"paramtype": "uint32_t *"}, +{ "paramname": "pnHeight" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRExtendedDisplay", + "methodname": "GetDXGIOutputInfo", + "returntype": "void", + "params": [ +{ "paramname": "pnAdapterIndex" ,"paramtype": "int32_t *"}, +{ "paramname": "pnAdapterOutputIndex" ,"paramtype": "int32_t *"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "GetCameraErrorNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "eCameraError" ,"paramtype": "vr::EVRTrackedCameraError"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "HasCamera", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "nDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "pHasCamera" ,"paramtype": "bool *"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "GetCameraFrameSize", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "nDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "eFrameType" ,"paramtype": "vr::EVRTrackedCameraFrameType"}, +{ "paramname": "pnWidth" ,"paramtype": "uint32_t *"}, +{ "paramname": "pnHeight" ,"paramtype": "uint32_t *"}, +{ "paramname": "pnFrameBufferSize" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "GetCameraIntrinsics", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "nDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "eFrameType" ,"paramtype": "vr::EVRTrackedCameraFrameType"}, +{ "paramname": "pFocalLength" ,"paramtype": "vr::HmdVector2_t *"}, +{ "paramname": "pCenter" ,"paramtype": "vr::HmdVector2_t *"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "GetCameraProjection", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "nDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "eFrameType" ,"paramtype": "vr::EVRTrackedCameraFrameType"}, +{ "paramname": "flZNear" ,"paramtype": "float"}, +{ "paramname": "flZFar" ,"paramtype": "float"}, +{ "paramname": "pProjection" ,"paramtype": "vr::HmdMatrix44_t *"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "AcquireVideoStreamingService", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "nDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "pHandle" ,"paramtype": "vr::TrackedCameraHandle_t *"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "ReleaseVideoStreamingService", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "hTrackedCamera" ,"paramtype": "vr::TrackedCameraHandle_t"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "GetVideoStreamFrameBuffer", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "hTrackedCamera" ,"paramtype": "vr::TrackedCameraHandle_t"}, +{ "paramname": "eFrameType" ,"paramtype": "vr::EVRTrackedCameraFrameType"}, +{ "paramname": "pFrameBuffer" ,"paramtype": "void *"}, +{ "paramname": "nFrameBufferSize" ,"paramtype": "uint32_t"}, +{ "paramname": "pFrameHeader" ,"paramtype": "vr::CameraVideoStreamFrameHeader_t *"}, +{ "paramname": "nFrameHeaderSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "GetVideoStreamTextureSize", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "nDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "eFrameType" ,"paramtype": "vr::EVRTrackedCameraFrameType"}, +{ "paramname": "pTextureBounds" ,"paramtype": "vr::VRTextureBounds_t *"}, +{ "paramname": "pnWidth" ,"paramtype": "uint32_t *"}, +{ "paramname": "pnHeight" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "GetVideoStreamTextureD3D11", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "hTrackedCamera" ,"paramtype": "vr::TrackedCameraHandle_t"}, +{ "paramname": "eFrameType" ,"paramtype": "vr::EVRTrackedCameraFrameType"}, +{ "paramname": "pD3D11DeviceOrResource" ,"paramtype": "void *"}, +{ "paramname": "ppD3D11ShaderResourceView" ,"paramtype": "void **"}, +{ "paramname": "pFrameHeader" ,"paramtype": "vr::CameraVideoStreamFrameHeader_t *"}, +{ "paramname": "nFrameHeaderSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "GetVideoStreamTextureGL", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "hTrackedCamera" ,"paramtype": "vr::TrackedCameraHandle_t"}, +{ "paramname": "eFrameType" ,"paramtype": "vr::EVRTrackedCameraFrameType"}, +{ "paramname": "pglTextureId" ,"paramtype": "vr::glUInt_t *"}, +{ "paramname": "pFrameHeader" ,"paramtype": "vr::CameraVideoStreamFrameHeader_t *"}, +{ "paramname": "nFrameHeaderSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRTrackedCamera", + "methodname": "ReleaseVideoStreamTextureGL", + "returntype": "vr::EVRTrackedCameraError", + "params": [ +{ "paramname": "hTrackedCamera" ,"paramtype": "vr::TrackedCameraHandle_t"}, +{ "paramname": "glTextureId" ,"paramtype": "vr::glUInt_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "AddApplicationManifest", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchApplicationManifestFullPath" ,"paramtype": "const char *"}, +{ "paramname": "bTemporary" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "RemoveApplicationManifest", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchApplicationManifestFullPath" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "IsApplicationInstalled", + "returntype": "bool", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationCount", + "returntype": "uint32_t" +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationKeyByIndex", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "unApplicationIndex" ,"paramtype": "uint32_t"}, +{ "paramname": "pchAppKeyBuffer" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unAppKeyBufferLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationKeyByProcessId", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "unProcessId" ,"paramtype": "uint32_t"}, +{ "paramname": "pchAppKeyBuffer" ,"paramtype": "char *"}, +{ "paramname": "unAppKeyBufferLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "LaunchApplication", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "LaunchTemplateApplication", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchTemplateAppKey" ,"paramtype": "const char *"}, +{ "paramname": "pchNewAppKey" ,"paramtype": "const char *"}, +{ "paramname": "pKeys" ,"array_count": "unKeys" ,"paramtype": "const struct vr::AppOverrideKeys_t *"}, +{ "paramname": "unKeys" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "LaunchApplicationFromMimeType", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchMimeType" ,"paramtype": "const char *"}, +{ "paramname": "pchArgs" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "LaunchDashboardOverlay", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "CancelApplicationLaunch", + "returntype": "bool", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "IdentifyApplication", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "unProcessId" ,"paramtype": "uint32_t"}, +{ "paramname": "pchAppKey" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationProcessId", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationsErrorNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "error" ,"paramtype": "vr::EVRApplicationError"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationPropertyString", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"}, +{ "paramname": "eProperty" ,"paramtype": "vr::EVRApplicationProperty"}, +{ "paramname": "pchPropertyValueBuffer" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unPropertyValueBufferLen" ,"paramtype": "uint32_t"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRApplicationError *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationPropertyBool", + "returntype": "bool", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"}, +{ "paramname": "eProperty" ,"paramtype": "vr::EVRApplicationProperty"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRApplicationError *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationPropertyUint64", + "returntype": "uint64_t", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"}, +{ "paramname": "eProperty" ,"paramtype": "vr::EVRApplicationProperty"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRApplicationError *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "SetApplicationAutoLaunch", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"}, +{ "paramname": "bAutoLaunch" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationAutoLaunch", + "returntype": "bool", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "SetDefaultApplicationForMimeType", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"}, +{ "paramname": "pchMimeType" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetDefaultApplicationForMimeType", + "returntype": "bool", + "params": [ +{ "paramname": "pchMimeType" ,"paramtype": "const char *"}, +{ "paramname": "pchAppKeyBuffer" ,"paramtype": "char *"}, +{ "paramname": "unAppKeyBufferLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationSupportedMimeTypes", + "returntype": "bool", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"}, +{ "paramname": "pchMimeTypesBuffer" ,"paramtype": "char *"}, +{ "paramname": "unMimeTypesBuffer" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationsThatSupportMimeType", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchMimeType" ,"paramtype": "const char *"}, +{ "paramname": "pchAppKeysThatSupportBuffer" ,"paramtype": "char *"}, +{ "paramname": "unAppKeysThatSupportBuffer" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationLaunchArguments", + "returntype": "uint32_t", + "params": [ +{ "paramname": "unHandle" ,"paramtype": "uint32_t"}, +{ "paramname": "pchArgs" ,"paramtype": "char *"}, +{ "paramname": "unArgs" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetStartingApplication", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchAppKeyBuffer" ,"paramtype": "char *"}, +{ "paramname": "unAppKeyBufferLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetTransitionState", + "returntype": "vr::EVRApplicationTransitionState" +} +,{ + "classname": "vr::IVRApplications", + "methodname": "PerformApplicationPrelaunchCheck", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchAppKey" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetApplicationsTransitionStateNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "state" ,"paramtype": "vr::EVRApplicationTransitionState"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "IsQuitUserPromptRequested", + "returntype": "bool" +} +,{ + "classname": "vr::IVRApplications", + "methodname": "LaunchInternalProcess", + "returntype": "vr::EVRApplicationError", + "params": [ +{ "paramname": "pchBinaryPath" ,"paramtype": "const char *"}, +{ "paramname": "pchArguments" ,"paramtype": "const char *"}, +{ "paramname": "pchWorkingDirectory" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRApplications", + "methodname": "GetCurrentSceneProcessId", + "returntype": "uint32_t" +} +,{ + "classname": "vr::IVRChaperone", + "methodname": "GetCalibrationState", + "returntype": "vr::ChaperoneCalibrationState" +} +,{ + "classname": "vr::IVRChaperone", + "methodname": "GetPlayAreaSize", + "returntype": "bool", + "params": [ +{ "paramname": "pSizeX" ,"paramtype": "float *"}, +{ "paramname": "pSizeZ" ,"paramtype": "float *"} + ] +} +,{ + "classname": "vr::IVRChaperone", + "methodname": "GetPlayAreaRect", + "returntype": "bool", + "params": [ +{ "paramname": "rect" ,"paramtype": "struct vr::HmdQuad_t *"} + ] +} +,{ + "classname": "vr::IVRChaperone", + "methodname": "ReloadInfo", + "returntype": "void" +} +,{ + "classname": "vr::IVRChaperone", + "methodname": "SetSceneColor", + "returntype": "void", + "params": [ +{ "paramname": "color" ,"paramtype": "struct vr::HmdColor_t"} + ] +} +,{ + "classname": "vr::IVRChaperone", + "methodname": "GetBoundsColor", + "returntype": "void", + "params": [ +{ "paramname": "pOutputColorArray" ,"paramtype": "struct vr::HmdColor_t *"}, +{ "paramname": "nNumOutputColors" ,"paramtype": "int"}, +{ "paramname": "flCollisionBoundsFadeDistance" ,"paramtype": "float"}, +{ "paramname": "pOutputCameraColor" ,"paramtype": "struct vr::HmdColor_t *"} + ] +} +,{ + "classname": "vr::IVRChaperone", + "methodname": "AreBoundsVisible", + "returntype": "bool" +} +,{ + "classname": "vr::IVRChaperone", + "methodname": "ForceBoundsVisible", + "returntype": "void", + "params": [ +{ "paramname": "bForce" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "CommitWorkingCopy", + "returntype": "bool", + "params": [ +{ "paramname": "configFile" ,"paramtype": "vr::EChaperoneConfigFile"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "RevertWorkingCopy", + "returntype": "void" +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetWorkingPlayAreaSize", + "returntype": "bool", + "params": [ +{ "paramname": "pSizeX" ,"paramtype": "float *"}, +{ "paramname": "pSizeZ" ,"paramtype": "float *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetWorkingPlayAreaRect", + "returntype": "bool", + "params": [ +{ "paramname": "rect" ,"paramtype": "struct vr::HmdQuad_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetWorkingCollisionBoundsInfo", + "returntype": "bool", + "params": [ +{ "paramname": "pQuadsBuffer" ,"out_array_count": "punQuadsCount" ,"paramtype": "struct vr::HmdQuad_t *"}, +{ "paramname": "punQuadsCount" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetLiveCollisionBoundsInfo", + "returntype": "bool", + "params": [ +{ "paramname": "pQuadsBuffer" ,"out_array_count": "punQuadsCount" ,"paramtype": "struct vr::HmdQuad_t *"}, +{ "paramname": "punQuadsCount" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetWorkingSeatedZeroPoseToRawTrackingPose", + "returntype": "bool", + "params": [ +{ "paramname": "pmatSeatedZeroPoseToRawTrackingPose" ,"paramtype": "struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetWorkingStandingZeroPoseToRawTrackingPose", + "returntype": "bool", + "params": [ +{ "paramname": "pmatStandingZeroPoseToRawTrackingPose" ,"paramtype": "struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "SetWorkingPlayAreaSize", + "returntype": "void", + "params": [ +{ "paramname": "sizeX" ,"paramtype": "float"}, +{ "paramname": "sizeZ" ,"paramtype": "float"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "SetWorkingCollisionBoundsInfo", + "returntype": "void", + "params": [ +{ "paramname": "pQuadsBuffer" ,"array_count": "unQuadsCount" ,"paramtype": "struct vr::HmdQuad_t *"}, +{ "paramname": "unQuadsCount" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "SetWorkingSeatedZeroPoseToRawTrackingPose", + "returntype": "void", + "params": [ +{ "paramname": "pMatSeatedZeroPoseToRawTrackingPose" ,"paramtype": "const struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "SetWorkingStandingZeroPoseToRawTrackingPose", + "returntype": "void", + "params": [ +{ "paramname": "pMatStandingZeroPoseToRawTrackingPose" ,"paramtype": "const struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "ReloadFromDisk", + "returntype": "void", + "params": [ +{ "paramname": "configFile" ,"paramtype": "vr::EChaperoneConfigFile"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetLiveSeatedZeroPoseToRawTrackingPose", + "returntype": "bool", + "params": [ +{ "paramname": "pmatSeatedZeroPoseToRawTrackingPose" ,"paramtype": "struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "SetWorkingCollisionBoundsTagsInfo", + "returntype": "void", + "params": [ +{ "paramname": "pTagsBuffer" ,"array_count": "unTagCount" ,"paramtype": "uint8_t *"}, +{ "paramname": "unTagCount" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetLiveCollisionBoundsTagsInfo", + "returntype": "bool", + "params": [ +{ "paramname": "pTagsBuffer" ,"out_array_count": "punTagCount" ,"paramtype": "uint8_t *"}, +{ "paramname": "punTagCount" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "SetWorkingPhysicalBoundsInfo", + "returntype": "bool", + "params": [ +{ "paramname": "pQuadsBuffer" ,"array_count": "unQuadsCount" ,"paramtype": "struct vr::HmdQuad_t *"}, +{ "paramname": "unQuadsCount" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "GetLivePhysicalBoundsInfo", + "returntype": "bool", + "params": [ +{ "paramname": "pQuadsBuffer" ,"out_array_count": "punQuadsCount" ,"paramtype": "struct vr::HmdQuad_t *"}, +{ "paramname": "punQuadsCount" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "ExportLiveToBuffer", + "returntype": "bool", + "params": [ +{ "paramname": "pBuffer" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "pnBufferLength" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVRChaperoneSetup", + "methodname": "ImportFromBufferToWorking", + "returntype": "bool", + "params": [ +{ "paramname": "pBuffer" ,"paramtype": "const char *"}, +{ "paramname": "nImportFlags" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "SetTrackingSpace", + "returntype": "void", + "params": [ +{ "paramname": "eOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetTrackingSpace", + "returntype": "vr::ETrackingUniverseOrigin" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "WaitGetPoses", + "returntype": "vr::EVRCompositorError", + "params": [ +{ "paramname": "pRenderPoseArray" ,"array_count": "unRenderPoseArrayCount" ,"paramtype": "struct vr::TrackedDevicePose_t *"}, +{ "paramname": "unRenderPoseArrayCount" ,"paramtype": "uint32_t"}, +{ "paramname": "pGamePoseArray" ,"array_count": "unGamePoseArrayCount" ,"paramtype": "struct vr::TrackedDevicePose_t *"}, +{ "paramname": "unGamePoseArrayCount" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetLastPoses", + "returntype": "vr::EVRCompositorError", + "params": [ +{ "paramname": "pRenderPoseArray" ,"array_count": "unRenderPoseArrayCount" ,"paramtype": "struct vr::TrackedDevicePose_t *"}, +{ "paramname": "unRenderPoseArrayCount" ,"paramtype": "uint32_t"}, +{ "paramname": "pGamePoseArray" ,"array_count": "unGamePoseArrayCount" ,"paramtype": "struct vr::TrackedDevicePose_t *"}, +{ "paramname": "unGamePoseArrayCount" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetLastPoseForTrackedDeviceIndex", + "returntype": "vr::EVRCompositorError", + "params": [ +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "pOutputPose" ,"paramtype": "struct vr::TrackedDevicePose_t *"}, +{ "paramname": "pOutputGamePose" ,"paramtype": "struct vr::TrackedDevicePose_t *"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "Submit", + "returntype": "vr::EVRCompositorError", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"}, +{ "paramname": "pTexture" ,"paramtype": "const struct vr::Texture_t *"}, +{ "paramname": "pBounds" ,"paramtype": "const struct vr::VRTextureBounds_t *"}, +{ "paramname": "nSubmitFlags" ,"paramtype": "vr::EVRSubmitFlags"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "ClearLastSubmittedFrame", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "PostPresentHandoff", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetFrameTiming", + "returntype": "bool", + "params": [ +{ "paramname": "pTiming" ,"paramtype": "struct vr::Compositor_FrameTiming *"}, +{ "paramname": "unFramesAgo" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetFrameTimings", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pTiming" ,"paramtype": "struct vr::Compositor_FrameTiming *"}, +{ "paramname": "nFrames" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetFrameTimeRemaining", + "returntype": "float" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetCumulativeStats", + "returntype": "void", + "params": [ +{ "paramname": "pStats" ,"paramtype": "struct vr::Compositor_CumulativeStats *"}, +{ "paramname": "nStatsSizeInBytes" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "FadeToColor", + "returntype": "void", + "params": [ +{ "paramname": "fSeconds" ,"paramtype": "float"}, +{ "paramname": "fRed" ,"paramtype": "float"}, +{ "paramname": "fGreen" ,"paramtype": "float"}, +{ "paramname": "fBlue" ,"paramtype": "float"}, +{ "paramname": "fAlpha" ,"paramtype": "float"}, +{ "paramname": "bBackground" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetCurrentFadeColor", + "returntype": "struct vr::HmdColor_t", + "params": [ +{ "paramname": "bBackground" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "FadeGrid", + "returntype": "void", + "params": [ +{ "paramname": "fSeconds" ,"paramtype": "float"}, +{ "paramname": "bFadeIn" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetCurrentGridAlpha", + "returntype": "float" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "SetSkyboxOverride", + "returntype": "vr::EVRCompositorError", + "params": [ +{ "paramname": "pTextures" ,"array_count": "unTextureCount" ,"paramtype": "const struct vr::Texture_t *"}, +{ "paramname": "unTextureCount" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "ClearSkyboxOverride", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "CompositorBringToFront", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "CompositorGoToBack", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "CompositorQuit", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "IsFullscreen", + "returntype": "bool" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetCurrentSceneFocusProcess", + "returntype": "uint32_t" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetLastFrameRenderer", + "returntype": "uint32_t" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "CanRenderScene", + "returntype": "bool" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "ShowMirrorWindow", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "HideMirrorWindow", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "IsMirrorWindowVisible", + "returntype": "bool" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "CompositorDumpImages", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "ShouldAppRenderWithLowResources", + "returntype": "bool" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "ForceInterleavedReprojectionOn", + "returntype": "void", + "params": [ +{ "paramname": "bOverride" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "ForceReconnectProcess", + "returntype": "void" +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "SuspendRendering", + "returntype": "void", + "params": [ +{ "paramname": "bSuspend" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetMirrorTextureD3D11", + "returntype": "vr::EVRCompositorError", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"}, +{ "paramname": "pD3D11DeviceOrResource" ,"paramtype": "void *"}, +{ "paramname": "ppD3D11ShaderResourceView" ,"paramtype": "void **"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "ReleaseMirrorTextureD3D11", + "returntype": "void", + "params": [ +{ "paramname": "pD3D11ShaderResourceView" ,"paramtype": "void *"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetMirrorTextureGL", + "returntype": "vr::EVRCompositorError", + "params": [ +{ "paramname": "eEye" ,"paramtype": "vr::EVREye"}, +{ "paramname": "pglTextureId" ,"paramtype": "vr::glUInt_t *"}, +{ "paramname": "pglSharedTextureHandle" ,"paramtype": "vr::glSharedTextureHandle_t *"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "ReleaseSharedGLTexture", + "returntype": "bool", + "params": [ +{ "paramname": "glTextureId" ,"paramtype": "vr::glUInt_t"}, +{ "paramname": "glSharedTextureHandle" ,"paramtype": "vr::glSharedTextureHandle_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "LockGLSharedTextureForAccess", + "returntype": "void", + "params": [ +{ "paramname": "glSharedTextureHandle" ,"paramtype": "vr::glSharedTextureHandle_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "UnlockGLSharedTextureForAccess", + "returntype": "void", + "params": [ +{ "paramname": "glSharedTextureHandle" ,"paramtype": "vr::glSharedTextureHandle_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetVulkanInstanceExtensionsRequired", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchValue" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRCompositor", + "methodname": "GetVulkanDeviceExtensionsRequired", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pPhysicalDevice" ,"paramtype": "struct VkPhysicalDevice_T *"}, +{ "paramname": "pchValue" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "FindOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "pchOverlayKey" ,"paramtype": "const char *"}, +{ "paramname": "pOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "CreateOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "pchOverlayKey" ,"paramtype": "const char *"}, +{ "paramname": "pchOverlayName" ,"paramtype": "const char *"}, +{ "paramname": "pOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "DestroyOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetHighQualityOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetHighQualityOverlay", + "returntype": "vr::VROverlayHandle_t" +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayKey", + "returntype": "uint32_t", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pchValue" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"}, +{ "paramname": "pError" ,"paramtype": "vr::EVROverlayError *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayName", + "returntype": "uint32_t", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pchValue" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"}, +{ "paramname": "pError" ,"paramtype": "vr::EVROverlayError *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayName", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pchName" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayImageData", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pvBuffer" ,"paramtype": "void *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"}, +{ "paramname": "punWidth" ,"paramtype": "uint32_t *"}, +{ "paramname": "punHeight" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayErrorNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "error" ,"paramtype": "vr::EVROverlayError"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayRenderingPid", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "unPID" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayRenderingPid", + "returntype": "uint32_t", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayFlag", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "eOverlayFlag" ,"paramtype": "vr::VROverlayFlags"}, +{ "paramname": "bEnabled" ,"paramtype": "bool"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayFlag", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "eOverlayFlag" ,"paramtype": "vr::VROverlayFlags"}, +{ "paramname": "pbEnabled" ,"paramtype": "bool *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayColor", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "fRed" ,"paramtype": "float"}, +{ "paramname": "fGreen" ,"paramtype": "float"}, +{ "paramname": "fBlue" ,"paramtype": "float"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayColor", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pfRed" ,"paramtype": "float *"}, +{ "paramname": "pfGreen" ,"paramtype": "float *"}, +{ "paramname": "pfBlue" ,"paramtype": "float *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayAlpha", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "fAlpha" ,"paramtype": "float"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayAlpha", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pfAlpha" ,"paramtype": "float *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayTexelAspect", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "fTexelAspect" ,"paramtype": "float"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTexelAspect", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pfTexelAspect" ,"paramtype": "float *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlaySortOrder", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "unSortOrder" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlaySortOrder", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "punSortOrder" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayWidthInMeters", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "fWidthInMeters" ,"paramtype": "float"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayWidthInMeters", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pfWidthInMeters" ,"paramtype": "float *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayAutoCurveDistanceRangeInMeters", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "fMinDistanceInMeters" ,"paramtype": "float"}, +{ "paramname": "fMaxDistanceInMeters" ,"paramtype": "float"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayAutoCurveDistanceRangeInMeters", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pfMinDistanceInMeters" ,"paramtype": "float *"}, +{ "paramname": "pfMaxDistanceInMeters" ,"paramtype": "float *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayTextureColorSpace", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "eTextureColorSpace" ,"paramtype": "vr::EColorSpace"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTextureColorSpace", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "peTextureColorSpace" ,"paramtype": "vr::EColorSpace *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayTextureBounds", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pOverlayTextureBounds" ,"paramtype": "const struct vr::VRTextureBounds_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTextureBounds", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pOverlayTextureBounds" ,"paramtype": "struct vr::VRTextureBounds_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayRenderModel", + "returntype": "uint32_t", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pchValue" ,"paramtype": "char *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"}, +{ "paramname": "pColor" ,"paramtype": "struct vr::HmdColor_t *"}, +{ "paramname": "pError" ,"paramtype": "vr::EVROverlayError *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayRenderModel", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pchRenderModel" ,"paramtype": "const char *"}, +{ "paramname": "pColor" ,"paramtype": "const struct vr::HmdColor_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTransformType", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "peTransformType" ,"paramtype": "vr::VROverlayTransformType *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayTransformAbsolute", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "eTrackingOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin"}, +{ "paramname": "pmatTrackingOriginToOverlayTransform" ,"paramtype": "const struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTransformAbsolute", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "peTrackingOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin *"}, +{ "paramname": "pmatTrackingOriginToOverlayTransform" ,"paramtype": "struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayTransformTrackedDeviceRelative", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "unTrackedDevice" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "pmatTrackedDeviceToOverlayTransform" ,"paramtype": "const struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTransformTrackedDeviceRelative", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "punTrackedDevice" ,"paramtype": "vr::TrackedDeviceIndex_t *"}, +{ "paramname": "pmatTrackedDeviceToOverlayTransform" ,"paramtype": "struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayTransformTrackedDeviceComponent", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "unDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"}, +{ "paramname": "pchComponentName" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTransformTrackedDeviceComponent", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "punDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t *"}, +{ "paramname": "pchComponentName" ,"paramtype": "char *"}, +{ "paramname": "unComponentNameSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTransformOverlayRelative", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "ulOverlayHandleParent" ,"paramtype": "vr::VROverlayHandle_t *"}, +{ "paramname": "pmatParentOverlayToOverlayTransform" ,"paramtype": "struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayTransformOverlayRelative", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "ulOverlayHandleParent" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pmatParentOverlayToOverlayTransform" ,"paramtype": "const struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "ShowOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "HideOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "IsOverlayVisible", + "returntype": "bool", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetTransformForOverlayCoordinates", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "eTrackingOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin"}, +{ "paramname": "coordinatesInOverlay" ,"paramtype": "struct vr::HmdVector2_t"}, +{ "paramname": "pmatTransform" ,"paramtype": "struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "PollNextOverlayEvent", + "returntype": "bool", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pEvent" ,"paramtype": "struct vr::VREvent_t *"}, +{ "paramname": "uncbVREvent" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayInputMethod", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "peInputMethod" ,"paramtype": "vr::VROverlayInputMethod *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayInputMethod", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "eInputMethod" ,"paramtype": "vr::VROverlayInputMethod"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayMouseScale", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pvecMouseScale" ,"paramtype": "struct vr::HmdVector2_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayMouseScale", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pvecMouseScale" ,"paramtype": "const struct vr::HmdVector2_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "ComputeOverlayIntersection", + "returntype": "bool", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pParams" ,"paramtype": "const struct vr::VROverlayIntersectionParams_t *"}, +{ "paramname": "pResults" ,"paramtype": "struct vr::VROverlayIntersectionResults_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "HandleControllerOverlayInteractionAsMouse", + "returntype": "bool", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "unControllerDeviceIndex" ,"paramtype": "vr::TrackedDeviceIndex_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "IsHoverTargetOverlay", + "returntype": "bool", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetGamepadFocusOverlay", + "returntype": "vr::VROverlayHandle_t" +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetGamepadFocusOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulNewFocusOverlay" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayNeighbor", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "eDirection" ,"paramtype": "vr::EOverlayDirection"}, +{ "paramname": "ulFrom" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "ulTo" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "MoveGamepadFocusToNeighbor", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "eDirection" ,"paramtype": "vr::EOverlayDirection"}, +{ "paramname": "ulFrom" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayTexture", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pTexture" ,"paramtype": "const struct vr::Texture_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "ClearOverlayTexture", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayRaw", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pvBuffer" ,"paramtype": "void *"}, +{ "paramname": "unWidth" ,"paramtype": "uint32_t"}, +{ "paramname": "unHeight" ,"paramtype": "uint32_t"}, +{ "paramname": "unDepth" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayFromFile", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pchFilePath" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTexture", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pNativeTextureHandle" ,"paramtype": "void **"}, +{ "paramname": "pNativeTextureRef" ,"paramtype": "void *"}, +{ "paramname": "pWidth" ,"paramtype": "uint32_t *"}, +{ "paramname": "pHeight" ,"paramtype": "uint32_t *"}, +{ "paramname": "pNativeFormat" ,"paramtype": "uint32_t *"}, +{ "paramname": "pAPIType" ,"paramtype": "vr::ETextureType *"}, +{ "paramname": "pColorSpace" ,"paramtype": "vr::EColorSpace *"}, +{ "paramname": "pTextureBounds" ,"paramtype": "struct vr::VRTextureBounds_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "ReleaseNativeOverlayHandle", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pNativeTextureHandle" ,"paramtype": "void *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayTextureSize", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pWidth" ,"paramtype": "uint32_t *"}, +{ "paramname": "pHeight" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "CreateDashboardOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "pchOverlayKey" ,"paramtype": "const char *"}, +{ "paramname": "pchOverlayFriendlyName" ,"paramtype": "const char *"}, +{ "paramname": "pMainHandle" ,"paramtype": "vr::VROverlayHandle_t *"}, +{ "paramname": "pThumbnailHandle" ,"paramtype": "vr::VROverlayHandle_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "IsDashboardVisible", + "returntype": "bool" +} +,{ + "classname": "vr::IVROverlay", + "methodname": "IsActiveDashboardOverlay", + "returntype": "bool", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetDashboardOverlaySceneProcess", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "unProcessId" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetDashboardOverlaySceneProcess", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "punProcessId" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "ShowDashboard", + "returntype": "void", + "params": [ +{ "paramname": "pchOverlayToShow" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetPrimaryDashboardDevice", + "returntype": "vr::TrackedDeviceIndex_t" +} +,{ + "classname": "vr::IVROverlay", + "methodname": "ShowKeyboard", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "eInputMode" ,"paramtype": "vr::EGamepadTextInputMode"}, +{ "paramname": "eLineInputMode" ,"paramtype": "vr::EGamepadTextInputLineMode"}, +{ "paramname": "pchDescription" ,"paramtype": "const char *"}, +{ "paramname": "unCharMax" ,"paramtype": "uint32_t"}, +{ "paramname": "pchExistingText" ,"paramtype": "const char *"}, +{ "paramname": "bUseMinimalMode" ,"paramtype": "bool"}, +{ "paramname": "uUserValue" ,"paramtype": "uint64_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "ShowKeyboardForOverlay", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "eInputMode" ,"paramtype": "vr::EGamepadTextInputMode"}, +{ "paramname": "eLineInputMode" ,"paramtype": "vr::EGamepadTextInputLineMode"}, +{ "paramname": "pchDescription" ,"paramtype": "const char *"}, +{ "paramname": "unCharMax" ,"paramtype": "uint32_t"}, +{ "paramname": "pchExistingText" ,"paramtype": "const char *"}, +{ "paramname": "bUseMinimalMode" ,"paramtype": "bool"}, +{ "paramname": "uUserValue" ,"paramtype": "uint64_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetKeyboardText", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchText" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "cchText" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "HideKeyboard", + "returntype": "void" +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetKeyboardTransformAbsolute", + "returntype": "void", + "params": [ +{ "paramname": "eTrackingOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin"}, +{ "paramname": "pmatTrackingOriginToKeyboardTransform" ,"paramtype": "const struct vr::HmdMatrix34_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetKeyboardPositionForOverlay", + "returntype": "void", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "avoidRect" ,"paramtype": "struct vr::HmdRect2_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "SetOverlayIntersectionMask", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pMaskPrimitives" ,"paramtype": "struct vr::VROverlayIntersectionMaskPrimitive_t *"}, +{ "paramname": "unNumMaskPrimitives" ,"paramtype": "uint32_t"}, +{ "paramname": "unPrimitiveSize" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "GetOverlayFlags", + "returntype": "vr::EVROverlayError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "pFlags" ,"paramtype": "uint32_t *"} + ] +} +,{ + "classname": "vr::IVROverlay", + "methodname": "ShowMessageOverlay", + "returntype": "vr::VRMessageOverlayResponse", + "params": [ +{ "paramname": "pchText" ,"paramtype": "const char *"}, +{ "paramname": "pchCaption" ,"paramtype": "const char *"}, +{ "paramname": "pchButton0Text" ,"paramtype": "const char *"}, +{ "paramname": "pchButton1Text" ,"paramtype": "const char *"}, +{ "paramname": "pchButton2Text" ,"paramtype": "const char *"}, +{ "paramname": "pchButton3Text" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "LoadRenderModel_Async", + "returntype": "vr::EVRRenderModelError", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"}, +{ "paramname": "ppRenderModel" ,"paramtype": "struct vr::RenderModel_t **"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "FreeRenderModel", + "returntype": "void", + "params": [ +{ "paramname": "pRenderModel" ,"paramtype": "struct vr::RenderModel_t *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "LoadTexture_Async", + "returntype": "vr::EVRRenderModelError", + "params": [ +{ "paramname": "textureId" ,"paramtype": "vr::TextureID_t"}, +{ "paramname": "ppTexture" ,"paramtype": "struct vr::RenderModel_TextureMap_t **"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "FreeTexture", + "returntype": "void", + "params": [ +{ "paramname": "pTexture" ,"paramtype": "struct vr::RenderModel_TextureMap_t *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "LoadTextureD3D11_Async", + "returntype": "vr::EVRRenderModelError", + "params": [ +{ "paramname": "textureId" ,"paramtype": "vr::TextureID_t"}, +{ "paramname": "pD3D11Device" ,"paramtype": "void *"}, +{ "paramname": "ppD3D11Texture2D" ,"paramtype": "void **"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "LoadIntoTextureD3D11_Async", + "returntype": "vr::EVRRenderModelError", + "params": [ +{ "paramname": "textureId" ,"paramtype": "vr::TextureID_t"}, +{ "paramname": "pDstTexture" ,"paramtype": "void *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "FreeTextureD3D11", + "returntype": "void", + "params": [ +{ "paramname": "pD3D11Texture2D" ,"paramtype": "void *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetRenderModelName", + "returntype": "uint32_t", + "params": [ +{ "paramname": "unRenderModelIndex" ,"paramtype": "uint32_t"}, +{ "paramname": "pchRenderModelName" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unRenderModelNameLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetRenderModelCount", + "returntype": "uint32_t" +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetComponentCount", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetComponentName", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"}, +{ "paramname": "unComponentIndex" ,"paramtype": "uint32_t"}, +{ "paramname": "pchComponentName" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unComponentNameLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetComponentButtonMask", + "returntype": "uint64_t", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"}, +{ "paramname": "pchComponentName" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetComponentRenderModelName", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"}, +{ "paramname": "pchComponentName" ,"paramtype": "const char *"}, +{ "paramname": "pchComponentRenderModelName" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unComponentRenderModelNameLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetComponentState", + "returntype": "bool", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"}, +{ "paramname": "pchComponentName" ,"paramtype": "const char *"}, +{ "paramname": "pControllerState" ,"paramtype": "const vr::VRControllerState_t *"}, +{ "paramname": "pState" ,"paramtype": "const struct vr::RenderModel_ControllerMode_State_t *"}, +{ "paramname": "pComponentState" ,"paramtype": "struct vr::RenderModel_ComponentState_t *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "RenderModelHasComponent", + "returntype": "bool", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"}, +{ "paramname": "pchComponentName" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetRenderModelThumbnailURL", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"}, +{ "paramname": "pchThumbnailURL" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unThumbnailURLLen" ,"paramtype": "uint32_t"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRRenderModelError *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetRenderModelOriginalPath", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchRenderModelName" ,"paramtype": "const char *"}, +{ "paramname": "pchOriginalPath" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unOriginalPathLen" ,"paramtype": "uint32_t"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRRenderModelError *"} + ] +} +,{ + "classname": "vr::IVRRenderModels", + "methodname": "GetRenderModelErrorNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "error" ,"paramtype": "vr::EVRRenderModelError"} + ] +} +,{ + "classname": "vr::IVRNotifications", + "methodname": "CreateNotification", + "returntype": "vr::EVRNotificationError", + "params": [ +{ "paramname": "ulOverlayHandle" ,"paramtype": "vr::VROverlayHandle_t"}, +{ "paramname": "ulUserValue" ,"paramtype": "uint64_t"}, +{ "paramname": "type" ,"paramtype": "vr::EVRNotificationType"}, +{ "paramname": "pchText" ,"paramtype": "const char *"}, +{ "paramname": "style" ,"paramtype": "vr::EVRNotificationStyle"}, +{ "paramname": "pImage" ,"paramtype": "const struct vr::NotificationBitmap_t *"}, +{ "paramname": "pNotificationId" ,"paramtype": "vr::VRNotificationId *"} + ] +} +,{ + "classname": "vr::IVRNotifications", + "methodname": "RemoveNotification", + "returntype": "vr::EVRNotificationError", + "params": [ +{ "paramname": "notificationId" ,"paramtype": "vr::VRNotificationId"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "GetSettingsErrorNameFromEnum", + "returntype": "const char *", + "params": [ +{ "paramname": "eError" ,"paramtype": "vr::EVRSettingsError"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "Sync", + "returntype": "bool", + "params": [ +{ "paramname": "bForce" ,"paramtype": "bool"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "SetBool", + "returntype": "void", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "bValue" ,"paramtype": "bool"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "SetInt32", + "returntype": "void", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "nValue" ,"paramtype": "int32_t"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "SetFloat", + "returntype": "void", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "flValue" ,"paramtype": "float"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "SetString", + "returntype": "void", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "pchValue" ,"paramtype": "const char *"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "GetBool", + "returntype": "bool", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "GetInt32", + "returntype": "int32_t", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "GetFloat", + "returntype": "float", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "GetString", + "returntype": "void", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "pchValue" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unValueLen" ,"paramtype": "uint32_t"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "RemoveSection", + "returntype": "void", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRSettings", + "methodname": "RemoveKeyInSection", + "returntype": "void", + "params": [ +{ "paramname": "pchSection" ,"paramtype": "const char *"}, +{ "paramname": "pchSettingsKey" ,"paramtype": "const char *"}, +{ "paramname": "peError" ,"paramtype": "vr::EVRSettingsError *"} + ] +} +,{ + "classname": "vr::IVRScreenshots", + "methodname": "RequestScreenshot", + "returntype": "vr::EVRScreenshotError", + "params": [ +{ "paramname": "pOutScreenshotHandle" ,"paramtype": "vr::ScreenshotHandle_t *"}, +{ "paramname": "type" ,"paramtype": "vr::EVRScreenshotType"}, +{ "paramname": "pchPreviewFilename" ,"paramtype": "const char *"}, +{ "paramname": "pchVRFilename" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRScreenshots", + "methodname": "HookScreenshot", + "returntype": "vr::EVRScreenshotError", + "params": [ +{ "paramname": "pSupportedTypes" ,"array_count": "numTypes" ,"paramtype": "const vr::EVRScreenshotType *"}, +{ "paramname": "numTypes" ,"paramtype": "int"} + ] +} +,{ + "classname": "vr::IVRScreenshots", + "methodname": "GetScreenshotPropertyType", + "returntype": "vr::EVRScreenshotType", + "params": [ +{ "paramname": "screenshotHandle" ,"paramtype": "vr::ScreenshotHandle_t"}, +{ "paramname": "pError" ,"paramtype": "vr::EVRScreenshotError *"} + ] +} +,{ + "classname": "vr::IVRScreenshots", + "methodname": "GetScreenshotPropertyFilename", + "returntype": "uint32_t", + "params": [ +{ "paramname": "screenshotHandle" ,"paramtype": "vr::ScreenshotHandle_t"}, +{ "paramname": "filenameType" ,"paramtype": "vr::EVRScreenshotPropertyFilenames"}, +{ "paramname": "pchFilename" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "cchFilename" ,"paramtype": "uint32_t"}, +{ "paramname": "pError" ,"paramtype": "vr::EVRScreenshotError *"} + ] +} +,{ + "classname": "vr::IVRScreenshots", + "methodname": "UpdateScreenshotProgress", + "returntype": "vr::EVRScreenshotError", + "params": [ +{ "paramname": "screenshotHandle" ,"paramtype": "vr::ScreenshotHandle_t"}, +{ "paramname": "flProgress" ,"paramtype": "float"} + ] +} +,{ + "classname": "vr::IVRScreenshots", + "methodname": "TakeStereoScreenshot", + "returntype": "vr::EVRScreenshotError", + "params": [ +{ "paramname": "pOutScreenshotHandle" ,"paramtype": "vr::ScreenshotHandle_t *"}, +{ "paramname": "pchPreviewFilename" ,"paramtype": "const char *"}, +{ "paramname": "pchVRFilename" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRScreenshots", + "methodname": "SubmitScreenshot", + "returntype": "vr::EVRScreenshotError", + "params": [ +{ "paramname": "screenshotHandle" ,"paramtype": "vr::ScreenshotHandle_t"}, +{ "paramname": "type" ,"paramtype": "vr::EVRScreenshotType"}, +{ "paramname": "pchSourcePreviewFilename" ,"paramtype": "const char *"}, +{ "paramname": "pchSourceVRFilename" ,"paramtype": "const char *"} + ] +} +,{ + "classname": "vr::IVRResources", + "methodname": "LoadSharedResource", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchResourceName" ,"paramtype": "const char *"}, +{ "paramname": "pchBuffer" ,"paramtype": "char *"}, +{ "paramname": "unBufferLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRResources", + "methodname": "GetResourceFullPath", + "returntype": "uint32_t", + "params": [ +{ "paramname": "pchResourceName" ,"paramtype": "const char *"}, +{ "paramname": "pchResourceTypeDirectory" ,"paramtype": "const char *"}, +{ "paramname": "pchPathBuffer" ,"paramtype": "char *"}, +{ "paramname": "unBufferLen" ,"paramtype": "uint32_t"} + ] +} +,{ + "classname": "vr::IVRDriverManager", + "methodname": "GetDriverCount", + "returntype": "uint32_t" +} +,{ + "classname": "vr::IVRDriverManager", + "methodname": "GetDriverName", + "returntype": "uint32_t", + "params": [ +{ "paramname": "nDriver" ,"paramtype": "vr::DriverId_t"}, +{ "paramname": "pchValue" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"} + ] +} +] +} \ No newline at end of file diff --git a/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Headers/openvr_capi.h b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Headers/openvr_capi.h new file mode 100644 index 000000000..a6685e579 --- /dev/null +++ b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Headers/openvr_capi.h @@ -0,0 +1,1918 @@ +//======= Copyright (c) Valve Corporation, All rights reserved. =============== +// +// Purpose: Header for flatted SteamAPI. Use this for binding to other languages. +// This file is auto-generated, do not edit it. +// +//============================================================================= + +#ifndef __OPENVR_API_FLAT_H__ +#define __OPENVR_API_FLAT_H__ +#if defined( _WIN32 ) || defined( __clang__ ) +#pragma once +#endif + +#ifdef __cplusplus +#define EXTERN_C extern "C" +#else +#define EXTERN_C +#endif + +#if defined( _WIN32 ) +#define OPENVR_FNTABLE_CALLTYPE __stdcall +#else +#define OPENVR_FNTABLE_CALLTYPE +#endif + +// OPENVR API export macro +#if defined( _WIN32 ) && !defined( _X360 ) + #if defined( OPENVR_API_EXPORTS ) + #define S_API EXTERN_C __declspec( dllexport ) + #elif defined( OPENVR_API_NODLL ) + #define S_API EXTERN_C + #else + #define S_API extern "C" __declspec( dllimport ) + #endif // OPENVR_API_EXPORTS +#elif defined( __GNUC__ ) + #if defined( OPENVR_API_EXPORTS ) + #define S_API EXTERN_C __attribute__ ((visibility("default"))) + #else + #define S_API EXTERN_C + #endif // OPENVR_API_EXPORTS +#else // !WIN32 + #if defined( OPENVR_API_EXPORTS ) + #define S_API EXTERN_C + #else + #define S_API EXTERN_C + #endif // OPENVR_API_EXPORTS +#endif + +#include + +#if defined( __WIN32 ) +typedef char bool; +#else +#include +#endif + +typedef uint64_t PropertyContainerHandle_t; +typedef uint32_t PropertyTypeTag_t; + + +// OpenVR Constants + +static const unsigned int k_nDriverNone = 4294967295; +static const unsigned int k_unMaxDriverDebugResponseSize = 32768; +static const unsigned int k_unTrackedDeviceIndex_Hmd = 0; +static const unsigned int k_unMaxTrackedDeviceCount = 16; +static const unsigned int k_unTrackedDeviceIndexOther = 4294967294; +static const unsigned int k_unTrackedDeviceIndexInvalid = 4294967295; +static const unsigned long k_ulInvalidPropertyContainer = 0; +static const unsigned int k_unInvalidPropertyTag = 0; +static const unsigned int k_unFloatPropertyTag = 1; +static const unsigned int k_unInt32PropertyTag = 2; +static const unsigned int k_unUint64PropertyTag = 3; +static const unsigned int k_unBoolPropertyTag = 4; +static const unsigned int k_unStringPropertyTag = 5; +static const unsigned int k_unHmdMatrix34PropertyTag = 20; +static const unsigned int k_unHmdMatrix44PropertyTag = 21; +static const unsigned int k_unHmdVector3PropertyTag = 22; +static const unsigned int k_unHmdVector4PropertyTag = 23; +static const unsigned int k_unHiddenAreaPropertyTag = 30; +static const unsigned int k_unOpenVRInternalReserved_Start = 1000; +static const unsigned int k_unOpenVRInternalReserved_End = 10000; +static const unsigned int k_unMaxPropertyStringSize = 32768; +static const unsigned int k_unControllerStateAxisCount = 5; +static const unsigned long k_ulOverlayHandleInvalid = 0; +static const unsigned int k_unScreenshotHandleInvalid = 0; +static const char * IVRSystem_Version = "IVRSystem_016"; +static const char * IVRExtendedDisplay_Version = "IVRExtendedDisplay_001"; +static const char * IVRTrackedCamera_Version = "IVRTrackedCamera_003"; +static const unsigned int k_unMaxApplicationKeyLength = 128; +static const char * k_pch_MimeType_HomeApp = "vr/home"; +static const char * k_pch_MimeType_GameTheater = "vr/game_theater"; +static const char * IVRApplications_Version = "IVRApplications_006"; +static const char * IVRChaperone_Version = "IVRChaperone_003"; +static const char * IVRChaperoneSetup_Version = "IVRChaperoneSetup_005"; +static const char * IVRCompositor_Version = "IVRCompositor_020"; +static const unsigned int k_unVROverlayMaxKeyLength = 128; +static const unsigned int k_unVROverlayMaxNameLength = 128; +static const unsigned int k_unMaxOverlayCount = 64; +static const unsigned int k_unMaxOverlayIntersectionMaskPrimitivesCount = 32; +static const char * IVROverlay_Version = "IVROverlay_016"; +static const char * k_pch_Controller_Component_GDC2015 = "gdc2015"; +static const char * k_pch_Controller_Component_Base = "base"; +static const char * k_pch_Controller_Component_Tip = "tip"; +static const char * k_pch_Controller_Component_HandGrip = "handgrip"; +static const char * k_pch_Controller_Component_Status = "status"; +static const char * IVRRenderModels_Version = "IVRRenderModels_005"; +static const unsigned int k_unNotificationTextMaxSize = 256; +static const char * IVRNotifications_Version = "IVRNotifications_002"; +static const unsigned int k_unMaxSettingsKeyLength = 128; +static const char * IVRSettings_Version = "IVRSettings_002"; +static const char * k_pch_SteamVR_Section = "steamvr"; +static const char * k_pch_SteamVR_RequireHmd_String = "requireHmd"; +static const char * k_pch_SteamVR_ForcedDriverKey_String = "forcedDriver"; +static const char * k_pch_SteamVR_ForcedHmdKey_String = "forcedHmd"; +static const char * k_pch_SteamVR_DisplayDebug_Bool = "displayDebug"; +static const char * k_pch_SteamVR_DebugProcessPipe_String = "debugProcessPipe"; +static const char * k_pch_SteamVR_DisplayDebugX_Int32 = "displayDebugX"; +static const char * k_pch_SteamVR_DisplayDebugY_Int32 = "displayDebugY"; +static const char * k_pch_SteamVR_SendSystemButtonToAllApps_Bool = "sendSystemButtonToAllApps"; +static const char * k_pch_SteamVR_LogLevel_Int32 = "loglevel"; +static const char * k_pch_SteamVR_IPD_Float = "ipd"; +static const char * k_pch_SteamVR_Background_String = "background"; +static const char * k_pch_SteamVR_BackgroundUseDomeProjection_Bool = "backgroundUseDomeProjection"; +static const char * k_pch_SteamVR_BackgroundCameraHeight_Float = "backgroundCameraHeight"; +static const char * k_pch_SteamVR_BackgroundDomeRadius_Float = "backgroundDomeRadius"; +static const char * k_pch_SteamVR_GridColor_String = "gridColor"; +static const char * k_pch_SteamVR_PlayAreaColor_String = "playAreaColor"; +static const char * k_pch_SteamVR_ShowStage_Bool = "showStage"; +static const char * k_pch_SteamVR_ActivateMultipleDrivers_Bool = "activateMultipleDrivers"; +static const char * k_pch_SteamVR_DirectMode_Bool = "directMode"; +static const char * k_pch_SteamVR_DirectModeEdidVid_Int32 = "directModeEdidVid"; +static const char * k_pch_SteamVR_DirectModeEdidPid_Int32 = "directModeEdidPid"; +static const char * k_pch_SteamVR_UsingSpeakers_Bool = "usingSpeakers"; +static const char * k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float = "speakersForwardYawOffsetDegrees"; +static const char * k_pch_SteamVR_BaseStationPowerManagement_Bool = "basestationPowerManagement"; +static const char * k_pch_SteamVR_NeverKillProcesses_Bool = "neverKillProcesses"; +static const char * k_pch_SteamVR_SupersampleScale_Float = "supersampleScale"; +static const char * k_pch_SteamVR_AllowAsyncReprojection_Bool = "allowAsyncReprojection"; +static const char * k_pch_SteamVR_AllowReprojection_Bool = "allowInterleavedReprojection"; +static const char * k_pch_SteamVR_ForceReprojection_Bool = "forceReprojection"; +static const char * k_pch_SteamVR_ForceFadeOnBadTracking_Bool = "forceFadeOnBadTracking"; +static const char * k_pch_SteamVR_DefaultMirrorView_Int32 = "defaultMirrorView"; +static const char * k_pch_SteamVR_ShowMirrorView_Bool = "showMirrorView"; +static const char * k_pch_SteamVR_MirrorViewGeometry_String = "mirrorViewGeometry"; +static const char * k_pch_SteamVR_StartMonitorFromAppLaunch = "startMonitorFromAppLaunch"; +static const char * k_pch_SteamVR_StartCompositorFromAppLaunch_Bool = "startCompositorFromAppLaunch"; +static const char * k_pch_SteamVR_StartDashboardFromAppLaunch_Bool = "startDashboardFromAppLaunch"; +static const char * k_pch_SteamVR_StartOverlayAppsFromDashboard_Bool = "startOverlayAppsFromDashboard"; +static const char * k_pch_SteamVR_EnableHomeApp = "enableHomeApp"; +static const char * k_pch_SteamVR_CycleBackgroundImageTimeSec_Int32 = "CycleBackgroundImageTimeSec"; +static const char * k_pch_SteamVR_RetailDemo_Bool = "retailDemo"; +static const char * k_pch_SteamVR_IpdOffset_Float = "ipdOffset"; +static const char * k_pch_SteamVR_AllowSupersampleFiltering_Bool = "allowSupersampleFiltering"; +static const char * k_pch_Lighthouse_Section = "driver_lighthouse"; +static const char * k_pch_Lighthouse_DisableIMU_Bool = "disableimu"; +static const char * k_pch_Lighthouse_UseDisambiguation_String = "usedisambiguation"; +static const char * k_pch_Lighthouse_DisambiguationDebug_Int32 = "disambiguationdebug"; +static const char * k_pch_Lighthouse_PrimaryBasestation_Int32 = "primarybasestation"; +static const char * k_pch_Lighthouse_DBHistory_Bool = "dbhistory"; +static const char * k_pch_Null_Section = "driver_null"; +static const char * k_pch_Null_SerialNumber_String = "serialNumber"; +static const char * k_pch_Null_ModelNumber_String = "modelNumber"; +static const char * k_pch_Null_WindowX_Int32 = "windowX"; +static const char * k_pch_Null_WindowY_Int32 = "windowY"; +static const char * k_pch_Null_WindowWidth_Int32 = "windowWidth"; +static const char * k_pch_Null_WindowHeight_Int32 = "windowHeight"; +static const char * k_pch_Null_RenderWidth_Int32 = "renderWidth"; +static const char * k_pch_Null_RenderHeight_Int32 = "renderHeight"; +static const char * k_pch_Null_SecondsFromVsyncToPhotons_Float = "secondsFromVsyncToPhotons"; +static const char * k_pch_Null_DisplayFrequency_Float = "displayFrequency"; +static const char * k_pch_UserInterface_Section = "userinterface"; +static const char * k_pch_UserInterface_StatusAlwaysOnTop_Bool = "StatusAlwaysOnTop"; +static const char * k_pch_UserInterface_MinimizeToTray_Bool = "MinimizeToTray"; +static const char * k_pch_UserInterface_Screenshots_Bool = "screenshots"; +static const char * k_pch_UserInterface_ScreenshotType_Int = "screenshotType"; +static const char * k_pch_Notifications_Section = "notifications"; +static const char * k_pch_Notifications_DoNotDisturb_Bool = "DoNotDisturb"; +static const char * k_pch_Keyboard_Section = "keyboard"; +static const char * k_pch_Keyboard_TutorialCompletions = "TutorialCompletions"; +static const char * k_pch_Keyboard_ScaleX = "ScaleX"; +static const char * k_pch_Keyboard_ScaleY = "ScaleY"; +static const char * k_pch_Keyboard_OffsetLeftX = "OffsetLeftX"; +static const char * k_pch_Keyboard_OffsetRightX = "OffsetRightX"; +static const char * k_pch_Keyboard_OffsetY = "OffsetY"; +static const char * k_pch_Keyboard_Smoothing = "Smoothing"; +static const char * k_pch_Perf_Section = "perfcheck"; +static const char * k_pch_Perf_HeuristicActive_Bool = "heuristicActive"; +static const char * k_pch_Perf_NotifyInHMD_Bool = "warnInHMD"; +static const char * k_pch_Perf_NotifyOnlyOnce_Bool = "warnOnlyOnce"; +static const char * k_pch_Perf_AllowTimingStore_Bool = "allowTimingStore"; +static const char * k_pch_Perf_SaveTimingsOnExit_Bool = "saveTimingsOnExit"; +static const char * k_pch_Perf_TestData_Float = "perfTestData"; +static const char * k_pch_Perf_LinuxGPUProfiling_Bool = "linuxGPUProfiling"; +static const char * k_pch_CollisionBounds_Section = "collisionBounds"; +static const char * k_pch_CollisionBounds_Style_Int32 = "CollisionBoundsStyle"; +static const char * k_pch_CollisionBounds_GroundPerimeterOn_Bool = "CollisionBoundsGroundPerimeterOn"; +static const char * k_pch_CollisionBounds_CenterMarkerOn_Bool = "CollisionBoundsCenterMarkerOn"; +static const char * k_pch_CollisionBounds_PlaySpaceOn_Bool = "CollisionBoundsPlaySpaceOn"; +static const char * k_pch_CollisionBounds_FadeDistance_Float = "CollisionBoundsFadeDistance"; +static const char * k_pch_CollisionBounds_ColorGammaR_Int32 = "CollisionBoundsColorGammaR"; +static const char * k_pch_CollisionBounds_ColorGammaG_Int32 = "CollisionBoundsColorGammaG"; +static const char * k_pch_CollisionBounds_ColorGammaB_Int32 = "CollisionBoundsColorGammaB"; +static const char * k_pch_CollisionBounds_ColorGammaA_Int32 = "CollisionBoundsColorGammaA"; +static const char * k_pch_Camera_Section = "camera"; +static const char * k_pch_Camera_EnableCamera_Bool = "enableCamera"; +static const char * k_pch_Camera_EnableCameraInDashboard_Bool = "enableCameraInDashboard"; +static const char * k_pch_Camera_EnableCameraForCollisionBounds_Bool = "enableCameraForCollisionBounds"; +static const char * k_pch_Camera_EnableCameraForRoomView_Bool = "enableCameraForRoomView"; +static const char * k_pch_Camera_BoundsColorGammaR_Int32 = "cameraBoundsColorGammaR"; +static const char * k_pch_Camera_BoundsColorGammaG_Int32 = "cameraBoundsColorGammaG"; +static const char * k_pch_Camera_BoundsColorGammaB_Int32 = "cameraBoundsColorGammaB"; +static const char * k_pch_Camera_BoundsColorGammaA_Int32 = "cameraBoundsColorGammaA"; +static const char * k_pch_Camera_BoundsStrength_Int32 = "cameraBoundsStrength"; +static const char * k_pch_audio_Section = "audio"; +static const char * k_pch_audio_OnPlaybackDevice_String = "onPlaybackDevice"; +static const char * k_pch_audio_OnRecordDevice_String = "onRecordDevice"; +static const char * k_pch_audio_OnPlaybackMirrorDevice_String = "onPlaybackMirrorDevice"; +static const char * k_pch_audio_OffPlaybackDevice_String = "offPlaybackDevice"; +static const char * k_pch_audio_OffRecordDevice_String = "offRecordDevice"; +static const char * k_pch_audio_VIVEHDMIGain = "viveHDMIGain"; +static const char * k_pch_Power_Section = "power"; +static const char * k_pch_Power_PowerOffOnExit_Bool = "powerOffOnExit"; +static const char * k_pch_Power_TurnOffScreensTimeout_Float = "turnOffScreensTimeout"; +static const char * k_pch_Power_TurnOffControllersTimeout_Float = "turnOffControllersTimeout"; +static const char * k_pch_Power_ReturnToWatchdogTimeout_Float = "returnToWatchdogTimeout"; +static const char * k_pch_Power_AutoLaunchSteamVROnButtonPress = "autoLaunchSteamVROnButtonPress"; +static const char * k_pch_Dashboard_Section = "dashboard"; +static const char * k_pch_Dashboard_EnableDashboard_Bool = "enableDashboard"; +static const char * k_pch_Dashboard_ArcadeMode_Bool = "arcadeMode"; +static const char * k_pch_modelskin_Section = "modelskins"; +static const char * k_pch_Driver_Enable_Bool = "enable"; +static const char * IVRScreenshots_Version = "IVRScreenshots_001"; +static const char * IVRResources_Version = "IVRResources_001"; +static const char * IVRDriverManager_Version = "IVRDriverManager_001"; + +// OpenVR Enums + +typedef enum EVREye +{ + EVREye_Eye_Left = 0, + EVREye_Eye_Right = 1, +} EVREye; + +typedef enum ETextureType +{ + ETextureType_TextureType_DirectX = 0, + ETextureType_TextureType_OpenGL = 1, + ETextureType_TextureType_Vulkan = 2, + ETextureType_TextureType_IOSurface = 3, + ETextureType_TextureType_DirectX12 = 4, +} ETextureType; + +typedef enum EColorSpace +{ + EColorSpace_ColorSpace_Auto = 0, + EColorSpace_ColorSpace_Gamma = 1, + EColorSpace_ColorSpace_Linear = 2, +} EColorSpace; + +typedef enum ETrackingResult +{ + ETrackingResult_TrackingResult_Uninitialized = 1, + ETrackingResult_TrackingResult_Calibrating_InProgress = 100, + ETrackingResult_TrackingResult_Calibrating_OutOfRange = 101, + ETrackingResult_TrackingResult_Running_OK = 200, + ETrackingResult_TrackingResult_Running_OutOfRange = 201, +} ETrackingResult; + +typedef enum ETrackedDeviceClass +{ + ETrackedDeviceClass_TrackedDeviceClass_Invalid = 0, + ETrackedDeviceClass_TrackedDeviceClass_HMD = 1, + ETrackedDeviceClass_TrackedDeviceClass_Controller = 2, + ETrackedDeviceClass_TrackedDeviceClass_GenericTracker = 3, + ETrackedDeviceClass_TrackedDeviceClass_TrackingReference = 4, + ETrackedDeviceClass_TrackedDeviceClass_DisplayRedirect = 5, +} ETrackedDeviceClass; + +typedef enum ETrackedControllerRole +{ + ETrackedControllerRole_TrackedControllerRole_Invalid = 0, + ETrackedControllerRole_TrackedControllerRole_LeftHand = 1, + ETrackedControllerRole_TrackedControllerRole_RightHand = 2, +} ETrackedControllerRole; + +typedef enum ETrackingUniverseOrigin +{ + ETrackingUniverseOrigin_TrackingUniverseSeated = 0, + ETrackingUniverseOrigin_TrackingUniverseStanding = 1, + ETrackingUniverseOrigin_TrackingUniverseRawAndUncalibrated = 2, +} ETrackingUniverseOrigin; + +typedef enum ETrackedDeviceProperty +{ + ETrackedDeviceProperty_Prop_Invalid = 0, + ETrackedDeviceProperty_Prop_TrackingSystemName_String = 1000, + ETrackedDeviceProperty_Prop_ModelNumber_String = 1001, + ETrackedDeviceProperty_Prop_SerialNumber_String = 1002, + ETrackedDeviceProperty_Prop_RenderModelName_String = 1003, + ETrackedDeviceProperty_Prop_WillDriftInYaw_Bool = 1004, + ETrackedDeviceProperty_Prop_ManufacturerName_String = 1005, + ETrackedDeviceProperty_Prop_TrackingFirmwareVersion_String = 1006, + ETrackedDeviceProperty_Prop_HardwareRevision_String = 1007, + ETrackedDeviceProperty_Prop_AllWirelessDongleDescriptions_String = 1008, + ETrackedDeviceProperty_Prop_ConnectedWirelessDongle_String = 1009, + ETrackedDeviceProperty_Prop_DeviceIsWireless_Bool = 1010, + ETrackedDeviceProperty_Prop_DeviceIsCharging_Bool = 1011, + ETrackedDeviceProperty_Prop_DeviceBatteryPercentage_Float = 1012, + ETrackedDeviceProperty_Prop_StatusDisplayTransform_Matrix34 = 1013, + ETrackedDeviceProperty_Prop_Firmware_UpdateAvailable_Bool = 1014, + ETrackedDeviceProperty_Prop_Firmware_ManualUpdate_Bool = 1015, + ETrackedDeviceProperty_Prop_Firmware_ManualUpdateURL_String = 1016, + ETrackedDeviceProperty_Prop_HardwareRevision_Uint64 = 1017, + ETrackedDeviceProperty_Prop_FirmwareVersion_Uint64 = 1018, + ETrackedDeviceProperty_Prop_FPGAVersion_Uint64 = 1019, + ETrackedDeviceProperty_Prop_VRCVersion_Uint64 = 1020, + ETrackedDeviceProperty_Prop_RadioVersion_Uint64 = 1021, + ETrackedDeviceProperty_Prop_DongleVersion_Uint64 = 1022, + ETrackedDeviceProperty_Prop_BlockServerShutdown_Bool = 1023, + ETrackedDeviceProperty_Prop_CanUnifyCoordinateSystemWithHmd_Bool = 1024, + ETrackedDeviceProperty_Prop_ContainsProximitySensor_Bool = 1025, + ETrackedDeviceProperty_Prop_DeviceProvidesBatteryStatus_Bool = 1026, + ETrackedDeviceProperty_Prop_DeviceCanPowerOff_Bool = 1027, + ETrackedDeviceProperty_Prop_Firmware_ProgrammingTarget_String = 1028, + ETrackedDeviceProperty_Prop_DeviceClass_Int32 = 1029, + ETrackedDeviceProperty_Prop_HasCamera_Bool = 1030, + ETrackedDeviceProperty_Prop_DriverVersion_String = 1031, + ETrackedDeviceProperty_Prop_Firmware_ForceUpdateRequired_Bool = 1032, + ETrackedDeviceProperty_Prop_ViveSystemButtonFixRequired_Bool = 1033, + ETrackedDeviceProperty_Prop_ParentDriver_Uint64 = 1034, + ETrackedDeviceProperty_Prop_ResourceRoot_String = 1035, + ETrackedDeviceProperty_Prop_ReportsTimeSinceVSync_Bool = 2000, + ETrackedDeviceProperty_Prop_SecondsFromVsyncToPhotons_Float = 2001, + ETrackedDeviceProperty_Prop_DisplayFrequency_Float = 2002, + ETrackedDeviceProperty_Prop_UserIpdMeters_Float = 2003, + ETrackedDeviceProperty_Prop_CurrentUniverseId_Uint64 = 2004, + ETrackedDeviceProperty_Prop_PreviousUniverseId_Uint64 = 2005, + ETrackedDeviceProperty_Prop_DisplayFirmwareVersion_Uint64 = 2006, + ETrackedDeviceProperty_Prop_IsOnDesktop_Bool = 2007, + ETrackedDeviceProperty_Prop_DisplayMCType_Int32 = 2008, + ETrackedDeviceProperty_Prop_DisplayMCOffset_Float = 2009, + ETrackedDeviceProperty_Prop_DisplayMCScale_Float = 2010, + ETrackedDeviceProperty_Prop_EdidVendorID_Int32 = 2011, + ETrackedDeviceProperty_Prop_DisplayMCImageLeft_String = 2012, + ETrackedDeviceProperty_Prop_DisplayMCImageRight_String = 2013, + ETrackedDeviceProperty_Prop_DisplayGCBlackClamp_Float = 2014, + ETrackedDeviceProperty_Prop_EdidProductID_Int32 = 2015, + ETrackedDeviceProperty_Prop_CameraToHeadTransform_Matrix34 = 2016, + ETrackedDeviceProperty_Prop_DisplayGCType_Int32 = 2017, + ETrackedDeviceProperty_Prop_DisplayGCOffset_Float = 2018, + ETrackedDeviceProperty_Prop_DisplayGCScale_Float = 2019, + ETrackedDeviceProperty_Prop_DisplayGCPrescale_Float = 2020, + ETrackedDeviceProperty_Prop_DisplayGCImage_String = 2021, + ETrackedDeviceProperty_Prop_LensCenterLeftU_Float = 2022, + ETrackedDeviceProperty_Prop_LensCenterLeftV_Float = 2023, + ETrackedDeviceProperty_Prop_LensCenterRightU_Float = 2024, + ETrackedDeviceProperty_Prop_LensCenterRightV_Float = 2025, + ETrackedDeviceProperty_Prop_UserHeadToEyeDepthMeters_Float = 2026, + ETrackedDeviceProperty_Prop_CameraFirmwareVersion_Uint64 = 2027, + ETrackedDeviceProperty_Prop_CameraFirmwareDescription_String = 2028, + ETrackedDeviceProperty_Prop_DisplayFPGAVersion_Uint64 = 2029, + ETrackedDeviceProperty_Prop_DisplayBootloaderVersion_Uint64 = 2030, + ETrackedDeviceProperty_Prop_DisplayHardwareVersion_Uint64 = 2031, + ETrackedDeviceProperty_Prop_AudioFirmwareVersion_Uint64 = 2032, + ETrackedDeviceProperty_Prop_CameraCompatibilityMode_Int32 = 2033, + ETrackedDeviceProperty_Prop_ScreenshotHorizontalFieldOfViewDegrees_Float = 2034, + ETrackedDeviceProperty_Prop_ScreenshotVerticalFieldOfViewDegrees_Float = 2035, + ETrackedDeviceProperty_Prop_DisplaySuppressed_Bool = 2036, + ETrackedDeviceProperty_Prop_DisplayAllowNightMode_Bool = 2037, + ETrackedDeviceProperty_Prop_DisplayMCImageWidth_Int32 = 2038, + ETrackedDeviceProperty_Prop_DisplayMCImageHeight_Int32 = 2039, + ETrackedDeviceProperty_Prop_DisplayMCImageNumChannels_Int32 = 2040, + ETrackedDeviceProperty_Prop_DisplayMCImageData_Binary = 2041, + ETrackedDeviceProperty_Prop_SecondsFromPhotonsToVblank_Float = 2042, + ETrackedDeviceProperty_Prop_DriverDirectModeSendsVsyncEvents_Bool = 2043, + ETrackedDeviceProperty_Prop_DisplayDebugMode_Bool = 2044, + ETrackedDeviceProperty_Prop_GraphicsAdapterLuid_Uint64 = 2045, + ETrackedDeviceProperty_Prop_AttachedDeviceId_String = 3000, + ETrackedDeviceProperty_Prop_SupportedButtons_Uint64 = 3001, + ETrackedDeviceProperty_Prop_Axis0Type_Int32 = 3002, + ETrackedDeviceProperty_Prop_Axis1Type_Int32 = 3003, + ETrackedDeviceProperty_Prop_Axis2Type_Int32 = 3004, + ETrackedDeviceProperty_Prop_Axis3Type_Int32 = 3005, + ETrackedDeviceProperty_Prop_Axis4Type_Int32 = 3006, + ETrackedDeviceProperty_Prop_ControllerRoleHint_Int32 = 3007, + ETrackedDeviceProperty_Prop_FieldOfViewLeftDegrees_Float = 4000, + ETrackedDeviceProperty_Prop_FieldOfViewRightDegrees_Float = 4001, + ETrackedDeviceProperty_Prop_FieldOfViewTopDegrees_Float = 4002, + ETrackedDeviceProperty_Prop_FieldOfViewBottomDegrees_Float = 4003, + ETrackedDeviceProperty_Prop_TrackingRangeMinimumMeters_Float = 4004, + ETrackedDeviceProperty_Prop_TrackingRangeMaximumMeters_Float = 4005, + ETrackedDeviceProperty_Prop_ModeLabel_String = 4006, + ETrackedDeviceProperty_Prop_IconPathName_String = 5000, + ETrackedDeviceProperty_Prop_NamedIconPathDeviceOff_String = 5001, + ETrackedDeviceProperty_Prop_NamedIconPathDeviceSearching_String = 5002, + ETrackedDeviceProperty_Prop_NamedIconPathDeviceSearchingAlert_String = 5003, + ETrackedDeviceProperty_Prop_NamedIconPathDeviceReady_String = 5004, + ETrackedDeviceProperty_Prop_NamedIconPathDeviceReadyAlert_String = 5005, + ETrackedDeviceProperty_Prop_NamedIconPathDeviceNotReady_String = 5006, + ETrackedDeviceProperty_Prop_NamedIconPathDeviceStandby_String = 5007, + ETrackedDeviceProperty_Prop_NamedIconPathDeviceAlertLow_String = 5008, + ETrackedDeviceProperty_Prop_DisplayHiddenArea_Binary_Start = 5100, + ETrackedDeviceProperty_Prop_DisplayHiddenArea_Binary_End = 5150, + ETrackedDeviceProperty_Prop_UserConfigPath_String = 6000, + ETrackedDeviceProperty_Prop_InstallPath_String = 6001, + ETrackedDeviceProperty_Prop_HasDisplayComponent_Bool = 6002, + ETrackedDeviceProperty_Prop_HasControllerComponent_Bool = 6003, + ETrackedDeviceProperty_Prop_HasCameraComponent_Bool = 6004, + ETrackedDeviceProperty_Prop_HasDriverDirectModeComponent_Bool = 6005, + ETrackedDeviceProperty_Prop_HasVirtualDisplayComponent_Bool = 6006, + ETrackedDeviceProperty_Prop_VendorSpecific_Reserved_Start = 10000, + ETrackedDeviceProperty_Prop_VendorSpecific_Reserved_End = 10999, +} ETrackedDeviceProperty; + +typedef enum ETrackedPropertyError +{ + ETrackedPropertyError_TrackedProp_Success = 0, + ETrackedPropertyError_TrackedProp_WrongDataType = 1, + ETrackedPropertyError_TrackedProp_WrongDeviceClass = 2, + ETrackedPropertyError_TrackedProp_BufferTooSmall = 3, + ETrackedPropertyError_TrackedProp_UnknownProperty = 4, + ETrackedPropertyError_TrackedProp_InvalidDevice = 5, + ETrackedPropertyError_TrackedProp_CouldNotContactServer = 6, + ETrackedPropertyError_TrackedProp_ValueNotProvidedByDevice = 7, + ETrackedPropertyError_TrackedProp_StringExceedsMaximumLength = 8, + ETrackedPropertyError_TrackedProp_NotYetAvailable = 9, + ETrackedPropertyError_TrackedProp_PermissionDenied = 10, + ETrackedPropertyError_TrackedProp_InvalidOperation = 11, +} ETrackedPropertyError; + +typedef enum EVRSubmitFlags +{ + EVRSubmitFlags_Submit_Default = 0, + EVRSubmitFlags_Submit_LensDistortionAlreadyApplied = 1, + EVRSubmitFlags_Submit_GlRenderBuffer = 2, + EVRSubmitFlags_Submit_Reserved = 4, +} EVRSubmitFlags; + +typedef enum EVRState +{ + EVRState_VRState_Undefined = -1, + EVRState_VRState_Off = 0, + EVRState_VRState_Searching = 1, + EVRState_VRState_Searching_Alert = 2, + EVRState_VRState_Ready = 3, + EVRState_VRState_Ready_Alert = 4, + EVRState_VRState_NotReady = 5, + EVRState_VRState_Standby = 6, + EVRState_VRState_Ready_Alert_Low = 7, +} EVRState; + +typedef enum EVREventType +{ + EVREventType_VREvent_None = 0, + EVREventType_VREvent_TrackedDeviceActivated = 100, + EVREventType_VREvent_TrackedDeviceDeactivated = 101, + EVREventType_VREvent_TrackedDeviceUpdated = 102, + EVREventType_VREvent_TrackedDeviceUserInteractionStarted = 103, + EVREventType_VREvent_TrackedDeviceUserInteractionEnded = 104, + EVREventType_VREvent_IpdChanged = 105, + EVREventType_VREvent_EnterStandbyMode = 106, + EVREventType_VREvent_LeaveStandbyMode = 107, + EVREventType_VREvent_TrackedDeviceRoleChanged = 108, + EVREventType_VREvent_WatchdogWakeUpRequested = 109, + EVREventType_VREvent_LensDistortionChanged = 110, + EVREventType_VREvent_PropertyChanged = 111, + EVREventType_VREvent_ButtonPress = 200, + EVREventType_VREvent_ButtonUnpress = 201, + EVREventType_VREvent_ButtonTouch = 202, + EVREventType_VREvent_ButtonUntouch = 203, + EVREventType_VREvent_MouseMove = 300, + EVREventType_VREvent_MouseButtonDown = 301, + EVREventType_VREvent_MouseButtonUp = 302, + EVREventType_VREvent_FocusEnter = 303, + EVREventType_VREvent_FocusLeave = 304, + EVREventType_VREvent_Scroll = 305, + EVREventType_VREvent_TouchPadMove = 306, + EVREventType_VREvent_OverlayFocusChanged = 307, + EVREventType_VREvent_InputFocusCaptured = 400, + EVREventType_VREvent_InputFocusReleased = 401, + EVREventType_VREvent_SceneFocusLost = 402, + EVREventType_VREvent_SceneFocusGained = 403, + EVREventType_VREvent_SceneApplicationChanged = 404, + EVREventType_VREvent_SceneFocusChanged = 405, + EVREventType_VREvent_InputFocusChanged = 406, + EVREventType_VREvent_SceneApplicationSecondaryRenderingStarted = 407, + EVREventType_VREvent_HideRenderModels = 410, + EVREventType_VREvent_ShowRenderModels = 411, + EVREventType_VREvent_OverlayShown = 500, + EVREventType_VREvent_OverlayHidden = 501, + EVREventType_VREvent_DashboardActivated = 502, + EVREventType_VREvent_DashboardDeactivated = 503, + EVREventType_VREvent_DashboardThumbSelected = 504, + EVREventType_VREvent_DashboardRequested = 505, + EVREventType_VREvent_ResetDashboard = 506, + EVREventType_VREvent_RenderToast = 507, + EVREventType_VREvent_ImageLoaded = 508, + EVREventType_VREvent_ShowKeyboard = 509, + EVREventType_VREvent_HideKeyboard = 510, + EVREventType_VREvent_OverlayGamepadFocusGained = 511, + EVREventType_VREvent_OverlayGamepadFocusLost = 512, + EVREventType_VREvent_OverlaySharedTextureChanged = 513, + EVREventType_VREvent_DashboardGuideButtonDown = 514, + EVREventType_VREvent_DashboardGuideButtonUp = 515, + EVREventType_VREvent_ScreenshotTriggered = 516, + EVREventType_VREvent_ImageFailed = 517, + EVREventType_VREvent_DashboardOverlayCreated = 518, + EVREventType_VREvent_RequestScreenshot = 520, + EVREventType_VREvent_ScreenshotTaken = 521, + EVREventType_VREvent_ScreenshotFailed = 522, + EVREventType_VREvent_SubmitScreenshotToDashboard = 523, + EVREventType_VREvent_ScreenshotProgressToDashboard = 524, + EVREventType_VREvent_PrimaryDashboardDeviceChanged = 525, + EVREventType_VREvent_Notification_Shown = 600, + EVREventType_VREvent_Notification_Hidden = 601, + EVREventType_VREvent_Notification_BeginInteraction = 602, + EVREventType_VREvent_Notification_Destroyed = 603, + EVREventType_VREvent_Quit = 700, + EVREventType_VREvent_ProcessQuit = 701, + EVREventType_VREvent_QuitAborted_UserPrompt = 702, + EVREventType_VREvent_QuitAcknowledged = 703, + EVREventType_VREvent_DriverRequestedQuit = 704, + EVREventType_VREvent_ChaperoneDataHasChanged = 800, + EVREventType_VREvent_ChaperoneUniverseHasChanged = 801, + EVREventType_VREvent_ChaperoneTempDataHasChanged = 802, + EVREventType_VREvent_ChaperoneSettingsHaveChanged = 803, + EVREventType_VREvent_SeatedZeroPoseReset = 804, + EVREventType_VREvent_AudioSettingsHaveChanged = 820, + EVREventType_VREvent_BackgroundSettingHasChanged = 850, + EVREventType_VREvent_CameraSettingsHaveChanged = 851, + EVREventType_VREvent_ReprojectionSettingHasChanged = 852, + EVREventType_VREvent_ModelSkinSettingsHaveChanged = 853, + EVREventType_VREvent_EnvironmentSettingsHaveChanged = 854, + EVREventType_VREvent_PowerSettingsHaveChanged = 855, + EVREventType_VREvent_EnableHomeAppSettingsHaveChanged = 856, + EVREventType_VREvent_StatusUpdate = 900, + EVREventType_VREvent_MCImageUpdated = 1000, + EVREventType_VREvent_FirmwareUpdateStarted = 1100, + EVREventType_VREvent_FirmwareUpdateFinished = 1101, + EVREventType_VREvent_KeyboardClosed = 1200, + EVREventType_VREvent_KeyboardCharInput = 1201, + EVREventType_VREvent_KeyboardDone = 1202, + EVREventType_VREvent_ApplicationTransitionStarted = 1300, + EVREventType_VREvent_ApplicationTransitionAborted = 1301, + EVREventType_VREvent_ApplicationTransitionNewAppStarted = 1302, + EVREventType_VREvent_ApplicationListUpdated = 1303, + EVREventType_VREvent_ApplicationMimeTypeLoad = 1304, + EVREventType_VREvent_ApplicationTransitionNewAppLaunchComplete = 1305, + EVREventType_VREvent_ProcessConnected = 1306, + EVREventType_VREvent_ProcessDisconnected = 1307, + EVREventType_VREvent_Compositor_MirrorWindowShown = 1400, + EVREventType_VREvent_Compositor_MirrorWindowHidden = 1401, + EVREventType_VREvent_Compositor_ChaperoneBoundsShown = 1410, + EVREventType_VREvent_Compositor_ChaperoneBoundsHidden = 1411, + EVREventType_VREvent_TrackedCamera_StartVideoStream = 1500, + EVREventType_VREvent_TrackedCamera_StopVideoStream = 1501, + EVREventType_VREvent_TrackedCamera_PauseVideoStream = 1502, + EVREventType_VREvent_TrackedCamera_ResumeVideoStream = 1503, + EVREventType_VREvent_TrackedCamera_EditingSurface = 1550, + EVREventType_VREvent_PerformanceTest_EnableCapture = 1600, + EVREventType_VREvent_PerformanceTest_DisableCapture = 1601, + EVREventType_VREvent_PerformanceTest_FidelityLevel = 1602, + EVREventType_VREvent_MessageOverlay_Closed = 1650, + EVREventType_VREvent_VendorSpecific_Reserved_Start = 10000, + EVREventType_VREvent_VendorSpecific_Reserved_End = 19999, +} EVREventType; + +typedef enum EDeviceActivityLevel +{ + EDeviceActivityLevel_k_EDeviceActivityLevel_Unknown = -1, + EDeviceActivityLevel_k_EDeviceActivityLevel_Idle = 0, + EDeviceActivityLevel_k_EDeviceActivityLevel_UserInteraction = 1, + EDeviceActivityLevel_k_EDeviceActivityLevel_UserInteraction_Timeout = 2, + EDeviceActivityLevel_k_EDeviceActivityLevel_Standby = 3, +} EDeviceActivityLevel; + +typedef enum EVRButtonId +{ + EVRButtonId_k_EButton_System = 0, + EVRButtonId_k_EButton_ApplicationMenu = 1, + EVRButtonId_k_EButton_Grip = 2, + EVRButtonId_k_EButton_DPad_Left = 3, + EVRButtonId_k_EButton_DPad_Up = 4, + EVRButtonId_k_EButton_DPad_Right = 5, + EVRButtonId_k_EButton_DPad_Down = 6, + EVRButtonId_k_EButton_A = 7, + EVRButtonId_k_EButton_ProximitySensor = 31, + EVRButtonId_k_EButton_Axis0 = 32, + EVRButtonId_k_EButton_Axis1 = 33, + EVRButtonId_k_EButton_Axis2 = 34, + EVRButtonId_k_EButton_Axis3 = 35, + EVRButtonId_k_EButton_Axis4 = 36, + EVRButtonId_k_EButton_SteamVR_Touchpad = 32, + EVRButtonId_k_EButton_SteamVR_Trigger = 33, + EVRButtonId_k_EButton_Dashboard_Back = 2, + EVRButtonId_k_EButton_Max = 64, +} EVRButtonId; + +typedef enum EVRMouseButton +{ + EVRMouseButton_VRMouseButton_Left = 1, + EVRMouseButton_VRMouseButton_Right = 2, + EVRMouseButton_VRMouseButton_Middle = 4, +} EVRMouseButton; + +typedef enum EHiddenAreaMeshType +{ + EHiddenAreaMeshType_k_eHiddenAreaMesh_Standard = 0, + EHiddenAreaMeshType_k_eHiddenAreaMesh_Inverse = 1, + EHiddenAreaMeshType_k_eHiddenAreaMesh_LineLoop = 2, + EHiddenAreaMeshType_k_eHiddenAreaMesh_Max = 3, +} EHiddenAreaMeshType; + +typedef enum EVRControllerAxisType +{ + EVRControllerAxisType_k_eControllerAxis_None = 0, + EVRControllerAxisType_k_eControllerAxis_TrackPad = 1, + EVRControllerAxisType_k_eControllerAxis_Joystick = 2, + EVRControllerAxisType_k_eControllerAxis_Trigger = 3, +} EVRControllerAxisType; + +typedef enum EVRControllerEventOutputType +{ + EVRControllerEventOutputType_ControllerEventOutput_OSEvents = 0, + EVRControllerEventOutputType_ControllerEventOutput_VREvents = 1, +} EVRControllerEventOutputType; + +typedef enum ECollisionBoundsStyle +{ + ECollisionBoundsStyle_COLLISION_BOUNDS_STYLE_BEGINNER = 0, + ECollisionBoundsStyle_COLLISION_BOUNDS_STYLE_INTERMEDIATE = 1, + ECollisionBoundsStyle_COLLISION_BOUNDS_STYLE_SQUARES = 2, + ECollisionBoundsStyle_COLLISION_BOUNDS_STYLE_ADVANCED = 3, + ECollisionBoundsStyle_COLLISION_BOUNDS_STYLE_NONE = 4, + ECollisionBoundsStyle_COLLISION_BOUNDS_STYLE_COUNT = 5, +} ECollisionBoundsStyle; + +typedef enum EVROverlayError +{ + EVROverlayError_VROverlayError_None = 0, + EVROverlayError_VROverlayError_UnknownOverlay = 10, + EVROverlayError_VROverlayError_InvalidHandle = 11, + EVROverlayError_VROverlayError_PermissionDenied = 12, + EVROverlayError_VROverlayError_OverlayLimitExceeded = 13, + EVROverlayError_VROverlayError_WrongVisibilityType = 14, + EVROverlayError_VROverlayError_KeyTooLong = 15, + EVROverlayError_VROverlayError_NameTooLong = 16, + EVROverlayError_VROverlayError_KeyInUse = 17, + EVROverlayError_VROverlayError_WrongTransformType = 18, + EVROverlayError_VROverlayError_InvalidTrackedDevice = 19, + EVROverlayError_VROverlayError_InvalidParameter = 20, + EVROverlayError_VROverlayError_ThumbnailCantBeDestroyed = 21, + EVROverlayError_VROverlayError_ArrayTooSmall = 22, + EVROverlayError_VROverlayError_RequestFailed = 23, + EVROverlayError_VROverlayError_InvalidTexture = 24, + EVROverlayError_VROverlayError_UnableToLoadFile = 25, + EVROverlayError_VROverlayError_KeyboardAlreadyInUse = 26, + EVROverlayError_VROverlayError_NoNeighbor = 27, + EVROverlayError_VROverlayError_TooManyMaskPrimitives = 29, + EVROverlayError_VROverlayError_BadMaskPrimitive = 30, +} EVROverlayError; + +typedef enum EVRApplicationType +{ + EVRApplicationType_VRApplication_Other = 0, + EVRApplicationType_VRApplication_Scene = 1, + EVRApplicationType_VRApplication_Overlay = 2, + EVRApplicationType_VRApplication_Background = 3, + EVRApplicationType_VRApplication_Utility = 4, + EVRApplicationType_VRApplication_VRMonitor = 5, + EVRApplicationType_VRApplication_SteamWatchdog = 6, + EVRApplicationType_VRApplication_Bootstrapper = 7, + EVRApplicationType_VRApplication_Max = 8, +} EVRApplicationType; + +typedef enum EVRFirmwareError +{ + EVRFirmwareError_VRFirmwareError_None = 0, + EVRFirmwareError_VRFirmwareError_Success = 1, + EVRFirmwareError_VRFirmwareError_Fail = 2, +} EVRFirmwareError; + +typedef enum EVRNotificationError +{ + EVRNotificationError_VRNotificationError_OK = 0, + EVRNotificationError_VRNotificationError_InvalidNotificationId = 100, + EVRNotificationError_VRNotificationError_NotificationQueueFull = 101, + EVRNotificationError_VRNotificationError_InvalidOverlayHandle = 102, + EVRNotificationError_VRNotificationError_SystemWithUserValueAlreadyExists = 103, +} EVRNotificationError; + +typedef enum EVRInitError +{ + EVRInitError_VRInitError_None = 0, + EVRInitError_VRInitError_Unknown = 1, + EVRInitError_VRInitError_Init_InstallationNotFound = 100, + EVRInitError_VRInitError_Init_InstallationCorrupt = 101, + EVRInitError_VRInitError_Init_VRClientDLLNotFound = 102, + EVRInitError_VRInitError_Init_FileNotFound = 103, + EVRInitError_VRInitError_Init_FactoryNotFound = 104, + EVRInitError_VRInitError_Init_InterfaceNotFound = 105, + EVRInitError_VRInitError_Init_InvalidInterface = 106, + EVRInitError_VRInitError_Init_UserConfigDirectoryInvalid = 107, + EVRInitError_VRInitError_Init_HmdNotFound = 108, + EVRInitError_VRInitError_Init_NotInitialized = 109, + EVRInitError_VRInitError_Init_PathRegistryNotFound = 110, + EVRInitError_VRInitError_Init_NoConfigPath = 111, + EVRInitError_VRInitError_Init_NoLogPath = 112, + EVRInitError_VRInitError_Init_PathRegistryNotWritable = 113, + EVRInitError_VRInitError_Init_AppInfoInitFailed = 114, + EVRInitError_VRInitError_Init_Retry = 115, + EVRInitError_VRInitError_Init_InitCanceledByUser = 116, + EVRInitError_VRInitError_Init_AnotherAppLaunching = 117, + EVRInitError_VRInitError_Init_SettingsInitFailed = 118, + EVRInitError_VRInitError_Init_ShuttingDown = 119, + EVRInitError_VRInitError_Init_TooManyObjects = 120, + EVRInitError_VRInitError_Init_NoServerForBackgroundApp = 121, + EVRInitError_VRInitError_Init_NotSupportedWithCompositor = 122, + EVRInitError_VRInitError_Init_NotAvailableToUtilityApps = 123, + EVRInitError_VRInitError_Init_Internal = 124, + EVRInitError_VRInitError_Init_HmdDriverIdIsNone = 125, + EVRInitError_VRInitError_Init_HmdNotFoundPresenceFailed = 126, + EVRInitError_VRInitError_Init_VRMonitorNotFound = 127, + EVRInitError_VRInitError_Init_VRMonitorStartupFailed = 128, + EVRInitError_VRInitError_Init_LowPowerWatchdogNotSupported = 129, + EVRInitError_VRInitError_Init_InvalidApplicationType = 130, + EVRInitError_VRInitError_Init_NotAvailableToWatchdogApps = 131, + EVRInitError_VRInitError_Init_WatchdogDisabledInSettings = 132, + EVRInitError_VRInitError_Init_VRDashboardNotFound = 133, + EVRInitError_VRInitError_Init_VRDashboardStartupFailed = 134, + EVRInitError_VRInitError_Init_VRHomeNotFound = 135, + EVRInitError_VRInitError_Init_VRHomeStartupFailed = 136, + EVRInitError_VRInitError_Driver_Failed = 200, + EVRInitError_VRInitError_Driver_Unknown = 201, + EVRInitError_VRInitError_Driver_HmdUnknown = 202, + EVRInitError_VRInitError_Driver_NotLoaded = 203, + EVRInitError_VRInitError_Driver_RuntimeOutOfDate = 204, + EVRInitError_VRInitError_Driver_HmdInUse = 205, + EVRInitError_VRInitError_Driver_NotCalibrated = 206, + EVRInitError_VRInitError_Driver_CalibrationInvalid = 207, + EVRInitError_VRInitError_Driver_HmdDisplayNotFound = 208, + EVRInitError_VRInitError_Driver_TrackedDeviceInterfaceUnknown = 209, + EVRInitError_VRInitError_Driver_HmdDriverIdOutOfBounds = 211, + EVRInitError_VRInitError_Driver_HmdDisplayMirrored = 212, + EVRInitError_VRInitError_IPC_ServerInitFailed = 300, + EVRInitError_VRInitError_IPC_ConnectFailed = 301, + EVRInitError_VRInitError_IPC_SharedStateInitFailed = 302, + EVRInitError_VRInitError_IPC_CompositorInitFailed = 303, + EVRInitError_VRInitError_IPC_MutexInitFailed = 304, + EVRInitError_VRInitError_IPC_Failed = 305, + EVRInitError_VRInitError_IPC_CompositorConnectFailed = 306, + EVRInitError_VRInitError_IPC_CompositorInvalidConnectResponse = 307, + EVRInitError_VRInitError_IPC_ConnectFailedAfterMultipleAttempts = 308, + EVRInitError_VRInitError_Compositor_Failed = 400, + EVRInitError_VRInitError_Compositor_D3D11HardwareRequired = 401, + EVRInitError_VRInitError_Compositor_FirmwareRequiresUpdate = 402, + EVRInitError_VRInitError_Compositor_OverlayInitFailed = 403, + EVRInitError_VRInitError_Compositor_ScreenshotsInitFailed = 404, + EVRInitError_VRInitError_Compositor_UnableToCreateDevice = 405, + EVRInitError_VRInitError_VendorSpecific_UnableToConnectToOculusRuntime = 1000, + EVRInitError_VRInitError_VendorSpecific_HmdFound_CantOpenDevice = 1101, + EVRInitError_VRInitError_VendorSpecific_HmdFound_UnableToRequestConfigStart = 1102, + EVRInitError_VRInitError_VendorSpecific_HmdFound_NoStoredConfig = 1103, + EVRInitError_VRInitError_VendorSpecific_HmdFound_ConfigTooBig = 1104, + EVRInitError_VRInitError_VendorSpecific_HmdFound_ConfigTooSmall = 1105, + EVRInitError_VRInitError_VendorSpecific_HmdFound_UnableToInitZLib = 1106, + EVRInitError_VRInitError_VendorSpecific_HmdFound_CantReadFirmwareVersion = 1107, + EVRInitError_VRInitError_VendorSpecific_HmdFound_UnableToSendUserDataStart = 1108, + EVRInitError_VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataStart = 1109, + EVRInitError_VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataNext = 1110, + EVRInitError_VRInitError_VendorSpecific_HmdFound_UserDataAddressRange = 1111, + EVRInitError_VRInitError_VendorSpecific_HmdFound_UserDataError = 1112, + EVRInitError_VRInitError_VendorSpecific_HmdFound_ConfigFailedSanityCheck = 1113, + EVRInitError_VRInitError_Steam_SteamInstallationNotFound = 2000, +} EVRInitError; + +typedef enum EVRScreenshotType +{ + EVRScreenshotType_VRScreenshotType_None = 0, + EVRScreenshotType_VRScreenshotType_Mono = 1, + EVRScreenshotType_VRScreenshotType_Stereo = 2, + EVRScreenshotType_VRScreenshotType_Cubemap = 3, + EVRScreenshotType_VRScreenshotType_MonoPanorama = 4, + EVRScreenshotType_VRScreenshotType_StereoPanorama = 5, +} EVRScreenshotType; + +typedef enum EVRScreenshotPropertyFilenames +{ + EVRScreenshotPropertyFilenames_VRScreenshotPropertyFilenames_Preview = 0, + EVRScreenshotPropertyFilenames_VRScreenshotPropertyFilenames_VR = 1, +} EVRScreenshotPropertyFilenames; + +typedef enum EVRTrackedCameraError +{ + EVRTrackedCameraError_VRTrackedCameraError_None = 0, + EVRTrackedCameraError_VRTrackedCameraError_OperationFailed = 100, + EVRTrackedCameraError_VRTrackedCameraError_InvalidHandle = 101, + EVRTrackedCameraError_VRTrackedCameraError_InvalidFrameHeaderVersion = 102, + EVRTrackedCameraError_VRTrackedCameraError_OutOfHandles = 103, + EVRTrackedCameraError_VRTrackedCameraError_IPCFailure = 104, + EVRTrackedCameraError_VRTrackedCameraError_NotSupportedForThisDevice = 105, + EVRTrackedCameraError_VRTrackedCameraError_SharedMemoryFailure = 106, + EVRTrackedCameraError_VRTrackedCameraError_FrameBufferingFailure = 107, + EVRTrackedCameraError_VRTrackedCameraError_StreamSetupFailure = 108, + EVRTrackedCameraError_VRTrackedCameraError_InvalidGLTextureId = 109, + EVRTrackedCameraError_VRTrackedCameraError_InvalidSharedTextureHandle = 110, + EVRTrackedCameraError_VRTrackedCameraError_FailedToGetGLTextureId = 111, + EVRTrackedCameraError_VRTrackedCameraError_SharedTextureFailure = 112, + EVRTrackedCameraError_VRTrackedCameraError_NoFrameAvailable = 113, + EVRTrackedCameraError_VRTrackedCameraError_InvalidArgument = 114, + EVRTrackedCameraError_VRTrackedCameraError_InvalidFrameBufferSize = 115, +} EVRTrackedCameraError; + +typedef enum EVRTrackedCameraFrameType +{ + EVRTrackedCameraFrameType_VRTrackedCameraFrameType_Distorted = 0, + EVRTrackedCameraFrameType_VRTrackedCameraFrameType_Undistorted = 1, + EVRTrackedCameraFrameType_VRTrackedCameraFrameType_MaximumUndistorted = 2, + EVRTrackedCameraFrameType_MAX_CAMERA_FRAME_TYPES = 3, +} EVRTrackedCameraFrameType; + +typedef enum EVRApplicationError +{ + EVRApplicationError_VRApplicationError_None = 0, + EVRApplicationError_VRApplicationError_AppKeyAlreadyExists = 100, + EVRApplicationError_VRApplicationError_NoManifest = 101, + EVRApplicationError_VRApplicationError_NoApplication = 102, + EVRApplicationError_VRApplicationError_InvalidIndex = 103, + EVRApplicationError_VRApplicationError_UnknownApplication = 104, + EVRApplicationError_VRApplicationError_IPCFailed = 105, + EVRApplicationError_VRApplicationError_ApplicationAlreadyRunning = 106, + EVRApplicationError_VRApplicationError_InvalidManifest = 107, + EVRApplicationError_VRApplicationError_InvalidApplication = 108, + EVRApplicationError_VRApplicationError_LaunchFailed = 109, + EVRApplicationError_VRApplicationError_ApplicationAlreadyStarting = 110, + EVRApplicationError_VRApplicationError_LaunchInProgress = 111, + EVRApplicationError_VRApplicationError_OldApplicationQuitting = 112, + EVRApplicationError_VRApplicationError_TransitionAborted = 113, + EVRApplicationError_VRApplicationError_IsTemplate = 114, + EVRApplicationError_VRApplicationError_BufferTooSmall = 200, + EVRApplicationError_VRApplicationError_PropertyNotSet = 201, + EVRApplicationError_VRApplicationError_UnknownProperty = 202, + EVRApplicationError_VRApplicationError_InvalidParameter = 203, +} EVRApplicationError; + +typedef enum EVRApplicationProperty +{ + EVRApplicationProperty_VRApplicationProperty_Name_String = 0, + EVRApplicationProperty_VRApplicationProperty_LaunchType_String = 11, + EVRApplicationProperty_VRApplicationProperty_WorkingDirectory_String = 12, + EVRApplicationProperty_VRApplicationProperty_BinaryPath_String = 13, + EVRApplicationProperty_VRApplicationProperty_Arguments_String = 14, + EVRApplicationProperty_VRApplicationProperty_URL_String = 15, + EVRApplicationProperty_VRApplicationProperty_Description_String = 50, + EVRApplicationProperty_VRApplicationProperty_NewsURL_String = 51, + EVRApplicationProperty_VRApplicationProperty_ImagePath_String = 52, + EVRApplicationProperty_VRApplicationProperty_Source_String = 53, + EVRApplicationProperty_VRApplicationProperty_IsDashboardOverlay_Bool = 60, + EVRApplicationProperty_VRApplicationProperty_IsTemplate_Bool = 61, + EVRApplicationProperty_VRApplicationProperty_IsInstanced_Bool = 62, + EVRApplicationProperty_VRApplicationProperty_IsInternal_Bool = 63, + EVRApplicationProperty_VRApplicationProperty_LastLaunchTime_Uint64 = 70, +} EVRApplicationProperty; + +typedef enum EVRApplicationTransitionState +{ + EVRApplicationTransitionState_VRApplicationTransition_None = 0, + EVRApplicationTransitionState_VRApplicationTransition_OldAppQuitSent = 10, + EVRApplicationTransitionState_VRApplicationTransition_WaitingForExternalLaunch = 11, + EVRApplicationTransitionState_VRApplicationTransition_NewAppLaunched = 20, +} EVRApplicationTransitionState; + +typedef enum ChaperoneCalibrationState +{ + ChaperoneCalibrationState_OK = 1, + ChaperoneCalibrationState_Warning = 100, + ChaperoneCalibrationState_Warning_BaseStationMayHaveMoved = 101, + ChaperoneCalibrationState_Warning_BaseStationRemoved = 102, + ChaperoneCalibrationState_Warning_SeatedBoundsInvalid = 103, + ChaperoneCalibrationState_Error = 200, + ChaperoneCalibrationState_Error_BaseStationUninitialized = 201, + ChaperoneCalibrationState_Error_BaseStationConflict = 202, + ChaperoneCalibrationState_Error_PlayAreaInvalid = 203, + ChaperoneCalibrationState_Error_CollisionBoundsInvalid = 204, +} ChaperoneCalibrationState; + +typedef enum EChaperoneConfigFile +{ + EChaperoneConfigFile_Live = 1, + EChaperoneConfigFile_Temp = 2, +} EChaperoneConfigFile; + +typedef enum EChaperoneImportFlags +{ + EChaperoneImportFlags_EChaperoneImport_BoundsOnly = 1, +} EChaperoneImportFlags; + +typedef enum EVRCompositorError +{ + EVRCompositorError_VRCompositorError_None = 0, + EVRCompositorError_VRCompositorError_RequestFailed = 1, + EVRCompositorError_VRCompositorError_IncompatibleVersion = 100, + EVRCompositorError_VRCompositorError_DoNotHaveFocus = 101, + EVRCompositorError_VRCompositorError_InvalidTexture = 102, + EVRCompositorError_VRCompositorError_IsNotSceneApplication = 103, + EVRCompositorError_VRCompositorError_TextureIsOnWrongDevice = 104, + EVRCompositorError_VRCompositorError_TextureUsesUnsupportedFormat = 105, + EVRCompositorError_VRCompositorError_SharedTexturesNotSupported = 106, + EVRCompositorError_VRCompositorError_IndexOutOfRange = 107, + EVRCompositorError_VRCompositorError_AlreadySubmitted = 108, +} EVRCompositorError; + +typedef enum VROverlayInputMethod +{ + VROverlayInputMethod_None = 0, + VROverlayInputMethod_Mouse = 1, +} VROverlayInputMethod; + +typedef enum VROverlayTransformType +{ + VROverlayTransformType_VROverlayTransform_Absolute = 0, + VROverlayTransformType_VROverlayTransform_TrackedDeviceRelative = 1, + VROverlayTransformType_VROverlayTransform_SystemOverlay = 2, + VROverlayTransformType_VROverlayTransform_TrackedComponent = 3, +} VROverlayTransformType; + +typedef enum VROverlayFlags +{ + VROverlayFlags_None = 0, + VROverlayFlags_Curved = 1, + VROverlayFlags_RGSS4X = 2, + VROverlayFlags_NoDashboardTab = 3, + VROverlayFlags_AcceptsGamepadEvents = 4, + VROverlayFlags_ShowGamepadFocus = 5, + VROverlayFlags_SendVRScrollEvents = 6, + VROverlayFlags_SendVRTouchpadEvents = 7, + VROverlayFlags_ShowTouchPadScrollWheel = 8, + VROverlayFlags_TransferOwnershipToInternalProcess = 9, + VROverlayFlags_SideBySide_Parallel = 10, + VROverlayFlags_SideBySide_Crossed = 11, + VROverlayFlags_Panorama = 12, + VROverlayFlags_StereoPanorama = 13, + VROverlayFlags_SortWithNonSceneOverlays = 14, + VROverlayFlags_VisibleInDashboard = 15, +} VROverlayFlags; + +typedef enum VRMessageOverlayResponse +{ + VRMessageOverlayResponse_ButtonPress_0 = 0, + VRMessageOverlayResponse_ButtonPress_1 = 1, + VRMessageOverlayResponse_ButtonPress_2 = 2, + VRMessageOverlayResponse_ButtonPress_3 = 3, + VRMessageOverlayResponse_CouldntFindSystemOverlay = 4, + VRMessageOverlayResponse_CouldntFindOrCreateClientOverlay = 5, + VRMessageOverlayResponse_ApplicationQuit = 6, +} VRMessageOverlayResponse; + +typedef enum EGamepadTextInputMode +{ + EGamepadTextInputMode_k_EGamepadTextInputModeNormal = 0, + EGamepadTextInputMode_k_EGamepadTextInputModePassword = 1, + EGamepadTextInputMode_k_EGamepadTextInputModeSubmit = 2, +} EGamepadTextInputMode; + +typedef enum EGamepadTextInputLineMode +{ + EGamepadTextInputLineMode_k_EGamepadTextInputLineModeSingleLine = 0, + EGamepadTextInputLineMode_k_EGamepadTextInputLineModeMultipleLines = 1, +} EGamepadTextInputLineMode; + +typedef enum EOverlayDirection +{ + EOverlayDirection_OverlayDirection_Up = 0, + EOverlayDirection_OverlayDirection_Down = 1, + EOverlayDirection_OverlayDirection_Left = 2, + EOverlayDirection_OverlayDirection_Right = 3, + EOverlayDirection_OverlayDirection_Count = 4, +} EOverlayDirection; + +typedef enum EVROverlayIntersectionMaskPrimitiveType +{ + EVROverlayIntersectionMaskPrimitiveType_OverlayIntersectionPrimitiveType_Rectangle = 0, + EVROverlayIntersectionMaskPrimitiveType_OverlayIntersectionPrimitiveType_Circle = 1, +} EVROverlayIntersectionMaskPrimitiveType; + +typedef enum EVRRenderModelError +{ + EVRRenderModelError_VRRenderModelError_None = 0, + EVRRenderModelError_VRRenderModelError_Loading = 100, + EVRRenderModelError_VRRenderModelError_NotSupported = 200, + EVRRenderModelError_VRRenderModelError_InvalidArg = 300, + EVRRenderModelError_VRRenderModelError_InvalidModel = 301, + EVRRenderModelError_VRRenderModelError_NoShapes = 302, + EVRRenderModelError_VRRenderModelError_MultipleShapes = 303, + EVRRenderModelError_VRRenderModelError_TooManyVertices = 304, + EVRRenderModelError_VRRenderModelError_MultipleTextures = 305, + EVRRenderModelError_VRRenderModelError_BufferTooSmall = 306, + EVRRenderModelError_VRRenderModelError_NotEnoughNormals = 307, + EVRRenderModelError_VRRenderModelError_NotEnoughTexCoords = 308, + EVRRenderModelError_VRRenderModelError_InvalidTexture = 400, +} EVRRenderModelError; + +typedef enum EVRComponentProperty +{ + EVRComponentProperty_VRComponentProperty_IsStatic = 1, + EVRComponentProperty_VRComponentProperty_IsVisible = 2, + EVRComponentProperty_VRComponentProperty_IsTouched = 4, + EVRComponentProperty_VRComponentProperty_IsPressed = 8, + EVRComponentProperty_VRComponentProperty_IsScrolled = 16, +} EVRComponentProperty; + +typedef enum EVRNotificationType +{ + EVRNotificationType_Transient = 0, + EVRNotificationType_Persistent = 1, + EVRNotificationType_Transient_SystemWithUserValue = 2, +} EVRNotificationType; + +typedef enum EVRNotificationStyle +{ + EVRNotificationStyle_None = 0, + EVRNotificationStyle_Application = 100, + EVRNotificationStyle_Contact_Disabled = 200, + EVRNotificationStyle_Contact_Enabled = 201, + EVRNotificationStyle_Contact_Active = 202, +} EVRNotificationStyle; + +typedef enum EVRSettingsError +{ + EVRSettingsError_VRSettingsError_None = 0, + EVRSettingsError_VRSettingsError_IPCFailed = 1, + EVRSettingsError_VRSettingsError_WriteFailed = 2, + EVRSettingsError_VRSettingsError_ReadFailed = 3, + EVRSettingsError_VRSettingsError_JsonParseFailed = 4, + EVRSettingsError_VRSettingsError_UnsetSettingHasNoDefault = 5, +} EVRSettingsError; + +typedef enum EVRScreenshotError +{ + EVRScreenshotError_VRScreenshotError_None = 0, + EVRScreenshotError_VRScreenshotError_RequestFailed = 1, + EVRScreenshotError_VRScreenshotError_IncompatibleVersion = 100, + EVRScreenshotError_VRScreenshotError_NotFound = 101, + EVRScreenshotError_VRScreenshotError_BufferTooSmall = 102, + EVRScreenshotError_VRScreenshotError_ScreenshotAlreadyInProgress = 108, +} EVRScreenshotError; + + +// OpenVR typedefs + +typedef uint32_t TrackedDeviceIndex_t; +typedef uint32_t VRNotificationId; +typedef uint64_t VROverlayHandle_t; + +typedef void * glSharedTextureHandle_t; +typedef int32_t glInt_t; +typedef uint32_t glUInt_t; +typedef uint64_t SharedTextureHandle_t; +typedef uint32_t DriverId_t; +typedef uint32_t TrackedDeviceIndex_t; +typedef uint64_t PropertyContainerHandle_t; +typedef uint32_t PropertyTypeTag_t; +typedef uint64_t VROverlayHandle_t; +typedef uint64_t TrackedCameraHandle_t; +typedef uint32_t ScreenshotHandle_t; +typedef uint32_t VRComponentProperties; +typedef int32_t TextureID_t; +typedef uint32_t VRNotificationId; +typedef EVRInitError HmdError; +typedef EVREye Hmd_Eye; +typedef EColorSpace ColorSpace; +typedef ETrackingResult HmdTrackingResult; +typedef ETrackedDeviceClass TrackedDeviceClass; +typedef ETrackingUniverseOrigin TrackingUniverseOrigin; +typedef ETrackedDeviceProperty TrackedDeviceProperty; +typedef ETrackedPropertyError TrackedPropertyError; +typedef EVRSubmitFlags VRSubmitFlags_t; +typedef EVRState VRState_t; +typedef ECollisionBoundsStyle CollisionBoundsStyle_t; +typedef EVROverlayError VROverlayError; +typedef EVRFirmwareError VRFirmwareError; +typedef EVRCompositorError VRCompositorError; +typedef EVRScreenshotError VRScreenshotsError; + +// OpenVR Structs + +typedef struct HmdMatrix34_t +{ + float m[3][4]; //float[3][4] +} HmdMatrix34_t; + +typedef struct HmdMatrix44_t +{ + float m[4][4]; //float[4][4] +} HmdMatrix44_t; + +typedef struct HmdVector3_t +{ + float v[3]; //float[3] +} HmdVector3_t; + +typedef struct HmdVector4_t +{ + float v[4]; //float[4] +} HmdVector4_t; + +typedef struct HmdVector3d_t +{ + double v[3]; //double[3] +} HmdVector3d_t; + +typedef struct HmdVector2_t +{ + float v[2]; //float[2] +} HmdVector2_t; + +typedef struct HmdQuaternion_t +{ + double w; + double x; + double y; + double z; +} HmdQuaternion_t; + +typedef struct HmdColor_t +{ + float r; + float g; + float b; + float a; +} HmdColor_t; + +typedef struct HmdQuad_t +{ + struct HmdVector3_t vCorners[4]; //struct vr::HmdVector3_t[4] +} HmdQuad_t; + +typedef struct HmdRect2_t +{ + struct HmdVector2_t vTopLeft; + struct HmdVector2_t vBottomRight; +} HmdRect2_t; + +typedef struct DistortionCoordinates_t +{ + float rfRed[2]; //float[2] + float rfGreen[2]; //float[2] + float rfBlue[2]; //float[2] +} DistortionCoordinates_t; + +typedef struct Texture_t +{ + void * handle; // void * + enum ETextureType eType; + enum EColorSpace eColorSpace; +} Texture_t; + +typedef struct TrackedDevicePose_t +{ + struct HmdMatrix34_t mDeviceToAbsoluteTracking; + struct HmdVector3_t vVelocity; + struct HmdVector3_t vAngularVelocity; + enum ETrackingResult eTrackingResult; + bool bPoseIsValid; + bool bDeviceIsConnected; +} TrackedDevicePose_t; + +typedef struct VRTextureBounds_t +{ + float uMin; + float vMin; + float uMax; + float vMax; +} VRTextureBounds_t; + +typedef struct VRVulkanTextureData_t +{ + uint64_t m_nImage; + struct VkDevice_T * m_pDevice; // struct VkDevice_T * + struct VkPhysicalDevice_T * m_pPhysicalDevice; // struct VkPhysicalDevice_T * + struct VkInstance_T * m_pInstance; // struct VkInstance_T * + struct VkQueue_T * m_pQueue; // struct VkQueue_T * + uint32_t m_nQueueFamilyIndex; + uint32_t m_nWidth; + uint32_t m_nHeight; + uint32_t m_nFormat; + uint32_t m_nSampleCount; +} VRVulkanTextureData_t; + +typedef struct D3D12TextureData_t +{ + struct ID3D12Resource * m_pResource; // struct ID3D12Resource * + struct ID3D12CommandQueue * m_pCommandQueue; // struct ID3D12CommandQueue * + uint32_t m_nNodeMask; +} D3D12TextureData_t; + +typedef struct VREvent_Controller_t +{ + uint32_t button; +} VREvent_Controller_t; + +typedef struct VREvent_Mouse_t +{ + float x; + float y; + uint32_t button; +} VREvent_Mouse_t; + +typedef struct VREvent_Scroll_t +{ + float xdelta; + float ydelta; + uint32_t repeatCount; +} VREvent_Scroll_t; + +typedef struct VREvent_TouchPadMove_t +{ + bool bFingerDown; + float flSecondsFingerDown; + float fValueXFirst; + float fValueYFirst; + float fValueXRaw; + float fValueYRaw; +} VREvent_TouchPadMove_t; + +typedef struct VREvent_Notification_t +{ + uint64_t ulUserValue; + uint32_t notificationId; +} VREvent_Notification_t; + +typedef struct VREvent_Process_t +{ + uint32_t pid; + uint32_t oldPid; + bool bForced; +} VREvent_Process_t; + +typedef struct VREvent_Overlay_t +{ + uint64_t overlayHandle; +} VREvent_Overlay_t; + +typedef struct VREvent_Status_t +{ + uint32_t statusState; +} VREvent_Status_t; + +typedef struct VREvent_Keyboard_t +{ + char * cNewInput[8]; //char[8] + uint64_t uUserValue; +} VREvent_Keyboard_t; + +typedef struct VREvent_Ipd_t +{ + float ipdMeters; +} VREvent_Ipd_t; + +typedef struct VREvent_Chaperone_t +{ + uint64_t m_nPreviousUniverse; + uint64_t m_nCurrentUniverse; +} VREvent_Chaperone_t; + +typedef struct VREvent_Reserved_t +{ + uint64_t reserved0; + uint64_t reserved1; +} VREvent_Reserved_t; + +typedef struct VREvent_PerformanceTest_t +{ + uint32_t m_nFidelityLevel; +} VREvent_PerformanceTest_t; + +typedef struct VREvent_SeatedZeroPoseReset_t +{ + bool bResetBySystemMenu; +} VREvent_SeatedZeroPoseReset_t; + +typedef struct VREvent_Screenshot_t +{ + uint32_t handle; + uint32_t type; +} VREvent_Screenshot_t; + +typedef struct VREvent_ScreenshotProgress_t +{ + float progress; +} VREvent_ScreenshotProgress_t; + +typedef struct VREvent_ApplicationLaunch_t +{ + uint32_t pid; + uint32_t unArgsHandle; +} VREvent_ApplicationLaunch_t; + +typedef struct VREvent_EditingCameraSurface_t +{ + uint64_t overlayHandle; + uint32_t nVisualMode; +} VREvent_EditingCameraSurface_t; + +typedef struct VREvent_MessageOverlay_t +{ + uint32_t unVRMessageOverlayResponse; +} VREvent_MessageOverlay_t; + +typedef struct VREvent_Property_t +{ + PropertyContainerHandle_t container; + enum ETrackedDeviceProperty prop; +} VREvent_Property_t; + +typedef struct HiddenAreaMesh_t +{ + struct HmdVector2_t * pVertexData; // const struct vr::HmdVector2_t * + uint32_t unTriangleCount; +} HiddenAreaMesh_t; + +typedef struct VRControllerAxis_t +{ + float x; + float y; +} VRControllerAxis_t; + +typedef struct VRControllerState_t +{ + uint32_t unPacketNum; + uint64_t ulButtonPressed; + uint64_t ulButtonTouched; + struct VRControllerAxis_t rAxis[5]; //struct vr::VRControllerAxis_t[5] +} VRControllerState_t; + +typedef struct Compositor_OverlaySettings +{ + uint32_t size; + bool curved; + bool antialias; + float scale; + float distance; + float alpha; + float uOffset; + float vOffset; + float uScale; + float vScale; + float gridDivs; + float gridWidth; + float gridScale; + struct HmdMatrix44_t transform; +} Compositor_OverlaySettings; + +typedef struct CameraVideoStreamFrameHeader_t +{ + enum EVRTrackedCameraFrameType eFrameType; + uint32_t nWidth; + uint32_t nHeight; + uint32_t nBytesPerPixel; + uint32_t nFrameSequence; + struct TrackedDevicePose_t standingTrackedDevicePose; +} CameraVideoStreamFrameHeader_t; + +typedef struct AppOverrideKeys_t +{ + char * pchKey; // const char * + char * pchValue; // const char * +} AppOverrideKeys_t; + +typedef struct Compositor_FrameTiming +{ + uint32_t m_nSize; + uint32_t m_nFrameIndex; + uint32_t m_nNumFramePresents; + uint32_t m_nNumMisPresented; + uint32_t m_nNumDroppedFrames; + uint32_t m_nReprojectionFlags; + double m_flSystemTimeInSeconds; + float m_flPreSubmitGpuMs; + float m_flPostSubmitGpuMs; + float m_flTotalRenderGpuMs; + float m_flCompositorRenderGpuMs; + float m_flCompositorRenderCpuMs; + float m_flCompositorIdleCpuMs; + float m_flClientFrameIntervalMs; + float m_flPresentCallCpuMs; + float m_flWaitForPresentCpuMs; + float m_flSubmitFrameMs; + float m_flWaitGetPosesCalledMs; + float m_flNewPosesReadyMs; + float m_flNewFrameReadyMs; + float m_flCompositorUpdateStartMs; + float m_flCompositorUpdateEndMs; + float m_flCompositorRenderStartMs; + TrackedDevicePose_t m_HmdPose; +} Compositor_FrameTiming; + +typedef struct Compositor_CumulativeStats +{ + uint32_t m_nPid; + uint32_t m_nNumFramePresents; + uint32_t m_nNumDroppedFrames; + uint32_t m_nNumReprojectedFrames; + uint32_t m_nNumFramePresentsOnStartup; + uint32_t m_nNumDroppedFramesOnStartup; + uint32_t m_nNumReprojectedFramesOnStartup; + uint32_t m_nNumLoading; + uint32_t m_nNumFramePresentsLoading; + uint32_t m_nNumDroppedFramesLoading; + uint32_t m_nNumReprojectedFramesLoading; + uint32_t m_nNumTimedOut; + uint32_t m_nNumFramePresentsTimedOut; + uint32_t m_nNumDroppedFramesTimedOut; + uint32_t m_nNumReprojectedFramesTimedOut; +} Compositor_CumulativeStats; + +typedef struct VROverlayIntersectionParams_t +{ + struct HmdVector3_t vSource; + struct HmdVector3_t vDirection; + enum ETrackingUniverseOrigin eOrigin; +} VROverlayIntersectionParams_t; + +typedef struct VROverlayIntersectionResults_t +{ + struct HmdVector3_t vPoint; + struct HmdVector3_t vNormal; + struct HmdVector2_t vUVs; + float fDistance; +} VROverlayIntersectionResults_t; + +typedef struct IntersectionMaskRectangle_t +{ + float m_flTopLeftX; + float m_flTopLeftY; + float m_flWidth; + float m_flHeight; +} IntersectionMaskRectangle_t; + +typedef struct IntersectionMaskCircle_t +{ + float m_flCenterX; + float m_flCenterY; + float m_flRadius; +} IntersectionMaskCircle_t; + +typedef struct RenderModel_ComponentState_t +{ + struct HmdMatrix34_t mTrackingToComponentRenderModel; + struct HmdMatrix34_t mTrackingToComponentLocal; + VRComponentProperties uProperties; +} RenderModel_ComponentState_t; + +typedef struct RenderModel_Vertex_t +{ + struct HmdVector3_t vPosition; + struct HmdVector3_t vNormal; + float rfTextureCoord[2]; //float[2] +} RenderModel_Vertex_t; + +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( push, 4 ) +#endif +typedef struct RenderModel_TextureMap_t +{ + uint16_t unWidth; + uint16_t unHeight; + uint8_t * rubTextureMapData; // const uint8_t * +} RenderModel_TextureMap_t; + +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( pop ) +#endif +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( push, 4 ) +#endif +typedef struct RenderModel_t +{ + struct RenderModel_Vertex_t * rVertexData; // const struct vr::RenderModel_Vertex_t * + uint32_t unVertexCount; + uint16_t * rIndexData; // const uint16_t * + uint32_t unTriangleCount; + TextureID_t diffuseTextureId; +} RenderModel_t; + +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( pop ) +#endif +typedef struct RenderModel_ControllerMode_State_t +{ + bool bScrollWheelVisible; +} RenderModel_ControllerMode_State_t; + +typedef struct NotificationBitmap_t +{ + void * m_pImageData; // void * + int32_t m_nWidth; + int32_t m_nHeight; + int32_t m_nBytesPerPixel; +} NotificationBitmap_t; + +typedef struct COpenVRContext +{ + intptr_t m_pVRSystem; // class vr::IVRSystem * + intptr_t m_pVRChaperone; // class vr::IVRChaperone * + intptr_t m_pVRChaperoneSetup; // class vr::IVRChaperoneSetup * + intptr_t m_pVRCompositor; // class vr::IVRCompositor * + intptr_t m_pVROverlay; // class vr::IVROverlay * + intptr_t m_pVRResources; // class vr::IVRResources * + intptr_t m_pVRRenderModels; // class vr::IVRRenderModels * + intptr_t m_pVRExtendedDisplay; // class vr::IVRExtendedDisplay * + intptr_t m_pVRSettings; // class vr::IVRSettings * + intptr_t m_pVRApplications; // class vr::IVRApplications * + intptr_t m_pVRTrackedCamera; // class vr::IVRTrackedCamera * + intptr_t m_pVRScreenshots; // class vr::IVRScreenshots * + intptr_t m_pVRDriverManager; // class vr::IVRDriverManager * +} COpenVRContext; + + +typedef union +{ + VREvent_Reserved_t reserved; + VREvent_Controller_t controller; + VREvent_Mouse_t mouse; + VREvent_Scroll_t scroll; + VREvent_Process_t process; + VREvent_Notification_t notification; + VREvent_Overlay_t overlay; + VREvent_Status_t status; + VREvent_Keyboard_t keyboard; + VREvent_Ipd_t ipd; + VREvent_Chaperone_t chaperone; + VREvent_PerformanceTest_t performanceTest; + VREvent_TouchPadMove_t touchPadMove; + VREvent_SeatedZeroPoseReset_t seatedZeroPoseReset; +} VREvent_Data_t; + +/** An event posted by the server to all running applications */ +struct VREvent_t +{ + uint32_t eventType; // EVREventType enum + TrackedDeviceIndex_t trackedDeviceIndex; + float eventAgeSeconds; + // event data must be the end of the struct as its size is variable + VREvent_Data_t data; +}; + + +typedef union +{ + IntersectionMaskRectangle_t m_Rectangle; + IntersectionMaskCircle_t m_Circle; +} VROverlayIntersectionMaskPrimitive_Data_t; + +struct VROverlayIntersectionMaskPrimitive_t +{ + EVROverlayIntersectionMaskPrimitiveType m_nPrimitiveType; + VROverlayIntersectionMaskPrimitive_Data_t m_Primitive; +}; + + +// OpenVR Function Pointer Tables + +struct VR_IVRSystem_FnTable +{ + void (OPENVR_FNTABLE_CALLTYPE *GetRecommendedRenderTargetSize)(uint32_t * pnWidth, uint32_t * pnHeight); + struct HmdMatrix44_t (OPENVR_FNTABLE_CALLTYPE *GetProjectionMatrix)(EVREye eEye, float fNearZ, float fFarZ); + void (OPENVR_FNTABLE_CALLTYPE *GetProjectionRaw)(EVREye eEye, float * pfLeft, float * pfRight, float * pfTop, float * pfBottom); + bool (OPENVR_FNTABLE_CALLTYPE *ComputeDistortion)(EVREye eEye, float fU, float fV, struct DistortionCoordinates_t * pDistortionCoordinates); + struct HmdMatrix34_t (OPENVR_FNTABLE_CALLTYPE *GetEyeToHeadTransform)(EVREye eEye); + bool (OPENVR_FNTABLE_CALLTYPE *GetTimeSinceLastVsync)(float * pfSecondsSinceLastVsync, uint64_t * pulFrameCounter); + int32_t (OPENVR_FNTABLE_CALLTYPE *GetD3D9AdapterIndex)(); + void (OPENVR_FNTABLE_CALLTYPE *GetDXGIOutputInfo)(int32_t * pnAdapterIndex); + void (OPENVR_FNTABLE_CALLTYPE *GetOutputDevice)(uint64_t * pnDevice, ETextureType textureType); + bool (OPENVR_FNTABLE_CALLTYPE *IsDisplayOnDesktop)(); + bool (OPENVR_FNTABLE_CALLTYPE *SetDisplayVisibility)(bool bIsVisibleOnDesktop); + void (OPENVR_FNTABLE_CALLTYPE *GetDeviceToAbsoluteTrackingPose)(ETrackingUniverseOrigin eOrigin, float fPredictedSecondsToPhotonsFromNow, struct TrackedDevicePose_t * pTrackedDevicePoseArray, uint32_t unTrackedDevicePoseArrayCount); + void (OPENVR_FNTABLE_CALLTYPE *ResetSeatedZeroPose)(); + struct HmdMatrix34_t (OPENVR_FNTABLE_CALLTYPE *GetSeatedZeroPoseToStandingAbsoluteTrackingPose)(); + struct HmdMatrix34_t (OPENVR_FNTABLE_CALLTYPE *GetRawZeroPoseToStandingAbsoluteTrackingPose)(); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetSortedTrackedDeviceIndicesOfClass)(ETrackedDeviceClass eTrackedDeviceClass, TrackedDeviceIndex_t * punTrackedDeviceIndexArray, uint32_t unTrackedDeviceIndexArrayCount, TrackedDeviceIndex_t unRelativeToTrackedDeviceIndex); + EDeviceActivityLevel (OPENVR_FNTABLE_CALLTYPE *GetTrackedDeviceActivityLevel)(TrackedDeviceIndex_t unDeviceId); + void (OPENVR_FNTABLE_CALLTYPE *ApplyTransform)(struct TrackedDevicePose_t * pOutputPose, struct TrackedDevicePose_t * pTrackedDevicePose, struct HmdMatrix34_t * pTransform); + TrackedDeviceIndex_t (OPENVR_FNTABLE_CALLTYPE *GetTrackedDeviceIndexForControllerRole)(ETrackedControllerRole unDeviceType); + ETrackedControllerRole (OPENVR_FNTABLE_CALLTYPE *GetControllerRoleForTrackedDeviceIndex)(TrackedDeviceIndex_t unDeviceIndex); + ETrackedDeviceClass (OPENVR_FNTABLE_CALLTYPE *GetTrackedDeviceClass)(TrackedDeviceIndex_t unDeviceIndex); + bool (OPENVR_FNTABLE_CALLTYPE *IsTrackedDeviceConnected)(TrackedDeviceIndex_t unDeviceIndex); + bool (OPENVR_FNTABLE_CALLTYPE *GetBoolTrackedDeviceProperty)(TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError * pError); + float (OPENVR_FNTABLE_CALLTYPE *GetFloatTrackedDeviceProperty)(TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError * pError); + int32_t (OPENVR_FNTABLE_CALLTYPE *GetInt32TrackedDeviceProperty)(TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError * pError); + uint64_t (OPENVR_FNTABLE_CALLTYPE *GetUint64TrackedDeviceProperty)(TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError * pError); + struct HmdMatrix34_t (OPENVR_FNTABLE_CALLTYPE *GetMatrix34TrackedDeviceProperty)(TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError * pError); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetStringTrackedDeviceProperty)(TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, char * pchValue, uint32_t unBufferSize, ETrackedPropertyError * pError); + char * (OPENVR_FNTABLE_CALLTYPE *GetPropErrorNameFromEnum)(ETrackedPropertyError error); + bool (OPENVR_FNTABLE_CALLTYPE *PollNextEvent)(struct VREvent_t * pEvent, uint32_t uncbVREvent); + bool (OPENVR_FNTABLE_CALLTYPE *PollNextEventWithPose)(ETrackingUniverseOrigin eOrigin, struct VREvent_t * pEvent, uint32_t uncbVREvent, TrackedDevicePose_t * pTrackedDevicePose); + char * (OPENVR_FNTABLE_CALLTYPE *GetEventTypeNameFromEnum)(EVREventType eType); + struct HiddenAreaMesh_t (OPENVR_FNTABLE_CALLTYPE *GetHiddenAreaMesh)(EVREye eEye, EHiddenAreaMeshType type); + bool (OPENVR_FNTABLE_CALLTYPE *GetControllerState)(TrackedDeviceIndex_t unControllerDeviceIndex, VRControllerState_t * pControllerState, uint32_t unControllerStateSize); + bool (OPENVR_FNTABLE_CALLTYPE *GetControllerStateWithPose)(ETrackingUniverseOrigin eOrigin, TrackedDeviceIndex_t unControllerDeviceIndex, VRControllerState_t * pControllerState, uint32_t unControllerStateSize, struct TrackedDevicePose_t * pTrackedDevicePose); + void (OPENVR_FNTABLE_CALLTYPE *TriggerHapticPulse)(TrackedDeviceIndex_t unControllerDeviceIndex, uint32_t unAxisId, unsigned short usDurationMicroSec); + char * (OPENVR_FNTABLE_CALLTYPE *GetButtonIdNameFromEnum)(EVRButtonId eButtonId); + char * (OPENVR_FNTABLE_CALLTYPE *GetControllerAxisTypeNameFromEnum)(EVRControllerAxisType eAxisType); + bool (OPENVR_FNTABLE_CALLTYPE *CaptureInputFocus)(); + void (OPENVR_FNTABLE_CALLTYPE *ReleaseInputFocus)(); + bool (OPENVR_FNTABLE_CALLTYPE *IsInputFocusCapturedByAnotherProcess)(); + uint32_t (OPENVR_FNTABLE_CALLTYPE *DriverDebugRequest)(TrackedDeviceIndex_t unDeviceIndex, char * pchRequest, char * pchResponseBuffer, uint32_t unResponseBufferSize); + EVRFirmwareError (OPENVR_FNTABLE_CALLTYPE *PerformFirmwareUpdate)(TrackedDeviceIndex_t unDeviceIndex); + void (OPENVR_FNTABLE_CALLTYPE *AcknowledgeQuit_Exiting)(); + void (OPENVR_FNTABLE_CALLTYPE *AcknowledgeQuit_UserPrompt)(); +}; + +struct VR_IVRExtendedDisplay_FnTable +{ + void (OPENVR_FNTABLE_CALLTYPE *GetWindowBounds)(int32_t * pnX, int32_t * pnY, uint32_t * pnWidth, uint32_t * pnHeight); + void (OPENVR_FNTABLE_CALLTYPE *GetEyeOutputViewport)(EVREye eEye, uint32_t * pnX, uint32_t * pnY, uint32_t * pnWidth, uint32_t * pnHeight); + void (OPENVR_FNTABLE_CALLTYPE *GetDXGIOutputInfo)(int32_t * pnAdapterIndex, int32_t * pnAdapterOutputIndex); +}; + +struct VR_IVRTrackedCamera_FnTable +{ + char * (OPENVR_FNTABLE_CALLTYPE *GetCameraErrorNameFromEnum)(EVRTrackedCameraError eCameraError); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *HasCamera)(TrackedDeviceIndex_t nDeviceIndex, bool * pHasCamera); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *GetCameraFrameSize)(TrackedDeviceIndex_t nDeviceIndex, EVRTrackedCameraFrameType eFrameType, uint32_t * pnWidth, uint32_t * pnHeight, uint32_t * pnFrameBufferSize); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *GetCameraIntrinsics)(TrackedDeviceIndex_t nDeviceIndex, EVRTrackedCameraFrameType eFrameType, HmdVector2_t * pFocalLength, HmdVector2_t * pCenter); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *GetCameraProjection)(TrackedDeviceIndex_t nDeviceIndex, EVRTrackedCameraFrameType eFrameType, float flZNear, float flZFar, HmdMatrix44_t * pProjection); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *AcquireVideoStreamingService)(TrackedDeviceIndex_t nDeviceIndex, TrackedCameraHandle_t * pHandle); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *ReleaseVideoStreamingService)(TrackedCameraHandle_t hTrackedCamera); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *GetVideoStreamFrameBuffer)(TrackedCameraHandle_t hTrackedCamera, EVRTrackedCameraFrameType eFrameType, void * pFrameBuffer, uint32_t nFrameBufferSize, CameraVideoStreamFrameHeader_t * pFrameHeader, uint32_t nFrameHeaderSize); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *GetVideoStreamTextureSize)(TrackedDeviceIndex_t nDeviceIndex, EVRTrackedCameraFrameType eFrameType, VRTextureBounds_t * pTextureBounds, uint32_t * pnWidth, uint32_t * pnHeight); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *GetVideoStreamTextureD3D11)(TrackedCameraHandle_t hTrackedCamera, EVRTrackedCameraFrameType eFrameType, void * pD3D11DeviceOrResource, void ** ppD3D11ShaderResourceView, CameraVideoStreamFrameHeader_t * pFrameHeader, uint32_t nFrameHeaderSize); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *GetVideoStreamTextureGL)(TrackedCameraHandle_t hTrackedCamera, EVRTrackedCameraFrameType eFrameType, glUInt_t * pglTextureId, CameraVideoStreamFrameHeader_t * pFrameHeader, uint32_t nFrameHeaderSize); + EVRTrackedCameraError (OPENVR_FNTABLE_CALLTYPE *ReleaseVideoStreamTextureGL)(TrackedCameraHandle_t hTrackedCamera, glUInt_t glTextureId); +}; + +struct VR_IVRApplications_FnTable +{ + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *AddApplicationManifest)(char * pchApplicationManifestFullPath, bool bTemporary); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *RemoveApplicationManifest)(char * pchApplicationManifestFullPath); + bool (OPENVR_FNTABLE_CALLTYPE *IsApplicationInstalled)(char * pchAppKey); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetApplicationCount)(); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *GetApplicationKeyByIndex)(uint32_t unApplicationIndex, char * pchAppKeyBuffer, uint32_t unAppKeyBufferLen); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *GetApplicationKeyByProcessId)(uint32_t unProcessId, char * pchAppKeyBuffer, uint32_t unAppKeyBufferLen); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *LaunchApplication)(char * pchAppKey); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *LaunchTemplateApplication)(char * pchTemplateAppKey, char * pchNewAppKey, struct AppOverrideKeys_t * pKeys, uint32_t unKeys); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *LaunchApplicationFromMimeType)(char * pchMimeType, char * pchArgs); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *LaunchDashboardOverlay)(char * pchAppKey); + bool (OPENVR_FNTABLE_CALLTYPE *CancelApplicationLaunch)(char * pchAppKey); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *IdentifyApplication)(uint32_t unProcessId, char * pchAppKey); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetApplicationProcessId)(char * pchAppKey); + char * (OPENVR_FNTABLE_CALLTYPE *GetApplicationsErrorNameFromEnum)(EVRApplicationError error); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetApplicationPropertyString)(char * pchAppKey, EVRApplicationProperty eProperty, char * pchPropertyValueBuffer, uint32_t unPropertyValueBufferLen, EVRApplicationError * peError); + bool (OPENVR_FNTABLE_CALLTYPE *GetApplicationPropertyBool)(char * pchAppKey, EVRApplicationProperty eProperty, EVRApplicationError * peError); + uint64_t (OPENVR_FNTABLE_CALLTYPE *GetApplicationPropertyUint64)(char * pchAppKey, EVRApplicationProperty eProperty, EVRApplicationError * peError); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *SetApplicationAutoLaunch)(char * pchAppKey, bool bAutoLaunch); + bool (OPENVR_FNTABLE_CALLTYPE *GetApplicationAutoLaunch)(char * pchAppKey); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *SetDefaultApplicationForMimeType)(char * pchAppKey, char * pchMimeType); + bool (OPENVR_FNTABLE_CALLTYPE *GetDefaultApplicationForMimeType)(char * pchMimeType, char * pchAppKeyBuffer, uint32_t unAppKeyBufferLen); + bool (OPENVR_FNTABLE_CALLTYPE *GetApplicationSupportedMimeTypes)(char * pchAppKey, char * pchMimeTypesBuffer, uint32_t unMimeTypesBuffer); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetApplicationsThatSupportMimeType)(char * pchMimeType, char * pchAppKeysThatSupportBuffer, uint32_t unAppKeysThatSupportBuffer); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetApplicationLaunchArguments)(uint32_t unHandle, char * pchArgs, uint32_t unArgs); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *GetStartingApplication)(char * pchAppKeyBuffer, uint32_t unAppKeyBufferLen); + EVRApplicationTransitionState (OPENVR_FNTABLE_CALLTYPE *GetTransitionState)(); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *PerformApplicationPrelaunchCheck)(char * pchAppKey); + char * (OPENVR_FNTABLE_CALLTYPE *GetApplicationsTransitionStateNameFromEnum)(EVRApplicationTransitionState state); + bool (OPENVR_FNTABLE_CALLTYPE *IsQuitUserPromptRequested)(); + EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *LaunchInternalProcess)(char * pchBinaryPath, char * pchArguments, char * pchWorkingDirectory); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetCurrentSceneProcessId)(); +}; + +struct VR_IVRChaperone_FnTable +{ + ChaperoneCalibrationState (OPENVR_FNTABLE_CALLTYPE *GetCalibrationState)(); + bool (OPENVR_FNTABLE_CALLTYPE *GetPlayAreaSize)(float * pSizeX, float * pSizeZ); + bool (OPENVR_FNTABLE_CALLTYPE *GetPlayAreaRect)(struct HmdQuad_t * rect); + void (OPENVR_FNTABLE_CALLTYPE *ReloadInfo)(); + void (OPENVR_FNTABLE_CALLTYPE *SetSceneColor)(struct HmdColor_t color); + void (OPENVR_FNTABLE_CALLTYPE *GetBoundsColor)(struct HmdColor_t * pOutputColorArray, int nNumOutputColors, float flCollisionBoundsFadeDistance, struct HmdColor_t * pOutputCameraColor); + bool (OPENVR_FNTABLE_CALLTYPE *AreBoundsVisible)(); + void (OPENVR_FNTABLE_CALLTYPE *ForceBoundsVisible)(bool bForce); +}; + +struct VR_IVRChaperoneSetup_FnTable +{ + bool (OPENVR_FNTABLE_CALLTYPE *CommitWorkingCopy)(EChaperoneConfigFile configFile); + void (OPENVR_FNTABLE_CALLTYPE *RevertWorkingCopy)(); + bool (OPENVR_FNTABLE_CALLTYPE *GetWorkingPlayAreaSize)(float * pSizeX, float * pSizeZ); + bool (OPENVR_FNTABLE_CALLTYPE *GetWorkingPlayAreaRect)(struct HmdQuad_t * rect); + bool (OPENVR_FNTABLE_CALLTYPE *GetWorkingCollisionBoundsInfo)(struct HmdQuad_t * pQuadsBuffer, uint32_t * punQuadsCount); + bool (OPENVR_FNTABLE_CALLTYPE *GetLiveCollisionBoundsInfo)(struct HmdQuad_t * pQuadsBuffer, uint32_t * punQuadsCount); + bool (OPENVR_FNTABLE_CALLTYPE *GetWorkingSeatedZeroPoseToRawTrackingPose)(struct HmdMatrix34_t * pmatSeatedZeroPoseToRawTrackingPose); + bool (OPENVR_FNTABLE_CALLTYPE *GetWorkingStandingZeroPoseToRawTrackingPose)(struct HmdMatrix34_t * pmatStandingZeroPoseToRawTrackingPose); + void (OPENVR_FNTABLE_CALLTYPE *SetWorkingPlayAreaSize)(float sizeX, float sizeZ); + void (OPENVR_FNTABLE_CALLTYPE *SetWorkingCollisionBoundsInfo)(struct HmdQuad_t * pQuadsBuffer, uint32_t unQuadsCount); + void (OPENVR_FNTABLE_CALLTYPE *SetWorkingSeatedZeroPoseToRawTrackingPose)(struct HmdMatrix34_t * pMatSeatedZeroPoseToRawTrackingPose); + void (OPENVR_FNTABLE_CALLTYPE *SetWorkingStandingZeroPoseToRawTrackingPose)(struct HmdMatrix34_t * pMatStandingZeroPoseToRawTrackingPose); + void (OPENVR_FNTABLE_CALLTYPE *ReloadFromDisk)(EChaperoneConfigFile configFile); + bool (OPENVR_FNTABLE_CALLTYPE *GetLiveSeatedZeroPoseToRawTrackingPose)(struct HmdMatrix34_t * pmatSeatedZeroPoseToRawTrackingPose); + void (OPENVR_FNTABLE_CALLTYPE *SetWorkingCollisionBoundsTagsInfo)(uint8_t * pTagsBuffer, uint32_t unTagCount); + bool (OPENVR_FNTABLE_CALLTYPE *GetLiveCollisionBoundsTagsInfo)(uint8_t * pTagsBuffer, uint32_t * punTagCount); + bool (OPENVR_FNTABLE_CALLTYPE *SetWorkingPhysicalBoundsInfo)(struct HmdQuad_t * pQuadsBuffer, uint32_t unQuadsCount); + bool (OPENVR_FNTABLE_CALLTYPE *GetLivePhysicalBoundsInfo)(struct HmdQuad_t * pQuadsBuffer, uint32_t * punQuadsCount); + bool (OPENVR_FNTABLE_CALLTYPE *ExportLiveToBuffer)(char * pBuffer, uint32_t * pnBufferLength); + bool (OPENVR_FNTABLE_CALLTYPE *ImportFromBufferToWorking)(char * pBuffer, uint32_t nImportFlags); +}; + +struct VR_IVRCompositor_FnTable +{ + void (OPENVR_FNTABLE_CALLTYPE *SetTrackingSpace)(ETrackingUniverseOrigin eOrigin); + ETrackingUniverseOrigin (OPENVR_FNTABLE_CALLTYPE *GetTrackingSpace)(); + EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *WaitGetPoses)(struct TrackedDevicePose_t * pRenderPoseArray, uint32_t unRenderPoseArrayCount, struct TrackedDevicePose_t * pGamePoseArray, uint32_t unGamePoseArrayCount); + EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *GetLastPoses)(struct TrackedDevicePose_t * pRenderPoseArray, uint32_t unRenderPoseArrayCount, struct TrackedDevicePose_t * pGamePoseArray, uint32_t unGamePoseArrayCount); + EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *GetLastPoseForTrackedDeviceIndex)(TrackedDeviceIndex_t unDeviceIndex, struct TrackedDevicePose_t * pOutputPose, struct TrackedDevicePose_t * pOutputGamePose); + EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *Submit)(EVREye eEye, struct Texture_t * pTexture, struct VRTextureBounds_t * pBounds, EVRSubmitFlags nSubmitFlags); + void (OPENVR_FNTABLE_CALLTYPE *ClearLastSubmittedFrame)(); + void (OPENVR_FNTABLE_CALLTYPE *PostPresentHandoff)(); + bool (OPENVR_FNTABLE_CALLTYPE *GetFrameTiming)(struct Compositor_FrameTiming * pTiming, uint32_t unFramesAgo); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetFrameTimings)(struct Compositor_FrameTiming * pTiming, uint32_t nFrames); + float (OPENVR_FNTABLE_CALLTYPE *GetFrameTimeRemaining)(); + void (OPENVR_FNTABLE_CALLTYPE *GetCumulativeStats)(struct Compositor_CumulativeStats * pStats, uint32_t nStatsSizeInBytes); + void (OPENVR_FNTABLE_CALLTYPE *FadeToColor)(float fSeconds, float fRed, float fGreen, float fBlue, float fAlpha, bool bBackground); + struct HmdColor_t (OPENVR_FNTABLE_CALLTYPE *GetCurrentFadeColor)(bool bBackground); + void (OPENVR_FNTABLE_CALLTYPE *FadeGrid)(float fSeconds, bool bFadeIn); + float (OPENVR_FNTABLE_CALLTYPE *GetCurrentGridAlpha)(); + EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *SetSkyboxOverride)(struct Texture_t * pTextures, uint32_t unTextureCount); + void (OPENVR_FNTABLE_CALLTYPE *ClearSkyboxOverride)(); + void (OPENVR_FNTABLE_CALLTYPE *CompositorBringToFront)(); + void (OPENVR_FNTABLE_CALLTYPE *CompositorGoToBack)(); + void (OPENVR_FNTABLE_CALLTYPE *CompositorQuit)(); + bool (OPENVR_FNTABLE_CALLTYPE *IsFullscreen)(); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetCurrentSceneFocusProcess)(); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetLastFrameRenderer)(); + bool (OPENVR_FNTABLE_CALLTYPE *CanRenderScene)(); + void (OPENVR_FNTABLE_CALLTYPE *ShowMirrorWindow)(); + void (OPENVR_FNTABLE_CALLTYPE *HideMirrorWindow)(); + bool (OPENVR_FNTABLE_CALLTYPE *IsMirrorWindowVisible)(); + void (OPENVR_FNTABLE_CALLTYPE *CompositorDumpImages)(); + bool (OPENVR_FNTABLE_CALLTYPE *ShouldAppRenderWithLowResources)(); + void (OPENVR_FNTABLE_CALLTYPE *ForceInterleavedReprojectionOn)(bool bOverride); + void (OPENVR_FNTABLE_CALLTYPE *ForceReconnectProcess)(); + void (OPENVR_FNTABLE_CALLTYPE *SuspendRendering)(bool bSuspend); + EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *GetMirrorTextureD3D11)(EVREye eEye, void * pD3D11DeviceOrResource, void ** ppD3D11ShaderResourceView); + void (OPENVR_FNTABLE_CALLTYPE *ReleaseMirrorTextureD3D11)(void * pD3D11ShaderResourceView); + EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *GetMirrorTextureGL)(EVREye eEye, glUInt_t * pglTextureId, glSharedTextureHandle_t * pglSharedTextureHandle); + bool (OPENVR_FNTABLE_CALLTYPE *ReleaseSharedGLTexture)(glUInt_t glTextureId, glSharedTextureHandle_t glSharedTextureHandle); + void (OPENVR_FNTABLE_CALLTYPE *LockGLSharedTextureForAccess)(glSharedTextureHandle_t glSharedTextureHandle); + void (OPENVR_FNTABLE_CALLTYPE *UnlockGLSharedTextureForAccess)(glSharedTextureHandle_t glSharedTextureHandle); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetVulkanInstanceExtensionsRequired)(char * pchValue, uint32_t unBufferSize); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetVulkanDeviceExtensionsRequired)(struct VkPhysicalDevice_T * pPhysicalDevice, char * pchValue, uint32_t unBufferSize); +}; + +struct VR_IVROverlay_FnTable +{ + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *FindOverlay)(char * pchOverlayKey, VROverlayHandle_t * pOverlayHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *CreateOverlay)(char * pchOverlayKey, char * pchOverlayName, VROverlayHandle_t * pOverlayHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *DestroyOverlay)(VROverlayHandle_t ulOverlayHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetHighQualityOverlay)(VROverlayHandle_t ulOverlayHandle); + VROverlayHandle_t (OPENVR_FNTABLE_CALLTYPE *GetHighQualityOverlay)(); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetOverlayKey)(VROverlayHandle_t ulOverlayHandle, char * pchValue, uint32_t unBufferSize, EVROverlayError * pError); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetOverlayName)(VROverlayHandle_t ulOverlayHandle, char * pchValue, uint32_t unBufferSize, EVROverlayError * pError); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayName)(VROverlayHandle_t ulOverlayHandle, char * pchName); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayImageData)(VROverlayHandle_t ulOverlayHandle, void * pvBuffer, uint32_t unBufferSize, uint32_t * punWidth, uint32_t * punHeight); + char * (OPENVR_FNTABLE_CALLTYPE *GetOverlayErrorNameFromEnum)(EVROverlayError error); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayRenderingPid)(VROverlayHandle_t ulOverlayHandle, uint32_t unPID); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetOverlayRenderingPid)(VROverlayHandle_t ulOverlayHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayFlag)(VROverlayHandle_t ulOverlayHandle, VROverlayFlags eOverlayFlag, bool bEnabled); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayFlag)(VROverlayHandle_t ulOverlayHandle, VROverlayFlags eOverlayFlag, bool * pbEnabled); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayColor)(VROverlayHandle_t ulOverlayHandle, float fRed, float fGreen, float fBlue); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayColor)(VROverlayHandle_t ulOverlayHandle, float * pfRed, float * pfGreen, float * pfBlue); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayAlpha)(VROverlayHandle_t ulOverlayHandle, float fAlpha); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayAlpha)(VROverlayHandle_t ulOverlayHandle, float * pfAlpha); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayTexelAspect)(VROverlayHandle_t ulOverlayHandle, float fTexelAspect); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTexelAspect)(VROverlayHandle_t ulOverlayHandle, float * pfTexelAspect); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlaySortOrder)(VROverlayHandle_t ulOverlayHandle, uint32_t unSortOrder); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlaySortOrder)(VROverlayHandle_t ulOverlayHandle, uint32_t * punSortOrder); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayWidthInMeters)(VROverlayHandle_t ulOverlayHandle, float fWidthInMeters); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayWidthInMeters)(VROverlayHandle_t ulOverlayHandle, float * pfWidthInMeters); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayAutoCurveDistanceRangeInMeters)(VROverlayHandle_t ulOverlayHandle, float fMinDistanceInMeters, float fMaxDistanceInMeters); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayAutoCurveDistanceRangeInMeters)(VROverlayHandle_t ulOverlayHandle, float * pfMinDistanceInMeters, float * pfMaxDistanceInMeters); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayTextureColorSpace)(VROverlayHandle_t ulOverlayHandle, EColorSpace eTextureColorSpace); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTextureColorSpace)(VROverlayHandle_t ulOverlayHandle, EColorSpace * peTextureColorSpace); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayTextureBounds)(VROverlayHandle_t ulOverlayHandle, struct VRTextureBounds_t * pOverlayTextureBounds); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTextureBounds)(VROverlayHandle_t ulOverlayHandle, struct VRTextureBounds_t * pOverlayTextureBounds); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetOverlayRenderModel)(VROverlayHandle_t ulOverlayHandle, char * pchValue, uint32_t unBufferSize, struct HmdColor_t * pColor, EVROverlayError * pError); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayRenderModel)(VROverlayHandle_t ulOverlayHandle, char * pchRenderModel, struct HmdColor_t * pColor); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTransformType)(VROverlayHandle_t ulOverlayHandle, VROverlayTransformType * peTransformType); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayTransformAbsolute)(VROverlayHandle_t ulOverlayHandle, ETrackingUniverseOrigin eTrackingOrigin, struct HmdMatrix34_t * pmatTrackingOriginToOverlayTransform); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTransformAbsolute)(VROverlayHandle_t ulOverlayHandle, ETrackingUniverseOrigin * peTrackingOrigin, struct HmdMatrix34_t * pmatTrackingOriginToOverlayTransform); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayTransformTrackedDeviceRelative)(VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t unTrackedDevice, struct HmdMatrix34_t * pmatTrackedDeviceToOverlayTransform); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTransformTrackedDeviceRelative)(VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t * punTrackedDevice, struct HmdMatrix34_t * pmatTrackedDeviceToOverlayTransform); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayTransformTrackedDeviceComponent)(VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t unDeviceIndex, char * pchComponentName); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTransformTrackedDeviceComponent)(VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t * punDeviceIndex, char * pchComponentName, uint32_t unComponentNameSize); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTransformOverlayRelative)(VROverlayHandle_t ulOverlayHandle, VROverlayHandle_t * ulOverlayHandleParent, struct HmdMatrix34_t * pmatParentOverlayToOverlayTransform); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayTransformOverlayRelative)(VROverlayHandle_t ulOverlayHandle, VROverlayHandle_t ulOverlayHandleParent, struct HmdMatrix34_t * pmatParentOverlayToOverlayTransform); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *ShowOverlay)(VROverlayHandle_t ulOverlayHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *HideOverlay)(VROverlayHandle_t ulOverlayHandle); + bool (OPENVR_FNTABLE_CALLTYPE *IsOverlayVisible)(VROverlayHandle_t ulOverlayHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetTransformForOverlayCoordinates)(VROverlayHandle_t ulOverlayHandle, ETrackingUniverseOrigin eTrackingOrigin, struct HmdVector2_t coordinatesInOverlay, struct HmdMatrix34_t * pmatTransform); + bool (OPENVR_FNTABLE_CALLTYPE *PollNextOverlayEvent)(VROverlayHandle_t ulOverlayHandle, struct VREvent_t * pEvent, uint32_t uncbVREvent); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayInputMethod)(VROverlayHandle_t ulOverlayHandle, VROverlayInputMethod * peInputMethod); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayInputMethod)(VROverlayHandle_t ulOverlayHandle, VROverlayInputMethod eInputMethod); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayMouseScale)(VROverlayHandle_t ulOverlayHandle, struct HmdVector2_t * pvecMouseScale); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayMouseScale)(VROverlayHandle_t ulOverlayHandle, struct HmdVector2_t * pvecMouseScale); + bool (OPENVR_FNTABLE_CALLTYPE *ComputeOverlayIntersection)(VROverlayHandle_t ulOverlayHandle, struct VROverlayIntersectionParams_t * pParams, struct VROverlayIntersectionResults_t * pResults); + bool (OPENVR_FNTABLE_CALLTYPE *HandleControllerOverlayInteractionAsMouse)(VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t unControllerDeviceIndex); + bool (OPENVR_FNTABLE_CALLTYPE *IsHoverTargetOverlay)(VROverlayHandle_t ulOverlayHandle); + VROverlayHandle_t (OPENVR_FNTABLE_CALLTYPE *GetGamepadFocusOverlay)(); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetGamepadFocusOverlay)(VROverlayHandle_t ulNewFocusOverlay); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayNeighbor)(EOverlayDirection eDirection, VROverlayHandle_t ulFrom, VROverlayHandle_t ulTo); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *MoveGamepadFocusToNeighbor)(EOverlayDirection eDirection, VROverlayHandle_t ulFrom); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayTexture)(VROverlayHandle_t ulOverlayHandle, struct Texture_t * pTexture); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *ClearOverlayTexture)(VROverlayHandle_t ulOverlayHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayRaw)(VROverlayHandle_t ulOverlayHandle, void * pvBuffer, uint32_t unWidth, uint32_t unHeight, uint32_t unDepth); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayFromFile)(VROverlayHandle_t ulOverlayHandle, char * pchFilePath); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTexture)(VROverlayHandle_t ulOverlayHandle, void ** pNativeTextureHandle, void * pNativeTextureRef, uint32_t * pWidth, uint32_t * pHeight, uint32_t * pNativeFormat, ETextureType * pAPIType, EColorSpace * pColorSpace, struct VRTextureBounds_t * pTextureBounds); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *ReleaseNativeOverlayHandle)(VROverlayHandle_t ulOverlayHandle, void * pNativeTextureHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayTextureSize)(VROverlayHandle_t ulOverlayHandle, uint32_t * pWidth, uint32_t * pHeight); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *CreateDashboardOverlay)(char * pchOverlayKey, char * pchOverlayFriendlyName, VROverlayHandle_t * pMainHandle, VROverlayHandle_t * pThumbnailHandle); + bool (OPENVR_FNTABLE_CALLTYPE *IsDashboardVisible)(); + bool (OPENVR_FNTABLE_CALLTYPE *IsActiveDashboardOverlay)(VROverlayHandle_t ulOverlayHandle); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetDashboardOverlaySceneProcess)(VROverlayHandle_t ulOverlayHandle, uint32_t unProcessId); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetDashboardOverlaySceneProcess)(VROverlayHandle_t ulOverlayHandle, uint32_t * punProcessId); + void (OPENVR_FNTABLE_CALLTYPE *ShowDashboard)(char * pchOverlayToShow); + TrackedDeviceIndex_t (OPENVR_FNTABLE_CALLTYPE *GetPrimaryDashboardDevice)(); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *ShowKeyboard)(EGamepadTextInputMode eInputMode, EGamepadTextInputLineMode eLineInputMode, char * pchDescription, uint32_t unCharMax, char * pchExistingText, bool bUseMinimalMode, uint64_t uUserValue); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *ShowKeyboardForOverlay)(VROverlayHandle_t ulOverlayHandle, EGamepadTextInputMode eInputMode, EGamepadTextInputLineMode eLineInputMode, char * pchDescription, uint32_t unCharMax, char * pchExistingText, bool bUseMinimalMode, uint64_t uUserValue); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetKeyboardText)(char * pchText, uint32_t cchText); + void (OPENVR_FNTABLE_CALLTYPE *HideKeyboard)(); + void (OPENVR_FNTABLE_CALLTYPE *SetKeyboardTransformAbsolute)(ETrackingUniverseOrigin eTrackingOrigin, struct HmdMatrix34_t * pmatTrackingOriginToKeyboardTransform); + void (OPENVR_FNTABLE_CALLTYPE *SetKeyboardPositionForOverlay)(VROverlayHandle_t ulOverlayHandle, struct HmdRect2_t avoidRect); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *SetOverlayIntersectionMask)(VROverlayHandle_t ulOverlayHandle, struct VROverlayIntersectionMaskPrimitive_t * pMaskPrimitives, uint32_t unNumMaskPrimitives, uint32_t unPrimitiveSize); + EVROverlayError (OPENVR_FNTABLE_CALLTYPE *GetOverlayFlags)(VROverlayHandle_t ulOverlayHandle, uint32_t * pFlags); + VRMessageOverlayResponse (OPENVR_FNTABLE_CALLTYPE *ShowMessageOverlay)(char * pchText, char * pchCaption, char * pchButton0Text, char * pchButton1Text, char * pchButton2Text, char * pchButton3Text); +}; + +struct VR_IVRRenderModels_FnTable +{ + EVRRenderModelError (OPENVR_FNTABLE_CALLTYPE *LoadRenderModel_Async)(char * pchRenderModelName, struct RenderModel_t ** ppRenderModel); + void (OPENVR_FNTABLE_CALLTYPE *FreeRenderModel)(struct RenderModel_t * pRenderModel); + EVRRenderModelError (OPENVR_FNTABLE_CALLTYPE *LoadTexture_Async)(TextureID_t textureId, struct RenderModel_TextureMap_t ** ppTexture); + void (OPENVR_FNTABLE_CALLTYPE *FreeTexture)(struct RenderModel_TextureMap_t * pTexture); + EVRRenderModelError (OPENVR_FNTABLE_CALLTYPE *LoadTextureD3D11_Async)(TextureID_t textureId, void * pD3D11Device, void ** ppD3D11Texture2D); + EVRRenderModelError (OPENVR_FNTABLE_CALLTYPE *LoadIntoTextureD3D11_Async)(TextureID_t textureId, void * pDstTexture); + void (OPENVR_FNTABLE_CALLTYPE *FreeTextureD3D11)(void * pD3D11Texture2D); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetRenderModelName)(uint32_t unRenderModelIndex, char * pchRenderModelName, uint32_t unRenderModelNameLen); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetRenderModelCount)(); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetComponentCount)(char * pchRenderModelName); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetComponentName)(char * pchRenderModelName, uint32_t unComponentIndex, char * pchComponentName, uint32_t unComponentNameLen); + uint64_t (OPENVR_FNTABLE_CALLTYPE *GetComponentButtonMask)(char * pchRenderModelName, char * pchComponentName); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetComponentRenderModelName)(char * pchRenderModelName, char * pchComponentName, char * pchComponentRenderModelName, uint32_t unComponentRenderModelNameLen); + bool (OPENVR_FNTABLE_CALLTYPE *GetComponentState)(char * pchRenderModelName, char * pchComponentName, VRControllerState_t * pControllerState, struct RenderModel_ControllerMode_State_t * pState, struct RenderModel_ComponentState_t * pComponentState); + bool (OPENVR_FNTABLE_CALLTYPE *RenderModelHasComponent)(char * pchRenderModelName, char * pchComponentName); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetRenderModelThumbnailURL)(char * pchRenderModelName, char * pchThumbnailURL, uint32_t unThumbnailURLLen, EVRRenderModelError * peError); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetRenderModelOriginalPath)(char * pchRenderModelName, char * pchOriginalPath, uint32_t unOriginalPathLen, EVRRenderModelError * peError); + char * (OPENVR_FNTABLE_CALLTYPE *GetRenderModelErrorNameFromEnum)(EVRRenderModelError error); +}; + +struct VR_IVRNotifications_FnTable +{ + EVRNotificationError (OPENVR_FNTABLE_CALLTYPE *CreateNotification)(VROverlayHandle_t ulOverlayHandle, uint64_t ulUserValue, EVRNotificationType type, char * pchText, EVRNotificationStyle style, struct NotificationBitmap_t * pImage, VRNotificationId * pNotificationId); + EVRNotificationError (OPENVR_FNTABLE_CALLTYPE *RemoveNotification)(VRNotificationId notificationId); +}; + +struct VR_IVRSettings_FnTable +{ + char * (OPENVR_FNTABLE_CALLTYPE *GetSettingsErrorNameFromEnum)(EVRSettingsError eError); + bool (OPENVR_FNTABLE_CALLTYPE *Sync)(bool bForce, EVRSettingsError * peError); + void (OPENVR_FNTABLE_CALLTYPE *SetBool)(char * pchSection, char * pchSettingsKey, bool bValue, EVRSettingsError * peError); + void (OPENVR_FNTABLE_CALLTYPE *SetInt32)(char * pchSection, char * pchSettingsKey, int32_t nValue, EVRSettingsError * peError); + void (OPENVR_FNTABLE_CALLTYPE *SetFloat)(char * pchSection, char * pchSettingsKey, float flValue, EVRSettingsError * peError); + void (OPENVR_FNTABLE_CALLTYPE *SetString)(char * pchSection, char * pchSettingsKey, char * pchValue, EVRSettingsError * peError); + bool (OPENVR_FNTABLE_CALLTYPE *GetBool)(char * pchSection, char * pchSettingsKey, EVRSettingsError * peError); + int32_t (OPENVR_FNTABLE_CALLTYPE *GetInt32)(char * pchSection, char * pchSettingsKey, EVRSettingsError * peError); + float (OPENVR_FNTABLE_CALLTYPE *GetFloat)(char * pchSection, char * pchSettingsKey, EVRSettingsError * peError); + void (OPENVR_FNTABLE_CALLTYPE *GetString)(char * pchSection, char * pchSettingsKey, char * pchValue, uint32_t unValueLen, EVRSettingsError * peError); + void (OPENVR_FNTABLE_CALLTYPE *RemoveSection)(char * pchSection, EVRSettingsError * peError); + void (OPENVR_FNTABLE_CALLTYPE *RemoveKeyInSection)(char * pchSection, char * pchSettingsKey, EVRSettingsError * peError); +}; + +struct VR_IVRScreenshots_FnTable +{ + EVRScreenshotError (OPENVR_FNTABLE_CALLTYPE *RequestScreenshot)(ScreenshotHandle_t * pOutScreenshotHandle, EVRScreenshotType type, char * pchPreviewFilename, char * pchVRFilename); + EVRScreenshotError (OPENVR_FNTABLE_CALLTYPE *HookScreenshot)(EVRScreenshotType * pSupportedTypes, int numTypes); + EVRScreenshotType (OPENVR_FNTABLE_CALLTYPE *GetScreenshotPropertyType)(ScreenshotHandle_t screenshotHandle, EVRScreenshotError * pError); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetScreenshotPropertyFilename)(ScreenshotHandle_t screenshotHandle, EVRScreenshotPropertyFilenames filenameType, char * pchFilename, uint32_t cchFilename, EVRScreenshotError * pError); + EVRScreenshotError (OPENVR_FNTABLE_CALLTYPE *UpdateScreenshotProgress)(ScreenshotHandle_t screenshotHandle, float flProgress); + EVRScreenshotError (OPENVR_FNTABLE_CALLTYPE *TakeStereoScreenshot)(ScreenshotHandle_t * pOutScreenshotHandle, char * pchPreviewFilename, char * pchVRFilename); + EVRScreenshotError (OPENVR_FNTABLE_CALLTYPE *SubmitScreenshot)(ScreenshotHandle_t screenshotHandle, EVRScreenshotType type, char * pchSourcePreviewFilename, char * pchSourceVRFilename); +}; + +struct VR_IVRResources_FnTable +{ + uint32_t (OPENVR_FNTABLE_CALLTYPE *LoadSharedResource)(char * pchResourceName, char * pchBuffer, uint32_t unBufferLen); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetResourceFullPath)(char * pchResourceName, char * pchResourceTypeDirectory, char * pchPathBuffer, uint32_t unBufferLen); +}; + +struct VR_IVRDriverManager_FnTable +{ + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetDriverCount)(); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetDriverName)(DriverId_t nDriver, char * pchValue, uint32_t unBufferSize); +}; + + +#if 0 +// Global entry points +S_API intptr_t VR_InitInternal( EVRInitError *peError, EVRApplicationType eType ); +S_API void VR_ShutdownInternal(); +S_API bool VR_IsHmdPresent(); +S_API intptr_t VR_GetGenericInterface( const char *pchInterfaceVersion, EVRInitError *peError ); +S_API bool VR_IsRuntimeInstalled(); +S_API const char * VR_GetVRInitErrorAsSymbol( EVRInitError error ); +S_API const char * VR_GetVRInitErrorAsEnglishDescription( EVRInitError error ); +#endif + +#endif // __OPENVR_API_FLAT_H__ + + diff --git a/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Headers/openvr_driver.h b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Headers/openvr_driver.h new file mode 100644 index 000000000..bfe24c003 --- /dev/null +++ b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Headers/openvr_driver.h @@ -0,0 +1,2677 @@ +#pragma once + +// openvr_driver.h +//========= Copyright Valve Corporation ============// +// Dynamically generated file. Do not modify this file directly. + +#ifndef _OPENVR_DRIVER_API +#define _OPENVR_DRIVER_API + +#include + + + +// vrtypes.h +#ifndef _INCLUDE_VRTYPES_H +#define _INCLUDE_VRTYPES_H + +// Forward declarations to avoid requiring vulkan.h +struct VkDevice_T; +struct VkPhysicalDevice_T; +struct VkInstance_T; +struct VkQueue_T; + +// Forward declarations to avoid requiring d3d12.h +struct ID3D12Resource; +struct ID3D12CommandQueue; + +namespace vr +{ +#pragma pack( push, 8 ) + +typedef void* glSharedTextureHandle_t; +typedef int32_t glInt_t; +typedef uint32_t glUInt_t; + +// right-handed system +// +y is up +// +x is to the right +// -z is going away from you +// Distance unit is meters +struct HmdMatrix34_t +{ + float m[3][4]; +}; + +struct HmdMatrix44_t +{ + float m[4][4]; +}; + +struct HmdVector3_t +{ + float v[3]; +}; + +struct HmdVector4_t +{ + float v[4]; +}; + +struct HmdVector3d_t +{ + double v[3]; +}; + +struct HmdVector2_t +{ + float v[2]; +}; + +struct HmdQuaternion_t +{ + double w, x, y, z; +}; + +struct HmdColor_t +{ + float r, g, b, a; +}; + +struct HmdQuad_t +{ + HmdVector3_t vCorners[ 4 ]; +}; + +struct HmdRect2_t +{ + HmdVector2_t vTopLeft; + HmdVector2_t vBottomRight; +}; + +/** Used to return the post-distortion UVs for each color channel. +* UVs range from 0 to 1 with 0,0 in the upper left corner of the +* source render target. The 0,0 to 1,1 range covers a single eye. */ +struct DistortionCoordinates_t +{ + float rfRed[2]; + float rfGreen[2]; + float rfBlue[2]; +}; + +enum EVREye +{ + Eye_Left = 0, + Eye_Right = 1 +}; + +enum ETextureType +{ + TextureType_DirectX = 0, // Handle is an ID3D11Texture + TextureType_OpenGL = 1, // Handle is an OpenGL texture name or an OpenGL render buffer name, depending on submit flags + TextureType_Vulkan = 2, // Handle is a pointer to a VRVulkanTextureData_t structure + TextureType_IOSurface = 3, // Handle is a macOS cross-process-sharable IOSurfaceRef + TextureType_DirectX12 = 4, // Handle is a pointer to a D3D12TextureData_t structure +}; + +enum EColorSpace +{ + ColorSpace_Auto = 0, // Assumes 'gamma' for 8-bit per component formats, otherwise 'linear'. This mirrors the DXGI formats which have _SRGB variants. + ColorSpace_Gamma = 1, // Texture data can be displayed directly on the display without any conversion (a.k.a. display native format). + ColorSpace_Linear = 2, // Same as gamma but has been converted to a linear representation using DXGI's sRGB conversion algorithm. +}; + +struct Texture_t +{ + void* handle; // See ETextureType definition above + ETextureType eType; + EColorSpace eColorSpace; +}; + +// Handle to a shared texture (HANDLE on Windows obtained using OpenSharedResource). +typedef uint64_t SharedTextureHandle_t; +#define INVALID_SHARED_TEXTURE_HANDLE ((vr::SharedTextureHandle_t)0) + +enum ETrackingResult +{ + TrackingResult_Uninitialized = 1, + + TrackingResult_Calibrating_InProgress = 100, + TrackingResult_Calibrating_OutOfRange = 101, + + TrackingResult_Running_OK = 200, + TrackingResult_Running_OutOfRange = 201, +}; + +typedef uint32_t DriverId_t; +static const uint32_t k_nDriverNone = 0xFFFFFFFF; + +static const uint32_t k_unMaxDriverDebugResponseSize = 32768; + +/** Used to pass device IDs to API calls */ +typedef uint32_t TrackedDeviceIndex_t; +static const uint32_t k_unTrackedDeviceIndex_Hmd = 0; +static const uint32_t k_unMaxTrackedDeviceCount = 16; +static const uint32_t k_unTrackedDeviceIndexOther = 0xFFFFFFFE; +static const uint32_t k_unTrackedDeviceIndexInvalid = 0xFFFFFFFF; + +/** Describes what kind of object is being tracked at a given ID */ +enum ETrackedDeviceClass +{ + TrackedDeviceClass_Invalid = 0, // the ID was not valid. + TrackedDeviceClass_HMD = 1, // Head-Mounted Displays + TrackedDeviceClass_Controller = 2, // Tracked controllers + TrackedDeviceClass_GenericTracker = 3, // Generic trackers, similar to controllers + TrackedDeviceClass_TrackingReference = 4, // Camera and base stations that serve as tracking reference points + TrackedDeviceClass_DisplayRedirect = 5, // Accessories that aren't necessarily tracked themselves, but may redirect video output from other tracked devices +}; + + +/** Describes what specific role associated with a tracked device */ +enum ETrackedControllerRole +{ + TrackedControllerRole_Invalid = 0, // Invalid value for controller type + TrackedControllerRole_LeftHand = 1, // Tracked device associated with the left hand + TrackedControllerRole_RightHand = 2, // Tracked device associated with the right hand +}; + + +/** describes a single pose for a tracked object */ +struct TrackedDevicePose_t +{ + HmdMatrix34_t mDeviceToAbsoluteTracking; + HmdVector3_t vVelocity; // velocity in tracker space in m/s + HmdVector3_t vAngularVelocity; // angular velocity in radians/s (?) + ETrackingResult eTrackingResult; + bool bPoseIsValid; + + // This indicates that there is a device connected for this spot in the pose array. + // It could go from true to false if the user unplugs the device. + bool bDeviceIsConnected; +}; + +/** Identifies which style of tracking origin the application wants to use +* for the poses it is requesting */ +enum ETrackingUniverseOrigin +{ + TrackingUniverseSeated = 0, // Poses are provided relative to the seated zero pose + TrackingUniverseStanding = 1, // Poses are provided relative to the safe bounds configured by the user + 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. +}; + +// Refers to a single container of properties +typedef uint64_t PropertyContainerHandle_t; +typedef uint32_t PropertyTypeTag_t; + +static const PropertyContainerHandle_t k_ulInvalidPropertyContainer = 0; +static const PropertyTypeTag_t k_unInvalidPropertyTag = 0; + +// Use these tags to set/get common types as struct properties +static const PropertyTypeTag_t k_unFloatPropertyTag = 1; +static const PropertyTypeTag_t k_unInt32PropertyTag = 2; +static const PropertyTypeTag_t k_unUint64PropertyTag = 3; +static const PropertyTypeTag_t k_unBoolPropertyTag = 4; +static const PropertyTypeTag_t k_unStringPropertyTag = 5; + +static const PropertyTypeTag_t k_unHmdMatrix34PropertyTag = 20; +static const PropertyTypeTag_t k_unHmdMatrix44PropertyTag = 21; +static const PropertyTypeTag_t k_unHmdVector3PropertyTag = 22; +static const PropertyTypeTag_t k_unHmdVector4PropertyTag = 23; + +static const PropertyTypeTag_t k_unHiddenAreaPropertyTag = 30; + +static const PropertyTypeTag_t k_unOpenVRInternalReserved_Start = 1000; +static const PropertyTypeTag_t k_unOpenVRInternalReserved_End = 10000; + + +/** Each entry in this enum represents a property that can be retrieved about a +* tracked device. Many fields are only valid for one ETrackedDeviceClass. */ +enum ETrackedDeviceProperty +{ + Prop_Invalid = 0, + + // general properties that apply to all device classes + Prop_TrackingSystemName_String = 1000, + Prop_ModelNumber_String = 1001, + Prop_SerialNumber_String = 1002, + Prop_RenderModelName_String = 1003, + Prop_WillDriftInYaw_Bool = 1004, + Prop_ManufacturerName_String = 1005, + Prop_TrackingFirmwareVersion_String = 1006, + Prop_HardwareRevision_String = 1007, + Prop_AllWirelessDongleDescriptions_String = 1008, + Prop_ConnectedWirelessDongle_String = 1009, + Prop_DeviceIsWireless_Bool = 1010, + Prop_DeviceIsCharging_Bool = 1011, + Prop_DeviceBatteryPercentage_Float = 1012, // 0 is empty, 1 is full + Prop_StatusDisplayTransform_Matrix34 = 1013, + Prop_Firmware_UpdateAvailable_Bool = 1014, + Prop_Firmware_ManualUpdate_Bool = 1015, + Prop_Firmware_ManualUpdateURL_String = 1016, + Prop_HardwareRevision_Uint64 = 1017, + Prop_FirmwareVersion_Uint64 = 1018, + Prop_FPGAVersion_Uint64 = 1019, + Prop_VRCVersion_Uint64 = 1020, + Prop_RadioVersion_Uint64 = 1021, + Prop_DongleVersion_Uint64 = 1022, + Prop_BlockServerShutdown_Bool = 1023, + Prop_CanUnifyCoordinateSystemWithHmd_Bool = 1024, + Prop_ContainsProximitySensor_Bool = 1025, + Prop_DeviceProvidesBatteryStatus_Bool = 1026, + Prop_DeviceCanPowerOff_Bool = 1027, + Prop_Firmware_ProgrammingTarget_String = 1028, + Prop_DeviceClass_Int32 = 1029, + Prop_HasCamera_Bool = 1030, + Prop_DriverVersion_String = 1031, + Prop_Firmware_ForceUpdateRequired_Bool = 1032, + Prop_ViveSystemButtonFixRequired_Bool = 1033, + Prop_ParentDriver_Uint64 = 1034, + Prop_ResourceRoot_String = 1035, + + // Properties that are unique to TrackedDeviceClass_HMD + Prop_ReportsTimeSinceVSync_Bool = 2000, + Prop_SecondsFromVsyncToPhotons_Float = 2001, + Prop_DisplayFrequency_Float = 2002, + Prop_UserIpdMeters_Float = 2003, + Prop_CurrentUniverseId_Uint64 = 2004, + Prop_PreviousUniverseId_Uint64 = 2005, + Prop_DisplayFirmwareVersion_Uint64 = 2006, + Prop_IsOnDesktop_Bool = 2007, + Prop_DisplayMCType_Int32 = 2008, + Prop_DisplayMCOffset_Float = 2009, + Prop_DisplayMCScale_Float = 2010, + Prop_EdidVendorID_Int32 = 2011, + Prop_DisplayMCImageLeft_String = 2012, + Prop_DisplayMCImageRight_String = 2013, + Prop_DisplayGCBlackClamp_Float = 2014, + Prop_EdidProductID_Int32 = 2015, + Prop_CameraToHeadTransform_Matrix34 = 2016, + Prop_DisplayGCType_Int32 = 2017, + Prop_DisplayGCOffset_Float = 2018, + Prop_DisplayGCScale_Float = 2019, + Prop_DisplayGCPrescale_Float = 2020, + Prop_DisplayGCImage_String = 2021, + Prop_LensCenterLeftU_Float = 2022, + Prop_LensCenterLeftV_Float = 2023, + Prop_LensCenterRightU_Float = 2024, + Prop_LensCenterRightV_Float = 2025, + Prop_UserHeadToEyeDepthMeters_Float = 2026, + Prop_CameraFirmwareVersion_Uint64 = 2027, + Prop_CameraFirmwareDescription_String = 2028, + Prop_DisplayFPGAVersion_Uint64 = 2029, + Prop_DisplayBootloaderVersion_Uint64 = 2030, + Prop_DisplayHardwareVersion_Uint64 = 2031, + Prop_AudioFirmwareVersion_Uint64 = 2032, + Prop_CameraCompatibilityMode_Int32 = 2033, + Prop_ScreenshotHorizontalFieldOfViewDegrees_Float = 2034, + Prop_ScreenshotVerticalFieldOfViewDegrees_Float = 2035, + Prop_DisplaySuppressed_Bool = 2036, + Prop_DisplayAllowNightMode_Bool = 2037, + Prop_DisplayMCImageWidth_Int32 = 2038, + Prop_DisplayMCImageHeight_Int32 = 2039, + Prop_DisplayMCImageNumChannels_Int32 = 2040, + Prop_DisplayMCImageData_Binary = 2041, + Prop_SecondsFromPhotonsToVblank_Float = 2042, + Prop_DriverDirectModeSendsVsyncEvents_Bool = 2043, + Prop_DisplayDebugMode_Bool = 2044, + Prop_GraphicsAdapterLuid_Uint64 = 2045, + + // Properties that are unique to TrackedDeviceClass_Controller + Prop_AttachedDeviceId_String = 3000, + Prop_SupportedButtons_Uint64 = 3001, + Prop_Axis0Type_Int32 = 3002, // Return value is of type EVRControllerAxisType + Prop_Axis1Type_Int32 = 3003, // Return value is of type EVRControllerAxisType + Prop_Axis2Type_Int32 = 3004, // Return value is of type EVRControllerAxisType + Prop_Axis3Type_Int32 = 3005, // Return value is of type EVRControllerAxisType + Prop_Axis4Type_Int32 = 3006, // Return value is of type EVRControllerAxisType + Prop_ControllerRoleHint_Int32 = 3007, // Return value is of type ETrackedControllerRole + + // Properties that are unique to TrackedDeviceClass_TrackingReference + Prop_FieldOfViewLeftDegrees_Float = 4000, + Prop_FieldOfViewRightDegrees_Float = 4001, + Prop_FieldOfViewTopDegrees_Float = 4002, + Prop_FieldOfViewBottomDegrees_Float = 4003, + Prop_TrackingRangeMinimumMeters_Float = 4004, + Prop_TrackingRangeMaximumMeters_Float = 4005, + Prop_ModeLabel_String = 4006, + + // Properties that are used for user interface like icons names + Prop_IconPathName_String = 5000, // DEPRECATED. Value not referenced. Now expected to be part of icon path properties. + Prop_NamedIconPathDeviceOff_String = 5001, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceSearching_String = 5002, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceSearchingAlert_String = 5003, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceReady_String = 5004, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceReadyAlert_String = 5005, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceNotReady_String = 5006, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceStandby_String = 5007, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceAlertLow_String = 5008, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + + // Properties that are used by helpers, but are opaque to applications + Prop_DisplayHiddenArea_Binary_Start = 5100, + Prop_DisplayHiddenArea_Binary_End = 5150, + + // Properties that are unique to drivers + Prop_UserConfigPath_String = 6000, + Prop_InstallPath_String = 6001, + Prop_HasDisplayComponent_Bool = 6002, + Prop_HasControllerComponent_Bool = 6003, + Prop_HasCameraComponent_Bool = 6004, + Prop_HasDriverDirectModeComponent_Bool = 6005, + Prop_HasVirtualDisplayComponent_Bool = 6006, + + // Vendors are free to expose private debug data in this reserved region + Prop_VendorSpecific_Reserved_Start = 10000, + Prop_VendorSpecific_Reserved_End = 10999, +}; + +/** No string property will ever be longer than this length */ +static const uint32_t k_unMaxPropertyStringSize = 32 * 1024; + +/** Used to return errors that occur when reading properties. */ +enum ETrackedPropertyError +{ + TrackedProp_Success = 0, + TrackedProp_WrongDataType = 1, + TrackedProp_WrongDeviceClass = 2, + TrackedProp_BufferTooSmall = 3, + TrackedProp_UnknownProperty = 4, // Driver has not set the property (and may not ever). + TrackedProp_InvalidDevice = 5, + TrackedProp_CouldNotContactServer = 6, + TrackedProp_ValueNotProvidedByDevice = 7, + TrackedProp_StringExceedsMaximumLength = 8, + TrackedProp_NotYetAvailable = 9, // The property value isn't known yet, but is expected soon. Call again later. + TrackedProp_PermissionDenied = 10, + TrackedProp_InvalidOperation = 11, +}; + +/** Allows the application to control what part of the provided texture will be used in the +* frame buffer. */ +struct VRTextureBounds_t +{ + float uMin, vMin; + float uMax, vMax; +}; + + +/** Allows the application to control how scene textures are used by the compositor when calling Submit. */ +enum EVRSubmitFlags +{ + // Simple render path. App submits rendered left and right eye images with no lens distortion correction applied. + Submit_Default = 0x00, + + // App submits final left and right eye images with lens distortion already applied (lens distortion makes the images appear + // barrel distorted with chromatic aberration correction applied). The app would have used the data returned by + // vr::IVRSystem::ComputeDistortion() to apply the correct distortion to the rendered images before calling Submit(). + Submit_LensDistortionAlreadyApplied = 0x01, + + // If the texture pointer passed in is actually a renderbuffer (e.g. for MSAA in OpenGL) then set this flag. + Submit_GlRenderBuffer = 0x02, + + // Do not use + Submit_Reserved = 0x04, +}; + +/** Data required for passing Vulkan textures to IVRCompositor::Submit. +* Be sure to call OpenVR_Shutdown before destroying these resources. */ +struct VRVulkanTextureData_t +{ + uint64_t m_nImage; // VkImage + VkDevice_T *m_pDevice; + VkPhysicalDevice_T *m_pPhysicalDevice; + VkInstance_T *m_pInstance; + VkQueue_T *m_pQueue; + uint32_t m_nQueueFamilyIndex; + uint32_t m_nWidth, m_nHeight, m_nFormat, m_nSampleCount; +}; + +/** Data required for passing D3D12 textures to IVRCompositor::Submit. +* Be sure to call OpenVR_Shutdown before destroying these resources. */ +struct D3D12TextureData_t +{ + ID3D12Resource *m_pResource; + ID3D12CommandQueue *m_pCommandQueue; + uint32_t m_nNodeMask; +}; + +/** Status of the overall system or tracked objects */ +enum EVRState +{ + VRState_Undefined = -1, + VRState_Off = 0, + VRState_Searching = 1, + VRState_Searching_Alert = 2, + VRState_Ready = 3, + VRState_Ready_Alert = 4, + VRState_NotReady = 5, + VRState_Standby = 6, + VRState_Ready_Alert_Low = 7, +}; + +/** The types of events that could be posted (and what the parameters mean for each event type) */ +enum EVREventType +{ + VREvent_None = 0, + + VREvent_TrackedDeviceActivated = 100, + VREvent_TrackedDeviceDeactivated = 101, + VREvent_TrackedDeviceUpdated = 102, + VREvent_TrackedDeviceUserInteractionStarted = 103, + VREvent_TrackedDeviceUserInteractionEnded = 104, + VREvent_IpdChanged = 105, + VREvent_EnterStandbyMode = 106, + VREvent_LeaveStandbyMode = 107, + VREvent_TrackedDeviceRoleChanged = 108, + VREvent_WatchdogWakeUpRequested = 109, + VREvent_LensDistortionChanged = 110, + VREvent_PropertyChanged = 111, + + VREvent_ButtonPress = 200, // data is controller + VREvent_ButtonUnpress = 201, // data is controller + VREvent_ButtonTouch = 202, // data is controller + VREvent_ButtonUntouch = 203, // data is controller + + VREvent_MouseMove = 300, // data is mouse + VREvent_MouseButtonDown = 301, // data is mouse + VREvent_MouseButtonUp = 302, // data is mouse + VREvent_FocusEnter = 303, // data is overlay + VREvent_FocusLeave = 304, // data is overlay + VREvent_Scroll = 305, // data is mouse + VREvent_TouchPadMove = 306, // data is mouse + VREvent_OverlayFocusChanged = 307, // data is overlay, global event + + VREvent_InputFocusCaptured = 400, // data is process DEPRECATED + VREvent_InputFocusReleased = 401, // data is process DEPRECATED + VREvent_SceneFocusLost = 402, // data is process + VREvent_SceneFocusGained = 403, // data is process + VREvent_SceneApplicationChanged = 404, // data is process - The App actually drawing the scene changed (usually to or from the compositor) + VREvent_SceneFocusChanged = 405, // data is process - New app got access to draw the scene + VREvent_InputFocusChanged = 406, // data is process + VREvent_SceneApplicationSecondaryRenderingStarted = 407, // data is process + + VREvent_HideRenderModels = 410, // Sent to the scene application to request hiding render models temporarily + VREvent_ShowRenderModels = 411, // Sent to the scene application to request restoring render model visibility + + VREvent_OverlayShown = 500, + VREvent_OverlayHidden = 501, + VREvent_DashboardActivated = 502, + VREvent_DashboardDeactivated = 503, + VREvent_DashboardThumbSelected = 504, // Sent to the overlay manager - data is overlay + VREvent_DashboardRequested = 505, // Sent to the overlay manager - data is overlay + VREvent_ResetDashboard = 506, // Send to the overlay manager + VREvent_RenderToast = 507, // Send to the dashboard to render a toast - data is the notification ID + VREvent_ImageLoaded = 508, // Sent to overlays when a SetOverlayRaw or SetOverlayFromFile call finishes loading + VREvent_ShowKeyboard = 509, // Sent to keyboard renderer in the dashboard to invoke it + VREvent_HideKeyboard = 510, // Sent to keyboard renderer in the dashboard to hide it + VREvent_OverlayGamepadFocusGained = 511, // Sent to an overlay when IVROverlay::SetFocusOverlay is called on it + VREvent_OverlayGamepadFocusLost = 512, // Send to an overlay when it previously had focus and IVROverlay::SetFocusOverlay is called on something else + VREvent_OverlaySharedTextureChanged = 513, + VREvent_DashboardGuideButtonDown = 514, + VREvent_DashboardGuideButtonUp = 515, + VREvent_ScreenshotTriggered = 516, // Screenshot button combo was pressed, Dashboard should request a screenshot + VREvent_ImageFailed = 517, // Sent to overlays when a SetOverlayRaw or SetOverlayfromFail fails to load + VREvent_DashboardOverlayCreated = 518, + + // Screenshot API + VREvent_RequestScreenshot = 520, // Sent by vrclient application to compositor to take a screenshot + VREvent_ScreenshotTaken = 521, // Sent by compositor to the application that the screenshot has been taken + VREvent_ScreenshotFailed = 522, // Sent by compositor to the application that the screenshot failed to be taken + VREvent_SubmitScreenshotToDashboard = 523, // Sent by compositor to the dashboard that a completed screenshot was submitted + VREvent_ScreenshotProgressToDashboard = 524, // Sent by compositor to the dashboard that a completed screenshot was submitted + + VREvent_PrimaryDashboardDeviceChanged = 525, + + VREvent_Notification_Shown = 600, + VREvent_Notification_Hidden = 601, + VREvent_Notification_BeginInteraction = 602, + VREvent_Notification_Destroyed = 603, + + VREvent_Quit = 700, // data is process + VREvent_ProcessQuit = 701, // data is process + VREvent_QuitAborted_UserPrompt = 702, // data is process + VREvent_QuitAcknowledged = 703, // data is process + VREvent_DriverRequestedQuit = 704, // The driver has requested that SteamVR shut down + + VREvent_ChaperoneDataHasChanged = 800, + VREvent_ChaperoneUniverseHasChanged = 801, + VREvent_ChaperoneTempDataHasChanged = 802, + VREvent_ChaperoneSettingsHaveChanged = 803, + VREvent_SeatedZeroPoseReset = 804, + + VREvent_AudioSettingsHaveChanged = 820, + + VREvent_BackgroundSettingHasChanged = 850, + VREvent_CameraSettingsHaveChanged = 851, + VREvent_ReprojectionSettingHasChanged = 852, + VREvent_ModelSkinSettingsHaveChanged = 853, + VREvent_EnvironmentSettingsHaveChanged = 854, + VREvent_PowerSettingsHaveChanged = 855, + VREvent_EnableHomeAppSettingsHaveChanged = 856, + + VREvent_StatusUpdate = 900, + + VREvent_MCImageUpdated = 1000, + + VREvent_FirmwareUpdateStarted = 1100, + VREvent_FirmwareUpdateFinished = 1101, + + VREvent_KeyboardClosed = 1200, + VREvent_KeyboardCharInput = 1201, + VREvent_KeyboardDone = 1202, // Sent when DONE button clicked on keyboard + + VREvent_ApplicationTransitionStarted = 1300, + VREvent_ApplicationTransitionAborted = 1301, + VREvent_ApplicationTransitionNewAppStarted = 1302, + VREvent_ApplicationListUpdated = 1303, + VREvent_ApplicationMimeTypeLoad = 1304, + VREvent_ApplicationTransitionNewAppLaunchComplete = 1305, + VREvent_ProcessConnected = 1306, + VREvent_ProcessDisconnected = 1307, + + VREvent_Compositor_MirrorWindowShown = 1400, + VREvent_Compositor_MirrorWindowHidden = 1401, + VREvent_Compositor_ChaperoneBoundsShown = 1410, + VREvent_Compositor_ChaperoneBoundsHidden = 1411, + + VREvent_TrackedCamera_StartVideoStream = 1500, + VREvent_TrackedCamera_StopVideoStream = 1501, + VREvent_TrackedCamera_PauseVideoStream = 1502, + VREvent_TrackedCamera_ResumeVideoStream = 1503, + VREvent_TrackedCamera_EditingSurface = 1550, + + VREvent_PerformanceTest_EnableCapture = 1600, + VREvent_PerformanceTest_DisableCapture = 1601, + VREvent_PerformanceTest_FidelityLevel = 1602, + + VREvent_MessageOverlay_Closed = 1650, + + // Vendors are free to expose private events in this reserved region + VREvent_VendorSpecific_Reserved_Start = 10000, + VREvent_VendorSpecific_Reserved_End = 19999, +}; + + +/** Level of Hmd activity */ +// UserInteraction_Timeout means the device is in the process of timing out. +// InUse = ( k_EDeviceActivityLevel_UserInteraction || k_EDeviceActivityLevel_UserInteraction_Timeout ) +// VREvent_TrackedDeviceUserInteractionStarted fires when the devices transitions from Standby -> UserInteraction or Idle -> UserInteraction. +// VREvent_TrackedDeviceUserInteractionEnded fires when the devices transitions from UserInteraction_Timeout -> Idle +enum EDeviceActivityLevel +{ + k_EDeviceActivityLevel_Unknown = -1, + k_EDeviceActivityLevel_Idle = 0, // No activity for the last 10 seconds + k_EDeviceActivityLevel_UserInteraction = 1, // Activity (movement or prox sensor) is happening now + k_EDeviceActivityLevel_UserInteraction_Timeout = 2, // No activity for the last 0.5 seconds + k_EDeviceActivityLevel_Standby = 3, // Idle for at least 5 seconds (configurable in Settings -> Power Management) +}; + + +/** VR controller button and axis IDs */ +enum EVRButtonId +{ + k_EButton_System = 0, + k_EButton_ApplicationMenu = 1, + k_EButton_Grip = 2, + k_EButton_DPad_Left = 3, + k_EButton_DPad_Up = 4, + k_EButton_DPad_Right = 5, + k_EButton_DPad_Down = 6, + k_EButton_A = 7, + + k_EButton_ProximitySensor = 31, + + k_EButton_Axis0 = 32, + k_EButton_Axis1 = 33, + k_EButton_Axis2 = 34, + k_EButton_Axis3 = 35, + k_EButton_Axis4 = 36, + + // aliases for well known controllers + k_EButton_SteamVR_Touchpad = k_EButton_Axis0, + k_EButton_SteamVR_Trigger = k_EButton_Axis1, + + k_EButton_Dashboard_Back = k_EButton_Grip, + + k_EButton_Max = 64 +}; + +inline uint64_t ButtonMaskFromId( EVRButtonId id ) { return 1ull << id; } + +/** used for controller button events */ +struct VREvent_Controller_t +{ + uint32_t button; // EVRButtonId enum +}; + + +/** used for simulated mouse events in overlay space */ +enum EVRMouseButton +{ + VRMouseButton_Left = 0x0001, + VRMouseButton_Right = 0x0002, + VRMouseButton_Middle = 0x0004, +}; + + +/** used for simulated mouse events in overlay space */ +struct VREvent_Mouse_t +{ + float x, y; // co-ords are in GL space, bottom left of the texture is 0,0 + uint32_t button; // EVRMouseButton enum +}; + +/** used for simulated mouse wheel scroll in overlay space */ +struct VREvent_Scroll_t +{ + float xdelta, ydelta; // movement in fraction of the pad traversed since last delta, 1.0 for a full swipe + uint32_t repeatCount; +}; + +/** when in mouse input mode you can receive data from the touchpad, these events are only sent if the users finger + is on the touchpad (or just released from it) +**/ +struct VREvent_TouchPadMove_t +{ + // true if the users finger is detected on the touch pad + bool bFingerDown; + + // How long the finger has been down in seconds + float flSecondsFingerDown; + + // These values indicate the starting finger position (so you can do some basic swipe stuff) + float fValueXFirst; + float fValueYFirst; + + // This is the raw sampled coordinate without deadzoning + float fValueXRaw; + float fValueYRaw; +}; + +/** notification related events. Details will still change at this point */ +struct VREvent_Notification_t +{ + uint64_t ulUserValue; + uint32_t notificationId; +}; + +/** Used for events about processes */ +struct VREvent_Process_t +{ + uint32_t pid; + uint32_t oldPid; + bool bForced; +}; + + +/** Used for a few events about overlays */ +struct VREvent_Overlay_t +{ + uint64_t overlayHandle; +}; + + +/** Used for a few events about overlays */ +struct VREvent_Status_t +{ + uint32_t statusState; // EVRState enum +}; + +/** Used for keyboard events **/ +struct VREvent_Keyboard_t +{ + char cNewInput[8]; // Up to 11 bytes of new input + uint64_t uUserValue; // Possible flags about the new input +}; + +struct VREvent_Ipd_t +{ + float ipdMeters; +}; + +struct VREvent_Chaperone_t +{ + uint64_t m_nPreviousUniverse; + uint64_t m_nCurrentUniverse; +}; + +/** Not actually used for any events */ +struct VREvent_Reserved_t +{ + uint64_t reserved0; + uint64_t reserved1; +}; + +struct VREvent_PerformanceTest_t +{ + uint32_t m_nFidelityLevel; +}; + +struct VREvent_SeatedZeroPoseReset_t +{ + bool bResetBySystemMenu; +}; + +struct VREvent_Screenshot_t +{ + uint32_t handle; + uint32_t type; +}; + +struct VREvent_ScreenshotProgress_t +{ + float progress; +}; + +struct VREvent_ApplicationLaunch_t +{ + uint32_t pid; + uint32_t unArgsHandle; +}; + +struct VREvent_EditingCameraSurface_t +{ + uint64_t overlayHandle; + uint32_t nVisualMode; +}; + +struct VREvent_MessageOverlay_t +{ + uint32_t unVRMessageOverlayResponse; // vr::VRMessageOverlayResponse enum +}; + +struct VREvent_Property_t +{ + PropertyContainerHandle_t container; + ETrackedDeviceProperty prop; +}; + +/** NOTE!!! If you change this you MUST manually update openvr_interop.cs.py */ +typedef union +{ + VREvent_Reserved_t reserved; + VREvent_Controller_t controller; + VREvent_Mouse_t mouse; + VREvent_Scroll_t scroll; + VREvent_Process_t process; + VREvent_Notification_t notification; + VREvent_Overlay_t overlay; + VREvent_Status_t status; + VREvent_Keyboard_t keyboard; + VREvent_Ipd_t ipd; + VREvent_Chaperone_t chaperone; + VREvent_PerformanceTest_t performanceTest; + VREvent_TouchPadMove_t touchPadMove; + VREvent_SeatedZeroPoseReset_t seatedZeroPoseReset; + VREvent_Screenshot_t screenshot; + VREvent_ScreenshotProgress_t screenshotProgress; + VREvent_ApplicationLaunch_t applicationLaunch; + VREvent_EditingCameraSurface_t cameraSurface; + VREvent_MessageOverlay_t messageOverlay; + VREvent_Property_t property; +} VREvent_Data_t; + + +#if defined(__linux__) || defined(__APPLE__) +// This structure was originally defined mis-packed on Linux, preserved for +// compatibility. +#pragma pack( push, 4 ) +#endif + +/** An event posted by the server to all running applications */ +struct VREvent_t +{ + uint32_t eventType; // EVREventType enum + TrackedDeviceIndex_t trackedDeviceIndex; + float eventAgeSeconds; + // event data must be the end of the struct as its size is variable + VREvent_Data_t data; +}; + +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( pop ) +#endif + +/** The mesh to draw into the stencil (or depth) buffer to perform +* early stencil (or depth) kills of pixels that will never appear on the HMD. +* This mesh draws on all the pixels that will be hidden after distortion. +* +* If the HMD does not provide a visible area mesh pVertexData will be +* NULL and unTriangleCount will be 0. */ +struct HiddenAreaMesh_t +{ + const HmdVector2_t *pVertexData; + uint32_t unTriangleCount; +}; + + +enum EHiddenAreaMeshType +{ + k_eHiddenAreaMesh_Standard = 0, + k_eHiddenAreaMesh_Inverse = 1, + k_eHiddenAreaMesh_LineLoop = 2, + + k_eHiddenAreaMesh_Max = 3, +}; + + +/** Identifies what kind of axis is on the controller at index n. Read this type +* with pVRSystem->Get( nControllerDeviceIndex, Prop_Axis0Type_Int32 + n ); +*/ +enum EVRControllerAxisType +{ + k_eControllerAxis_None = 0, + k_eControllerAxis_TrackPad = 1, + k_eControllerAxis_Joystick = 2, + k_eControllerAxis_Trigger = 3, // Analog trigger data is in the X axis +}; + + +/** contains information about one axis on the controller */ +struct VRControllerAxis_t +{ + 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. + float y; // Ranges from -1.0 to 1.0 for joysticks and track pads. Is always 0.0 for triggers. +}; + + +/** the number of axes in the controller state */ +static const uint32_t k_unControllerStateAxisCount = 5; + + +#if defined(__linux__) || defined(__APPLE__) +// This structure was originally defined mis-packed on Linux, preserved for +// compatibility. +#pragma pack( push, 4 ) +#endif + +/** Holds all the state of a controller at one moment in time. */ +struct VRControllerState001_t +{ + // If packet num matches that on your prior call, then the controller state hasn't been changed since + // your last call and there is no need to process it + uint32_t unPacketNum; + + // bit flags for each of the buttons. Use ButtonMaskFromId to turn an ID into a mask + uint64_t ulButtonPressed; + uint64_t ulButtonTouched; + + // Axis data for the controller's analog inputs + VRControllerAxis_t rAxis[ k_unControllerStateAxisCount ]; +}; +#if defined(__linux__) || defined(__APPLE__) +#pragma pack( pop ) +#endif + + +typedef VRControllerState001_t VRControllerState_t; + + +/** determines how to provide output to the application of various event processing functions. */ +enum EVRControllerEventOutputType +{ + ControllerEventOutput_OSEvents = 0, + ControllerEventOutput_VREvents = 1, +}; + + + +/** Collision Bounds Style */ +enum ECollisionBoundsStyle +{ + COLLISION_BOUNDS_STYLE_BEGINNER = 0, + COLLISION_BOUNDS_STYLE_INTERMEDIATE, + COLLISION_BOUNDS_STYLE_SQUARES, + COLLISION_BOUNDS_STYLE_ADVANCED, + COLLISION_BOUNDS_STYLE_NONE, + + COLLISION_BOUNDS_STYLE_COUNT +}; + +/** Allows the application to customize how the overlay appears in the compositor */ +struct Compositor_OverlaySettings +{ + uint32_t size; // sizeof(Compositor_OverlaySettings) + bool curved, antialias; + float scale, distance, alpha; + float uOffset, vOffset, uScale, vScale; + float gridDivs, gridWidth, gridScale; + HmdMatrix44_t transform; +}; + +/** used to refer to a single VR overlay */ +typedef uint64_t VROverlayHandle_t; + +static const VROverlayHandle_t k_ulOverlayHandleInvalid = 0; + +/** Errors that can occur around VR overlays */ +enum EVROverlayError +{ + VROverlayError_None = 0, + + VROverlayError_UnknownOverlay = 10, + VROverlayError_InvalidHandle = 11, + VROverlayError_PermissionDenied = 12, + VROverlayError_OverlayLimitExceeded = 13, // No more overlays could be created because the maximum number already exist + VROverlayError_WrongVisibilityType = 14, + VROverlayError_KeyTooLong = 15, + VROverlayError_NameTooLong = 16, + VROverlayError_KeyInUse = 17, + VROverlayError_WrongTransformType = 18, + VROverlayError_InvalidTrackedDevice = 19, + VROverlayError_InvalidParameter = 20, + VROverlayError_ThumbnailCantBeDestroyed = 21, + VROverlayError_ArrayTooSmall = 22, + VROverlayError_RequestFailed = 23, + VROverlayError_InvalidTexture = 24, + VROverlayError_UnableToLoadFile = 25, + VROverlayError_KeyboardAlreadyInUse = 26, + VROverlayError_NoNeighbor = 27, + VROverlayError_TooManyMaskPrimitives = 29, + VROverlayError_BadMaskPrimitive = 30, +}; + +/** enum values to pass in to VR_Init to identify whether the application will +* draw a 3D scene. */ +enum EVRApplicationType +{ + VRApplication_Other = 0, // Some other kind of application that isn't covered by the other entries + VRApplication_Scene = 1, // Application will submit 3D frames + VRApplication_Overlay = 2, // Application only interacts with overlays + VRApplication_Background = 3, // Application should not start SteamVR if it's not already running, and should not + // keep it running if everything else quits. + VRApplication_Utility = 4, // Init should not try to load any drivers. The application needs access to utility + // interfaces (like IVRSettings and IVRApplications) but not hardware. + VRApplication_VRMonitor = 5, // Reserved for vrmonitor + VRApplication_SteamWatchdog = 6,// Reserved for Steam + VRApplication_Bootstrapper = 7, // Start up SteamVR + + VRApplication_Max +}; + + +/** error codes for firmware */ +enum EVRFirmwareError +{ + VRFirmwareError_None = 0, + VRFirmwareError_Success = 1, + VRFirmwareError_Fail = 2, +}; + + +/** error codes for notifications */ +enum EVRNotificationError +{ + VRNotificationError_OK = 0, + VRNotificationError_InvalidNotificationId = 100, + VRNotificationError_NotificationQueueFull = 101, + VRNotificationError_InvalidOverlayHandle = 102, + VRNotificationError_SystemWithUserValueAlreadyExists = 103, +}; + + +/** error codes returned by Vr_Init */ + +// Please add adequate error description to https://developer.valvesoftware.com/w/index.php?title=Category:SteamVRHelp +enum EVRInitError +{ + VRInitError_None = 0, + VRInitError_Unknown = 1, + + VRInitError_Init_InstallationNotFound = 100, + VRInitError_Init_InstallationCorrupt = 101, + VRInitError_Init_VRClientDLLNotFound = 102, + VRInitError_Init_FileNotFound = 103, + VRInitError_Init_FactoryNotFound = 104, + VRInitError_Init_InterfaceNotFound = 105, + VRInitError_Init_InvalidInterface = 106, + VRInitError_Init_UserConfigDirectoryInvalid = 107, + VRInitError_Init_HmdNotFound = 108, + VRInitError_Init_NotInitialized = 109, + VRInitError_Init_PathRegistryNotFound = 110, + VRInitError_Init_NoConfigPath = 111, + VRInitError_Init_NoLogPath = 112, + VRInitError_Init_PathRegistryNotWritable = 113, + VRInitError_Init_AppInfoInitFailed = 114, + VRInitError_Init_Retry = 115, // Used internally to cause retries to vrserver + VRInitError_Init_InitCanceledByUser = 116, // The calling application should silently exit. The user canceled app startup + VRInitError_Init_AnotherAppLaunching = 117, + VRInitError_Init_SettingsInitFailed = 118, + VRInitError_Init_ShuttingDown = 119, + VRInitError_Init_TooManyObjects = 120, + VRInitError_Init_NoServerForBackgroundApp = 121, + VRInitError_Init_NotSupportedWithCompositor = 122, + VRInitError_Init_NotAvailableToUtilityApps = 123, + VRInitError_Init_Internal = 124, + VRInitError_Init_HmdDriverIdIsNone = 125, + VRInitError_Init_HmdNotFoundPresenceFailed = 126, + VRInitError_Init_VRMonitorNotFound = 127, + VRInitError_Init_VRMonitorStartupFailed = 128, + VRInitError_Init_LowPowerWatchdogNotSupported = 129, + VRInitError_Init_InvalidApplicationType = 130, + VRInitError_Init_NotAvailableToWatchdogApps = 131, + VRInitError_Init_WatchdogDisabledInSettings = 132, + VRInitError_Init_VRDashboardNotFound = 133, + VRInitError_Init_VRDashboardStartupFailed = 134, + VRInitError_Init_VRHomeNotFound = 135, + VRInitError_Init_VRHomeStartupFailed = 136, + + VRInitError_Driver_Failed = 200, + VRInitError_Driver_Unknown = 201, + VRInitError_Driver_HmdUnknown = 202, + VRInitError_Driver_NotLoaded = 203, + VRInitError_Driver_RuntimeOutOfDate = 204, + VRInitError_Driver_HmdInUse = 205, + VRInitError_Driver_NotCalibrated = 206, + VRInitError_Driver_CalibrationInvalid = 207, + VRInitError_Driver_HmdDisplayNotFound = 208, + VRInitError_Driver_TrackedDeviceInterfaceUnknown = 209, + // VRInitError_Driver_HmdDisplayNotFoundAfterFix = 210, // not needed: here for historic reasons + VRInitError_Driver_HmdDriverIdOutOfBounds = 211, + VRInitError_Driver_HmdDisplayMirrored = 212, + + VRInitError_IPC_ServerInitFailed = 300, + VRInitError_IPC_ConnectFailed = 301, + VRInitError_IPC_SharedStateInitFailed = 302, + VRInitError_IPC_CompositorInitFailed = 303, + VRInitError_IPC_MutexInitFailed = 304, + VRInitError_IPC_Failed = 305, + VRInitError_IPC_CompositorConnectFailed = 306, + VRInitError_IPC_CompositorInvalidConnectResponse = 307, + VRInitError_IPC_ConnectFailedAfterMultipleAttempts = 308, + + VRInitError_Compositor_Failed = 400, + VRInitError_Compositor_D3D11HardwareRequired = 401, + VRInitError_Compositor_FirmwareRequiresUpdate = 402, + VRInitError_Compositor_OverlayInitFailed = 403, + VRInitError_Compositor_ScreenshotsInitFailed = 404, + VRInitError_Compositor_UnableToCreateDevice = 405, + + VRInitError_VendorSpecific_UnableToConnectToOculusRuntime = 1000, + + VRInitError_VendorSpecific_HmdFound_CantOpenDevice = 1101, + VRInitError_VendorSpecific_HmdFound_UnableToRequestConfigStart = 1102, + VRInitError_VendorSpecific_HmdFound_NoStoredConfig = 1103, + VRInitError_VendorSpecific_HmdFound_ConfigTooBig = 1104, + VRInitError_VendorSpecific_HmdFound_ConfigTooSmall = 1105, + VRInitError_VendorSpecific_HmdFound_UnableToInitZLib = 1106, + VRInitError_VendorSpecific_HmdFound_CantReadFirmwareVersion = 1107, + VRInitError_VendorSpecific_HmdFound_UnableToSendUserDataStart = 1108, + VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataStart = 1109, + VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataNext = 1110, + VRInitError_VendorSpecific_HmdFound_UserDataAddressRange = 1111, + VRInitError_VendorSpecific_HmdFound_UserDataError = 1112, + VRInitError_VendorSpecific_HmdFound_ConfigFailedSanityCheck = 1113, + + VRInitError_Steam_SteamInstallationNotFound = 2000, +}; + +enum EVRScreenshotType +{ + VRScreenshotType_None = 0, + VRScreenshotType_Mono = 1, // left eye only + VRScreenshotType_Stereo = 2, + VRScreenshotType_Cubemap = 3, + VRScreenshotType_MonoPanorama = 4, + VRScreenshotType_StereoPanorama = 5 +}; + +enum EVRScreenshotPropertyFilenames +{ + VRScreenshotPropertyFilenames_Preview = 0, + VRScreenshotPropertyFilenames_VR = 1, +}; + +enum EVRTrackedCameraError +{ + VRTrackedCameraError_None = 0, + VRTrackedCameraError_OperationFailed = 100, + VRTrackedCameraError_InvalidHandle = 101, + VRTrackedCameraError_InvalidFrameHeaderVersion = 102, + VRTrackedCameraError_OutOfHandles = 103, + VRTrackedCameraError_IPCFailure = 104, + VRTrackedCameraError_NotSupportedForThisDevice = 105, + VRTrackedCameraError_SharedMemoryFailure = 106, + VRTrackedCameraError_FrameBufferingFailure = 107, + VRTrackedCameraError_StreamSetupFailure = 108, + VRTrackedCameraError_InvalidGLTextureId = 109, + VRTrackedCameraError_InvalidSharedTextureHandle = 110, + VRTrackedCameraError_FailedToGetGLTextureId = 111, + VRTrackedCameraError_SharedTextureFailure = 112, + VRTrackedCameraError_NoFrameAvailable = 113, + VRTrackedCameraError_InvalidArgument = 114, + VRTrackedCameraError_InvalidFrameBufferSize = 115, +}; + +enum EVRTrackedCameraFrameType +{ + VRTrackedCameraFrameType_Distorted = 0, // This is the camera video frame size in pixels, still distorted. + VRTrackedCameraFrameType_Undistorted, // In pixels, an undistorted inscribed rectangle region without invalid regions. This size is subject to changes shortly. + VRTrackedCameraFrameType_MaximumUndistorted, // In pixels, maximum undistorted with invalid regions. Non zero alpha component identifies valid regions. + MAX_CAMERA_FRAME_TYPES +}; + +typedef uint64_t TrackedCameraHandle_t; +#define INVALID_TRACKED_CAMERA_HANDLE ((vr::TrackedCameraHandle_t)0) + +struct CameraVideoStreamFrameHeader_t +{ + EVRTrackedCameraFrameType eFrameType; + + uint32_t nWidth; + uint32_t nHeight; + uint32_t nBytesPerPixel; + + uint32_t nFrameSequence; + + TrackedDevicePose_t standingTrackedDevicePose; +}; + +// Screenshot types +typedef uint32_t ScreenshotHandle_t; + +static const uint32_t k_unScreenshotHandleInvalid = 0; + +#pragma pack( pop ) + +// figure out how to import from the VR API dll +#if defined(_WIN32) + +#ifdef VR_API_EXPORT +#define VR_INTERFACE extern "C" __declspec( dllexport ) +#else +#define VR_INTERFACE extern "C" __declspec( dllimport ) +#endif + +#elif defined(__GNUC__) || defined(COMPILER_GCC) || defined(__APPLE__) + +#ifdef VR_API_EXPORT +#define VR_INTERFACE extern "C" __attribute__((visibility("default"))) +#else +#define VR_INTERFACE extern "C" +#endif + +#else +#error "Unsupported Platform." +#endif + + +#if defined( _WIN32 ) +#define VR_CALLTYPE __cdecl +#else +#define VR_CALLTYPE +#endif + +} // namespace vr + +#endif // _INCLUDE_VRTYPES_H + + +// vrannotation.h +#ifdef API_GEN +# define VR_CLANG_ATTR(ATTR) __attribute__((annotate( ATTR ))) +#else +# define VR_CLANG_ATTR(ATTR) +#endif + +#define VR_METHOD_DESC(DESC) VR_CLANG_ATTR( "desc:" #DESC ";" ) +#define VR_IGNOREATTR() VR_CLANG_ATTR( "ignore" ) +#define VR_OUT_STRUCT() VR_CLANG_ATTR( "out_struct: ;" ) +#define VR_OUT_STRING() VR_CLANG_ATTR( "out_string: ;" ) +#define VR_OUT_ARRAY_CALL(COUNTER,FUNCTION,PARAMS) VR_CLANG_ATTR( "out_array_call:" #COUNTER "," #FUNCTION "," #PARAMS ";" ) +#define VR_OUT_ARRAY_COUNT(COUNTER) VR_CLANG_ATTR( "out_array_count:" #COUNTER ";" ) +#define VR_ARRAY_COUNT(COUNTER) VR_CLANG_ATTR( "array_count:" #COUNTER ";" ) +#define VR_ARRAY_COUNT_D(COUNTER, DESC) VR_CLANG_ATTR( "array_count:" #COUNTER ";desc:" #DESC ) +#define VR_BUFFER_COUNT(COUNTER) VR_CLANG_ATTR( "buffer_count:" #COUNTER ";" ) +#define VR_OUT_BUFFER_COUNT(COUNTER) VR_CLANG_ATTR( "out_buffer_count:" #COUNTER ";" ) +#define VR_OUT_STRING_COUNT(COUNTER) VR_CLANG_ATTR( "out_string_count:" #COUNTER ";" ) + +// vrtrackedcameratypes.h +#ifndef _VRTRACKEDCAMERATYPES_H +#define _VRTRACKEDCAMERATYPES_H + +namespace vr +{ + +#pragma pack( push, 8 ) + +enum ECameraVideoStreamFormat +{ + CVS_FORMAT_UNKNOWN = 0, + CVS_FORMAT_RAW10 = 1, // 10 bits per pixel + CVS_FORMAT_NV12 = 2, // 12 bits per pixel + CVS_FORMAT_RGB24 = 3, // 24 bits per pixel + CVS_MAX_FORMATS +}; + +enum ECameraCompatibilityMode +{ + CAMERA_COMPAT_MODE_BULK_DEFAULT = 0, + CAMERA_COMPAT_MODE_BULK_64K_DMA, + CAMERA_COMPAT_MODE_BULK_16K_DMA, + CAMERA_COMPAT_MODE_BULK_8K_DMA, + CAMERA_COMPAT_MODE_ISO_52FPS, + CAMERA_COMPAT_MODE_ISO_50FPS, + CAMERA_COMPAT_MODE_ISO_48FPS, + CAMERA_COMPAT_MODE_ISO_46FPS, + CAMERA_COMPAT_MODE_ISO_44FPS, + CAMERA_COMPAT_MODE_ISO_42FPS, + CAMERA_COMPAT_MODE_ISO_40FPS, + CAMERA_COMPAT_MODE_ISO_35FPS, + CAMERA_COMPAT_MODE_ISO_30FPS, + MAX_CAMERA_COMPAT_MODES +}; + +#ifdef _MSC_VER +#define VR_CAMERA_DECL_ALIGN( x ) __declspec( align( x ) ) +#else +#define VR_CAMERA_DECL_ALIGN( x ) // +#endif + +#define MAX_CAMERA_FRAME_SHARED_HANDLES 4 + +VR_CAMERA_DECL_ALIGN( 8 ) struct CameraVideoStreamFrame_t +{ + ECameraVideoStreamFormat m_nStreamFormat; + + uint32_t m_nWidth; + uint32_t m_nHeight; + + uint32_t m_nImageDataSize; // Based on stream format, width, height + + uint32_t m_nFrameSequence; // Starts from 0 when stream starts. + + uint32_t m_nBufferIndex; // Identifies which buffer the image data is hosted + uint32_t m_nBufferCount; // Total number of configured buffers + + uint32_t m_nExposureTime; + + uint32_t m_nISPFrameTimeStamp; // Driver provided time stamp per driver centric time base + uint32_t m_nISPReferenceTimeStamp; + uint32_t m_nSyncCounter; + + uint32_t m_nCamSyncEvents; + uint32_t m_nISPSyncEvents; + + double m_flReferenceCamSyncTime; + + double m_flFrameElapsedTime; // Starts from 0 when stream starts. In seconds. + double m_flFrameDeliveryRate; + + double m_flFrameCaptureTime_DriverAbsolute; // In USB time, via AuxEvent + double m_flFrameCaptureTime_ServerRelative; // In System time within the server + uint64_t m_nFrameCaptureTicks_ServerAbsolute; // In system ticks within the server + double m_flFrameCaptureTime_ClientRelative; // At the client, relative to when the frame was exposed/captured. + + double m_flSyncMarkerError; + + TrackedDevicePose_t m_StandingTrackedDevicePose; // Supplied by HMD layer when used as a tracked camera + + uint64_t m_pImageData; +}; + +#pragma pack( pop ) + +} + +#endif // _VRTRACKEDCAMERATYPES_H +// ivrsettings.h +namespace vr +{ + enum EVRSettingsError + { + VRSettingsError_None = 0, + VRSettingsError_IPCFailed = 1, + VRSettingsError_WriteFailed = 2, + VRSettingsError_ReadFailed = 3, + VRSettingsError_JsonParseFailed = 4, + VRSettingsError_UnsetSettingHasNoDefault = 5, // This will be returned if the setting does not appear in the appropriate default file and has not been set + }; + + // The maximum length of a settings key + static const uint32_t k_unMaxSettingsKeyLength = 128; + + class IVRSettings + { + public: + virtual const char *GetSettingsErrorNameFromEnum( EVRSettingsError eError ) = 0; + + // Returns true if file sync occurred (force or settings dirty) + virtual bool Sync( bool bForce = false, EVRSettingsError *peError = nullptr ) = 0; + + virtual void SetBool( const char *pchSection, const char *pchSettingsKey, bool bValue, EVRSettingsError *peError = nullptr ) = 0; + virtual void SetInt32( const char *pchSection, const char *pchSettingsKey, int32_t nValue, EVRSettingsError *peError = nullptr ) = 0; + virtual void SetFloat( const char *pchSection, const char *pchSettingsKey, float flValue, EVRSettingsError *peError = nullptr ) = 0; + virtual void SetString( const char *pchSection, const char *pchSettingsKey, const char *pchValue, EVRSettingsError *peError = nullptr ) = 0; + + // Users of the system need to provide a proper default in default.vrsettings in the resources/settings/ directory + // of either the runtime or the driver_xxx directory. Otherwise the default will be false, 0, 0.0 or "" + virtual bool GetBool( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0; + virtual int32_t GetInt32( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0; + virtual float GetFloat( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0; + virtual void GetString( const char *pchSection, const char *pchSettingsKey, VR_OUT_STRING() char *pchValue, uint32_t unValueLen, EVRSettingsError *peError = nullptr ) = 0; + + virtual void RemoveSection( const char *pchSection, EVRSettingsError *peError = nullptr ) = 0; + virtual void RemoveKeyInSection( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0; + }; + + //----------------------------------------------------------------------------- + static const char * const IVRSettings_Version = "IVRSettings_002"; + + //----------------------------------------------------------------------------- + // steamvr keys + static const char * const k_pch_SteamVR_Section = "steamvr"; + static const char * const k_pch_SteamVR_RequireHmd_String = "requireHmd"; + static const char * const k_pch_SteamVR_ForcedDriverKey_String = "forcedDriver"; + static const char * const k_pch_SteamVR_ForcedHmdKey_String = "forcedHmd"; + static const char * const k_pch_SteamVR_DisplayDebug_Bool = "displayDebug"; + static const char * const k_pch_SteamVR_DebugProcessPipe_String = "debugProcessPipe"; + static const char * const k_pch_SteamVR_DisplayDebugX_Int32 = "displayDebugX"; + static const char * const k_pch_SteamVR_DisplayDebugY_Int32 = "displayDebugY"; + static const char * const k_pch_SteamVR_SendSystemButtonToAllApps_Bool= "sendSystemButtonToAllApps"; + static const char * const k_pch_SteamVR_LogLevel_Int32 = "loglevel"; + static const char * const k_pch_SteamVR_IPD_Float = "ipd"; + static const char * const k_pch_SteamVR_Background_String = "background"; + static const char * const k_pch_SteamVR_BackgroundUseDomeProjection_Bool = "backgroundUseDomeProjection"; + static const char * const k_pch_SteamVR_BackgroundCameraHeight_Float = "backgroundCameraHeight"; + static const char * const k_pch_SteamVR_BackgroundDomeRadius_Float = "backgroundDomeRadius"; + static const char * const k_pch_SteamVR_GridColor_String = "gridColor"; + static const char * const k_pch_SteamVR_PlayAreaColor_String = "playAreaColor"; + static const char * const k_pch_SteamVR_ShowStage_Bool = "showStage"; + static const char * const k_pch_SteamVR_ActivateMultipleDrivers_Bool = "activateMultipleDrivers"; + static const char * const k_pch_SteamVR_DirectMode_Bool = "directMode"; + static const char * const k_pch_SteamVR_DirectModeEdidVid_Int32 = "directModeEdidVid"; + static const char * const k_pch_SteamVR_DirectModeEdidPid_Int32 = "directModeEdidPid"; + static const char * const k_pch_SteamVR_UsingSpeakers_Bool = "usingSpeakers"; + static const char * const k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float = "speakersForwardYawOffsetDegrees"; + static const char * const k_pch_SteamVR_BaseStationPowerManagement_Bool = "basestationPowerManagement"; + static const char * const k_pch_SteamVR_NeverKillProcesses_Bool = "neverKillProcesses"; + static const char * const k_pch_SteamVR_SupersampleScale_Float = "supersampleScale"; + static const char * const k_pch_SteamVR_AllowAsyncReprojection_Bool = "allowAsyncReprojection"; + static const char * const k_pch_SteamVR_AllowReprojection_Bool = "allowInterleavedReprojection"; + static const char * const k_pch_SteamVR_ForceReprojection_Bool = "forceReprojection"; + static const char * const k_pch_SteamVR_ForceFadeOnBadTracking_Bool = "forceFadeOnBadTracking"; + static const char * const k_pch_SteamVR_DefaultMirrorView_Int32 = "defaultMirrorView"; + static const char * const k_pch_SteamVR_ShowMirrorView_Bool = "showMirrorView"; + static const char * const k_pch_SteamVR_MirrorViewGeometry_String = "mirrorViewGeometry"; + static const char * const k_pch_SteamVR_StartMonitorFromAppLaunch = "startMonitorFromAppLaunch"; + static const char * const k_pch_SteamVR_StartCompositorFromAppLaunch_Bool = "startCompositorFromAppLaunch"; + static const char * const k_pch_SteamVR_StartDashboardFromAppLaunch_Bool = "startDashboardFromAppLaunch"; + static const char * const k_pch_SteamVR_StartOverlayAppsFromDashboard_Bool = "startOverlayAppsFromDashboard"; + static const char * const k_pch_SteamVR_EnableHomeApp = "enableHomeApp"; + static const char * const k_pch_SteamVR_CycleBackgroundImageTimeSec_Int32 = "CycleBackgroundImageTimeSec"; + static const char * const k_pch_SteamVR_RetailDemo_Bool = "retailDemo"; + static const char * const k_pch_SteamVR_IpdOffset_Float = "ipdOffset"; + static const char * const k_pch_SteamVR_AllowSupersampleFiltering_Bool = "allowSupersampleFiltering"; + + //----------------------------------------------------------------------------- + // lighthouse keys + static const char * const k_pch_Lighthouse_Section = "driver_lighthouse"; + static const char * const k_pch_Lighthouse_DisableIMU_Bool = "disableimu"; + static const char * const k_pch_Lighthouse_UseDisambiguation_String = "usedisambiguation"; + static const char * const k_pch_Lighthouse_DisambiguationDebug_Int32 = "disambiguationdebug"; + static const char * const k_pch_Lighthouse_PrimaryBasestation_Int32 = "primarybasestation"; + static const char * const k_pch_Lighthouse_DBHistory_Bool = "dbhistory"; + + //----------------------------------------------------------------------------- + // null keys + static const char * const k_pch_Null_Section = "driver_null"; + static const char * const k_pch_Null_SerialNumber_String = "serialNumber"; + static const char * const k_pch_Null_ModelNumber_String = "modelNumber"; + static const char * const k_pch_Null_WindowX_Int32 = "windowX"; + static const char * const k_pch_Null_WindowY_Int32 = "windowY"; + static const char * const k_pch_Null_WindowWidth_Int32 = "windowWidth"; + static const char * const k_pch_Null_WindowHeight_Int32 = "windowHeight"; + static const char * const k_pch_Null_RenderWidth_Int32 = "renderWidth"; + static const char * const k_pch_Null_RenderHeight_Int32 = "renderHeight"; + static const char * const k_pch_Null_SecondsFromVsyncToPhotons_Float = "secondsFromVsyncToPhotons"; + static const char * const k_pch_Null_DisplayFrequency_Float = "displayFrequency"; + + //----------------------------------------------------------------------------- + // user interface keys + static const char * const k_pch_UserInterface_Section = "userinterface"; + static const char * const k_pch_UserInterface_StatusAlwaysOnTop_Bool = "StatusAlwaysOnTop"; + static const char * const k_pch_UserInterface_MinimizeToTray_Bool = "MinimizeToTray"; + static const char * const k_pch_UserInterface_Screenshots_Bool = "screenshots"; + static const char * const k_pch_UserInterface_ScreenshotType_Int = "screenshotType"; + + //----------------------------------------------------------------------------- + // notification keys + static const char * const k_pch_Notifications_Section = "notifications"; + static const char * const k_pch_Notifications_DoNotDisturb_Bool = "DoNotDisturb"; + + //----------------------------------------------------------------------------- + // keyboard keys + static const char * const k_pch_Keyboard_Section = "keyboard"; + static const char * const k_pch_Keyboard_TutorialCompletions = "TutorialCompletions"; + static const char * const k_pch_Keyboard_ScaleX = "ScaleX"; + static const char * const k_pch_Keyboard_ScaleY = "ScaleY"; + static const char * const k_pch_Keyboard_OffsetLeftX = "OffsetLeftX"; + static const char * const k_pch_Keyboard_OffsetRightX = "OffsetRightX"; + static const char * const k_pch_Keyboard_OffsetY = "OffsetY"; + static const char * const k_pch_Keyboard_Smoothing = "Smoothing"; + + //----------------------------------------------------------------------------- + // perf keys + static const char * const k_pch_Perf_Section = "perfcheck"; + static const char * const k_pch_Perf_HeuristicActive_Bool = "heuristicActive"; + static const char * const k_pch_Perf_NotifyInHMD_Bool = "warnInHMD"; + static const char * const k_pch_Perf_NotifyOnlyOnce_Bool = "warnOnlyOnce"; + static const char * const k_pch_Perf_AllowTimingStore_Bool = "allowTimingStore"; + static const char * const k_pch_Perf_SaveTimingsOnExit_Bool = "saveTimingsOnExit"; + static const char * const k_pch_Perf_TestData_Float = "perfTestData"; + static const char * const k_pch_Perf_LinuxGPUProfiling_Bool = "linuxGPUProfiling"; + + //----------------------------------------------------------------------------- + // collision bounds keys + static const char * const k_pch_CollisionBounds_Section = "collisionBounds"; + static const char * const k_pch_CollisionBounds_Style_Int32 = "CollisionBoundsStyle"; + static const char * const k_pch_CollisionBounds_GroundPerimeterOn_Bool = "CollisionBoundsGroundPerimeterOn"; + static const char * const k_pch_CollisionBounds_CenterMarkerOn_Bool = "CollisionBoundsCenterMarkerOn"; + static const char * const k_pch_CollisionBounds_PlaySpaceOn_Bool = "CollisionBoundsPlaySpaceOn"; + static const char * const k_pch_CollisionBounds_FadeDistance_Float = "CollisionBoundsFadeDistance"; + static const char * const k_pch_CollisionBounds_ColorGammaR_Int32 = "CollisionBoundsColorGammaR"; + static const char * const k_pch_CollisionBounds_ColorGammaG_Int32 = "CollisionBoundsColorGammaG"; + static const char * const k_pch_CollisionBounds_ColorGammaB_Int32 = "CollisionBoundsColorGammaB"; + static const char * const k_pch_CollisionBounds_ColorGammaA_Int32 = "CollisionBoundsColorGammaA"; + + //----------------------------------------------------------------------------- + // camera keys + static const char * const k_pch_Camera_Section = "camera"; + static const char * const k_pch_Camera_EnableCamera_Bool = "enableCamera"; + static const char * const k_pch_Camera_EnableCameraInDashboard_Bool = "enableCameraInDashboard"; + static const char * const k_pch_Camera_EnableCameraForCollisionBounds_Bool = "enableCameraForCollisionBounds"; + static const char * const k_pch_Camera_EnableCameraForRoomView_Bool = "enableCameraForRoomView"; + static const char * const k_pch_Camera_BoundsColorGammaR_Int32 = "cameraBoundsColorGammaR"; + static const char * const k_pch_Camera_BoundsColorGammaG_Int32 = "cameraBoundsColorGammaG"; + static const char * const k_pch_Camera_BoundsColorGammaB_Int32 = "cameraBoundsColorGammaB"; + static const char * const k_pch_Camera_BoundsColorGammaA_Int32 = "cameraBoundsColorGammaA"; + static const char * const k_pch_Camera_BoundsStrength_Int32 = "cameraBoundsStrength"; + + //----------------------------------------------------------------------------- + // audio keys + static const char * const k_pch_audio_Section = "audio"; + static const char * const k_pch_audio_OnPlaybackDevice_String = "onPlaybackDevice"; + static const char * const k_pch_audio_OnRecordDevice_String = "onRecordDevice"; + static const char * const k_pch_audio_OnPlaybackMirrorDevice_String = "onPlaybackMirrorDevice"; + static const char * const k_pch_audio_OffPlaybackDevice_String = "offPlaybackDevice"; + static const char * const k_pch_audio_OffRecordDevice_String = "offRecordDevice"; + static const char * const k_pch_audio_VIVEHDMIGain = "viveHDMIGain"; + + //----------------------------------------------------------------------------- + // power management keys + static const char * const k_pch_Power_Section = "power"; + static const char * const k_pch_Power_PowerOffOnExit_Bool = "powerOffOnExit"; + static const char * const k_pch_Power_TurnOffScreensTimeout_Float = "turnOffScreensTimeout"; + static const char * const k_pch_Power_TurnOffControllersTimeout_Float = "turnOffControllersTimeout"; + static const char * const k_pch_Power_ReturnToWatchdogTimeout_Float = "returnToWatchdogTimeout"; + static const char * const k_pch_Power_AutoLaunchSteamVROnButtonPress = "autoLaunchSteamVROnButtonPress"; + + //----------------------------------------------------------------------------- + // dashboard keys + static const char * const k_pch_Dashboard_Section = "dashboard"; + static const char * const k_pch_Dashboard_EnableDashboard_Bool = "enableDashboard"; + static const char * const k_pch_Dashboard_ArcadeMode_Bool = "arcadeMode"; + + //----------------------------------------------------------------------------- + // model skin keys + static const char * const k_pch_modelskin_Section = "modelskins"; + + //----------------------------------------------------------------------------- + // driver keys - These could be checked in any driver_ section + static const char * const k_pch_Driver_Enable_Bool = "enable"; + +} // namespace vr + +// iservertrackeddevicedriver.h +namespace vr +{ + + +struct DriverPoseQuaternion_t +{ + double w, x, y, z; +}; + +struct DriverPose_t +{ + /* Time offset of this pose, in seconds from the actual time of the pose, + * relative to the time of the PoseUpdated() call made by the driver. + */ + double poseTimeOffset; + + /* Generally, the pose maintained by a driver + * is in an inertial coordinate system different + * from the world system of x+ right, y+ up, z+ back. + * Also, the driver is not usually tracking the "head" position, + * but instead an internal IMU or another reference point in the HMD. + * The following two transforms transform positions and orientations + * to app world space from driver world space, + * and to HMD head space from driver local body space. + * + * We maintain the driver pose state in its internal coordinate system, + * so we can do the pose prediction math without having to + * use angular acceleration. A driver's angular acceleration is generally not measured, + * and is instead calculated from successive samples of angular velocity. + * This leads to a noisy angular acceleration values, which are also + * lagged due to the filtering required to reduce noise to an acceptable level. + */ + vr::HmdQuaternion_t qWorldFromDriverRotation; + double vecWorldFromDriverTranslation[ 3 ]; + + vr::HmdQuaternion_t qDriverFromHeadRotation; + double vecDriverFromHeadTranslation[ 3 ]; + + /* State of driver pose, in meters and radians. */ + /* Position of the driver tracking reference in driver world space + * +[0] (x) is right + * +[1] (y) is up + * -[2] (z) is forward + */ + double vecPosition[ 3 ]; + + /* Velocity of the pose in meters/second */ + double vecVelocity[ 3 ]; + + /* Acceleration of the pose in meters/second */ + double vecAcceleration[ 3 ]; + + /* Orientation of the tracker, represented as a quaternion */ + vr::HmdQuaternion_t qRotation; + + /* Angular velocity of the pose in axis-angle + * representation. The direction is the angle of + * rotation and the magnitude is the angle around + * that axis in radians/second. */ + double vecAngularVelocity[ 3 ]; + + /* Angular acceleration of the pose in axis-angle + * representation. The direction is the angle of + * rotation and the magnitude is the angle around + * that axis in radians/second^2. */ + double vecAngularAcceleration[ 3 ]; + + ETrackingResult result; + + bool poseIsValid; + bool willDriftInYaw; + bool shouldApplyHeadModel; + bool deviceIsConnected; +}; + + +// ---------------------------------------------------------------------------------------------- +// Purpose: Represents a single tracked device in a driver +// ---------------------------------------------------------------------------------------------- +class ITrackedDeviceServerDriver +{ +public: + + // ------------------------------------ + // Management Methods + // ------------------------------------ + /** This is called before an HMD is returned to the application. It will always be + * called before any display or tracking methods. Memory and processor use by the + * ITrackedDeviceServerDriver object should be kept to a minimum until it is activated. + * The pose listener is guaranteed to be valid until Deactivate is called, but + * should not be used after that point. */ + virtual EVRInitError Activate( uint32_t unObjectId ) = 0; + + /** This is called when The VR system is switching from this Hmd being the active display + * to another Hmd being the active display. The driver should clean whatever memory + * and thread use it can when it is deactivated */ + virtual void Deactivate() = 0; + + /** Handles a request from the system to put this device into standby mode. What that means is defined per-device. */ + virtual void EnterStandby() = 0; + + /** Requests a component interface of the driver for device-specific functionality. The driver should return NULL + * if the requested interface or version is not supported. */ + virtual void *GetComponent( const char *pchComponentNameAndVersion ) = 0; + + /** A VR Client has made this debug request of the driver. The set of valid requests is entirely + * up to the driver and the client to figure out, as is the format of the response. Responses that + * exceed the length of the supplied buffer should be truncated and null terminated */ + virtual void DebugRequest( const char *pchRequest, char *pchResponseBuffer, uint32_t unResponseBufferSize ) = 0; + + // ------------------------------------ + // Tracking Methods + // ------------------------------------ + virtual DriverPose_t GetPose() = 0; +}; + + + +static const char *ITrackedDeviceServerDriver_Version = "ITrackedDeviceServerDriver_005"; + +} +// ivrdisplaycomponent.h +namespace vr +{ + + + // ---------------------------------------------------------------------------------------------- + // Purpose: The display component on a single tracked device + // ---------------------------------------------------------------------------------------------- + class IVRDisplayComponent + { + public: + + // ------------------------------------ + // Display Methods + // ------------------------------------ + + /** Size and position that the window needs to be on the VR display. */ + virtual void GetWindowBounds( int32_t *pnX, int32_t *pnY, uint32_t *pnWidth, uint32_t *pnHeight ) = 0; + + /** Returns true if the display is extending the desktop. */ + virtual bool IsDisplayOnDesktop( ) = 0; + + /** Returns true if the display is real and not a fictional display. */ + virtual bool IsDisplayRealDisplay( ) = 0; + + /** Suggested size for the intermediate render target that the distortion pulls from. */ + virtual void GetRecommendedRenderTargetSize( uint32_t *pnWidth, uint32_t *pnHeight ) = 0; + + /** Gets the viewport in the frame buffer to draw the output of the distortion into */ + virtual void GetEyeOutputViewport( EVREye eEye, uint32_t *pnX, uint32_t *pnY, uint32_t *pnWidth, uint32_t *pnHeight ) = 0; + + /** The components necessary to build your own projection matrix in case your + * application is doing something fancy like infinite Z */ + virtual void GetProjectionRaw( EVREye eEye, float *pfLeft, float *pfRight, float *pfTop, float *pfBottom ) = 0; + + /** Returns the result of the distortion function for the specified eye and input UVs. UVs go from 0,0 in + * the upper left of that eye's viewport and 1,1 in the lower right of that eye's viewport. */ + virtual DistortionCoordinates_t ComputeDistortion( EVREye eEye, float fU, float fV ) = 0; + + }; + + static const char *IVRDisplayComponent_Version = "IVRDisplayComponent_002"; + +} + +// ivrdriverdirectmodecomponent.h +namespace vr +{ + + + // ---------------------------------------------------------------------------------------------- + // Purpose: This component is used for drivers that implement direct mode entirely on their own + // without allowing the VR Compositor to own the window/device. Chances are you don't + // need to implement this component in your driver. + // ---------------------------------------------------------------------------------------------- + class IVRDriverDirectModeComponent + { + public: + + // ----------------------------------- + // Direct mode methods + // ----------------------------------- + + /** Specific to Oculus compositor support, textures supplied must be created using this method. */ + virtual void CreateSwapTextureSet( uint32_t unPid, uint32_t unFormat, uint32_t unWidth, uint32_t unHeight, vr::SharedTextureHandle_t( *pSharedTextureHandles )[ 3 ] ) {} + + /** Used to textures created using CreateSwapTextureSet. Only one of the set's handles needs to be used to destroy the entire set. */ + virtual void DestroySwapTextureSet( vr::SharedTextureHandle_t sharedTextureHandle ) {} + + /** Used to purge all texture sets for a given process. */ + virtual void DestroyAllSwapTextureSets( uint32_t unPid ) {} + + /** After Present returns, calls this to get the next index to use for rendering. */ + virtual void GetNextSwapTextureSetIndex( vr::SharedTextureHandle_t sharedTextureHandles[ 2 ], uint32_t( *pIndices )[ 2 ] ) {} + + /** Call once per layer to draw for this frame. One shared texture handle per eye. Textures must be created + * using CreateSwapTextureSet and should be alternated per frame. Call Present once all layers have been submitted. */ + virtual void SubmitLayer( vr::SharedTextureHandle_t sharedTextureHandles[ 2 ], const vr::VRTextureBounds_t( &bounds )[ 2 ], const vr::HmdMatrix34_t *pPose ) {} + + /** Submits queued layers for display. */ + virtual void Present( vr::SharedTextureHandle_t syncTexture ) {} + + }; + + static const char *IVRDriverDirectModeComponent_Version = "IVRDriverDirectModeComponent_002"; + +} + +// ivrcontrollercomponent.h +namespace vr +{ + + + // ---------------------------------------------------------------------------------------------- + // Purpose: Controller access on a single tracked device. + // ---------------------------------------------------------------------------------------------- + class IVRControllerComponent + { + public: + + // ------------------------------------ + // Controller Methods + // ------------------------------------ + + /** Gets the current state of a controller. */ + virtual VRControllerState_t GetControllerState( ) = 0; + + /** Returns a uint64 property. If the property is not available this function will return 0. */ + virtual bool TriggerHapticPulse( uint32_t unAxisId, uint16_t usPulseDurationMicroseconds ) = 0; + + }; + + + + static const char *IVRControllerComponent_Version = "IVRControllerComponent_001"; + +} +// ivrcameracomponent.h +namespace vr +{ + //----------------------------------------------------------------------------- + //----------------------------------------------------------------------------- + class ICameraVideoSinkCallback + { + public: + virtual void OnCameraVideoSinkCallback() = 0; + }; + + // ---------------------------------------------------------------------------------------------- + // Purpose: The camera on a single tracked device + // ---------------------------------------------------------------------------------------------- + class IVRCameraComponent + { + public: + // ------------------------------------ + // Camera Methods + // ------------------------------------ + virtual bool GetCameraFrameDimensions( vr::ECameraVideoStreamFormat nVideoStreamFormat, uint32_t *pWidth, uint32_t *pHeight ) = 0; + virtual bool GetCameraFrameBufferingRequirements( int *pDefaultFrameQueueSize, uint32_t *pFrameBufferDataSize ) = 0; + virtual bool SetCameraFrameBuffering( int nFrameBufferCount, void **ppFrameBuffers, uint32_t nFrameBufferDataSize ) = 0; + virtual bool SetCameraVideoStreamFormat( vr::ECameraVideoStreamFormat nVideoStreamFormat ) = 0; + virtual vr::ECameraVideoStreamFormat GetCameraVideoStreamFormat() = 0; + virtual bool StartVideoStream() = 0; + virtual void StopVideoStream() = 0; + virtual bool IsVideoStreamActive( bool *pbPaused, float *pflElapsedTime ) = 0; + virtual const vr::CameraVideoStreamFrame_t *GetVideoStreamFrame() = 0; + virtual void ReleaseVideoStreamFrame( const vr::CameraVideoStreamFrame_t *pFrameImage ) = 0; + virtual bool SetAutoExposure( bool bEnable ) = 0; + virtual bool PauseVideoStream() = 0; + virtual bool ResumeVideoStream() = 0; + virtual bool GetCameraDistortion( float flInputU, float flInputV, float *pflOutputU, float *pflOutputV ) = 0; + virtual bool GetCameraProjection( vr::EVRTrackedCameraFrameType eFrameType, float flZNear, float flZFar, vr::HmdMatrix44_t *pProjection ) = 0; + virtual bool SetFrameRate( int nISPFrameRate, int nSensorFrameRate ) = 0; + virtual bool SetCameraVideoSinkCallback( vr::ICameraVideoSinkCallback *pCameraVideoSinkCallback ) = 0; + virtual bool GetCameraCompatibilityMode( vr::ECameraCompatibilityMode *pCameraCompatibilityMode ) = 0; + virtual bool SetCameraCompatibilityMode( vr::ECameraCompatibilityMode nCameraCompatibilityMode ) = 0; + virtual bool GetCameraFrameBounds( vr::EVRTrackedCameraFrameType eFrameType, uint32_t *pLeft, uint32_t *pTop, uint32_t *pWidth, uint32_t *pHeight ) = 0; + virtual bool GetCameraIntrinsics( vr::EVRTrackedCameraFrameType eFrameType, HmdVector2_t *pFocalLength, HmdVector2_t *pCenter ) = 0; + }; + + static const char *IVRCameraComponent_Version = "IVRCameraComponent_002"; +} +// itrackeddevicedriverprovider.h +namespace vr +{ + +class ITrackedDeviceServerDriver; +struct TrackedDeviceDriverInfo_t; +struct DriverPose_t; +typedef PropertyContainerHandle_t DriverHandle_t; + +/** This interface is provided by vrserver to allow the driver to notify +* the system when something changes about a device. These changes must +* not change the serial number or class of the device because those values +* are permanently associated with the device's index. */ +class IVRDriverContext +{ +public: + /** Returns the requested interface. If the interface was not available it will return NULL and fill + * out the error. */ + virtual void *GetGenericInterface( const char *pchInterfaceVersion, EVRInitError *peError = nullptr ) = 0; + + /** Returns the property container handle for this driver */ + virtual DriverHandle_t GetDriverHandle() = 0; +}; + + +/** This interface must be implemented in each driver. It will be loaded in vrserver.exe */ +class IServerTrackedDeviceProvider +{ +public: + /** initializes the driver. This will be called before any other methods are called. + * If Init returns anything other than VRInitError_None the driver DLL will be unloaded. + * + * pDriverHost will never be NULL, and will always be a pointer to a IServerDriverHost interface + * + * pchUserDriverConfigDir - The absolute path of the directory where the driver should store user + * config files. + * pchDriverInstallDir - The absolute path of the root directory for the driver. + */ + virtual EVRInitError Init( IVRDriverContext *pDriverContext ) = 0; + + /** cleans up the driver right before it is unloaded */ + virtual void Cleanup() = 0; + + /** Returns the version of the ITrackedDeviceServerDriver interface used by this driver */ + virtual const char * const *GetInterfaceVersions() = 0; + + /** Allows the driver do to some work in the main loop of the server. */ + virtual void RunFrame() = 0; + + + // ------------ Power State Functions ----------------------- // + + /** Returns true if the driver wants to block Standby mode. */ + virtual bool ShouldBlockStandbyMode() = 0; + + /** Called when the system is entering Standby mode. The driver should switch itself into whatever sort of low-power + * state it has. */ + virtual void EnterStandby() = 0; + + /** Called when the system is leaving Standby mode. The driver should switch itself back to + full operation. */ + virtual void LeaveStandby() = 0; + +}; + + +static const char *IServerTrackedDeviceProvider_Version = "IServerTrackedDeviceProvider_004"; + + + + +/** This interface must be implemented in each driver. It will be loaded in vrclient.dll */ +class IVRWatchdogProvider +{ +public: + /** initializes the driver in watchdog mode. */ + virtual EVRInitError Init( IVRDriverContext *pDriverContext ) = 0; + + /** cleans up the driver right before it is unloaded */ + virtual void Cleanup() = 0; +}; + +static const char *IVRWatchdogProvider_Version = "IVRWatchdogProvider_001"; + +} +// ivrproperties.h +#include + +namespace vr +{ + + enum EPropertyWriteType + { + PropertyWrite_Set = 0, + PropertyWrite_Erase = 1, + PropertyWrite_SetError = 2 + }; + + struct PropertyWrite_t + { + ETrackedDeviceProperty prop; + EPropertyWriteType writeType; + ETrackedPropertyError eSetError; + void *pvBuffer; + uint32_t unBufferSize; + PropertyTypeTag_t unTag; + ETrackedPropertyError eError; + }; + + struct PropertyRead_t + { + ETrackedDeviceProperty prop; + void *pvBuffer; + uint32_t unBufferSize; + PropertyTypeTag_t unTag; + uint32_t unRequiredBufferSize; + ETrackedPropertyError eError; + }; + + +class IVRProperties +{ +public: + + /** Reads a set of properties atomically. See the PropertyReadBatch_t struct for more information. */ + virtual ETrackedPropertyError ReadPropertyBatch( PropertyContainerHandle_t ulContainerHandle, PropertyRead_t *pBatch, uint32_t unBatchEntryCount ) = 0; + + /** Writes a set of properties atomically. See the PropertyWriteBatch_t struct for more information. */ + virtual ETrackedPropertyError WritePropertyBatch( PropertyContainerHandle_t ulContainerHandle, PropertyWrite_t *pBatch, uint32_t unBatchEntryCount ) = 0; + + /** returns a string that corresponds with the specified property error. The string will be the name + * of the error enum value for all valid error codes */ + virtual const char *GetPropErrorNameFromEnum( ETrackedPropertyError error ) = 0; + + /** Returns a container handle given a tracked device index */ + virtual PropertyContainerHandle_t TrackedDeviceToPropertyContainer( TrackedDeviceIndex_t nDevice ) = 0; + +}; + +static const char * const IVRProperties_Version = "IVRProperties_001"; + +class CVRPropertyHelpers +{ +public: + CVRPropertyHelpers( IVRProperties * pProperties ) : m_pProperties( pProperties ) {} + + /** Returns a scaler property. If the device index is not valid or the property value type does not match, + * this function will return false. */ + bool GetBoolProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ); + float GetFloatProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ); + int32_t GetInt32Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ); + uint64_t GetUint64Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ); + + /** Returns a single typed property. If the device index is not valid or the property is not a string type this function will + * return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing + * null. Strings will always fit in buffers of k_unMaxPropertyStringSize characters. */ + uint32_t GetProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, VR_OUT_STRING() void *pvBuffer, uint32_t unBufferSize, PropertyTypeTag_t *punTag, ETrackedPropertyError *pError = 0L ); + + + /** Returns a string property. If the device index is not valid or the property is not a string type this function will + * return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing + * null. Strings will always fit in buffers of k_unMaxPropertyStringSize characters. */ + uint32_t GetStringProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize, ETrackedPropertyError *pError = 0L ); + + /** Returns a string property as a std::string. If the device index is not valid or the property is not a string type this function will + * return an empty string. */ + std::string GetStringProperty( vr::PropertyContainerHandle_t ulContainer, vr::ETrackedDeviceProperty prop, vr::ETrackedPropertyError *peError = nullptr ); + + /** Sets a scaler property. The new value will be returned on any subsequent call to get this property in any process. */ + ETrackedPropertyError SetBoolProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, bool bNewValue ); + ETrackedPropertyError SetFloatProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, float fNewValue ); + ETrackedPropertyError SetInt32Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, int32_t nNewValue ); + ETrackedPropertyError SetUint64Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, uint64_t ulNewValue ); + + /** Sets a string property. The new value will be returned on any subsequent call to get this property in any process. */ + ETrackedPropertyError SetStringProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, const char *pchNewValue ); + + /** Sets a single typed property. The new value will be returned on any subsequent call to get this property in any process. */ + ETrackedPropertyError SetProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, void *pvNewValue, uint32_t unNewValueSize, PropertyTypeTag_t unTag ); + + /** Sets the error return value for a property. This value will be returned on all subsequent requests to get the property */ + ETrackedPropertyError SetPropertyError( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError eError ); + + /** Clears any value or error set for the property. */ + ETrackedPropertyError EraseProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop ); + + /* Turns a device index into a property container handle. */ + PropertyContainerHandle_t TrackedDeviceToPropertyContainer( TrackedDeviceIndex_t nDevice ) { return m_pProperties->TrackedDeviceToPropertyContainer( nDevice ); } + +private: + template + T GetPropertyHelper( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError, T bDefault, PropertyTypeTag_t unTypeTag ); + + IVRProperties *m_pProperties; +}; + + +inline uint32_t CVRPropertyHelpers::GetProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, VR_OUT_STRING() void *pvBuffer, uint32_t unBufferSize, PropertyTypeTag_t *punTag, ETrackedPropertyError *pError ) +{ + PropertyRead_t batch; + batch.prop = prop; + batch.pvBuffer = pvBuffer; + batch.unBufferSize = unBufferSize; + + m_pProperties->ReadPropertyBatch( ulContainerHandle, &batch, 1 ); + + if ( pError ) + { + *pError = batch.eError; + } + + if ( punTag ) + { + *punTag = batch.unTag; + } + + return batch.unRequiredBufferSize; +} + + +/** Sets a single typed property. The new value will be returned on any subsequent call to get this property in any process. */ +inline ETrackedPropertyError CVRPropertyHelpers::SetProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, void *pvNewValue, uint32_t unNewValueSize, PropertyTypeTag_t unTag ) +{ + PropertyWrite_t batch; + batch.writeType = PropertyWrite_Set; + batch.prop = prop; + batch.pvBuffer = pvNewValue; + batch.unBufferSize = unNewValueSize; + batch.unTag = unTag; + + m_pProperties->WritePropertyBatch( ulContainerHandle, &batch, 1 ); + + return batch.eError; +} + + +/** Returns a string property. If the device index is not valid or the property is not a string type this function will +* return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing +* null. Strings will always fit in buffers of k_unMaxPropertyStringSize characters. */ +inline uint32_t CVRPropertyHelpers::GetStringProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize, ETrackedPropertyError *pError ) +{ + PropertyTypeTag_t unTag; + ETrackedPropertyError error; + uint32_t unRequiredSize = GetProperty( ulContainerHandle, prop, pchValue, unBufferSize, &unTag, &error ); + if ( unTag != k_unStringPropertyTag && error == TrackedProp_Success ) + { + error = TrackedProp_WrongDataType; + } + + if ( pError ) + { + *pError = error; + } + + if ( error != TrackedProp_Success ) + { + if ( pchValue && unBufferSize ) + { + *pchValue = '\0'; + } + } + + return unRequiredSize; +} + + +/** Returns a string property as a std::string. If the device index is not valid or the property is not a string type this function will +* return an empty string. */ +inline std::string CVRPropertyHelpers::GetStringProperty( vr::PropertyContainerHandle_t ulContainer, vr::ETrackedDeviceProperty prop, vr::ETrackedPropertyError *peError ) +{ + char buf[1024]; + vr::ETrackedPropertyError err; + uint32_t unRequiredBufferLen = GetStringProperty( ulContainer, prop, buf, sizeof(buf), &err ); + + std::string sResult; + + if ( err == TrackedProp_Success ) + { + sResult = buf; + } + else if ( err == TrackedProp_BufferTooSmall ) + { + char *pchBuffer = new char[unRequiredBufferLen]; + unRequiredBufferLen = GetStringProperty( ulContainer, prop, pchBuffer, unRequiredBufferLen, &err ); + sResult = pchBuffer; + delete[] pchBuffer; + } + + if ( peError ) + { + *peError = err; + } + + return sResult; +} + + +/** Sets a string property. The new value will be returned on any subsequent call to get this property in any process. */ +inline ETrackedPropertyError CVRPropertyHelpers::SetStringProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, const char *pchNewValue ) +{ + if ( !pchNewValue ) + return TrackedProp_InvalidOperation; + + // this is strlen without the dependency on string.h + const char *pchCurr = pchNewValue; + while ( *pchCurr ) + { + pchCurr++; + } + + return SetProperty( ulContainerHandle, prop, (void *)pchNewValue, (uint32_t)(pchCurr - pchNewValue) + 1, k_unStringPropertyTag ); +} + + +template +inline T CVRPropertyHelpers::GetPropertyHelper( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError, T bDefault, PropertyTypeTag_t unTypeTag ) +{ + T bValue; + ETrackedPropertyError eError; + PropertyTypeTag_t unReadTag; + GetProperty( ulContainerHandle, prop, &bValue, sizeof( bValue ), &unReadTag, &eError ); + if ( unReadTag != unTypeTag && eError == TrackedProp_Success ) + { + eError = TrackedProp_WrongDataType; + }; + + if ( pError ) + *pError = eError; + if ( eError != TrackedProp_Success ) + { + return bDefault; + } + else + { + return bValue; + } +} + + +inline bool CVRPropertyHelpers::GetBoolProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) +{ + return GetPropertyHelper( ulContainerHandle, prop, pError, false, k_unBoolPropertyTag ); +} + + +inline float CVRPropertyHelpers::GetFloatProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) +{ + return GetPropertyHelper( ulContainerHandle, prop, pError, 0.f, k_unFloatPropertyTag ); +} + +inline int32_t CVRPropertyHelpers::GetInt32Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) +{ + return GetPropertyHelper( ulContainerHandle, prop, pError, 0, k_unInt32PropertyTag ); +} + +inline uint64_t CVRPropertyHelpers::GetUint64Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) +{ + return GetPropertyHelper( ulContainerHandle, prop, pError, 0, k_unUint64PropertyTag ); +} + +inline ETrackedPropertyError CVRPropertyHelpers::SetBoolProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, bool bNewValue ) +{ + return SetProperty( ulContainerHandle, prop, &bNewValue, sizeof( bNewValue ), k_unBoolPropertyTag ); +} + +inline ETrackedPropertyError CVRPropertyHelpers::SetFloatProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, float fNewValue ) +{ + return SetProperty( ulContainerHandle, prop, &fNewValue, sizeof( fNewValue ), k_unFloatPropertyTag ); +} + +inline ETrackedPropertyError CVRPropertyHelpers::SetInt32Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, int32_t nNewValue ) +{ + return SetProperty( ulContainerHandle, prop, &nNewValue, sizeof( nNewValue ), k_unInt32PropertyTag ); +} + +inline ETrackedPropertyError CVRPropertyHelpers::SetUint64Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, uint64_t ulNewValue ) +{ + return SetProperty( ulContainerHandle, prop, &ulNewValue, sizeof( ulNewValue ), k_unUint64PropertyTag ); +} + +/** Sets the error return value for a property. This value will be returned on all subsequent requests to get the property */ +inline ETrackedPropertyError CVRPropertyHelpers::SetPropertyError( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError eError ) +{ + PropertyWrite_t batch; + batch.writeType = PropertyWrite_SetError; + batch.prop = prop; + batch.eSetError = eError; + + m_pProperties->WritePropertyBatch( ulContainerHandle, &batch, 1 ); + + return batch.eError; +} + +/** Clears any value or error set for the property. */ +inline ETrackedPropertyError CVRPropertyHelpers::EraseProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop ) +{ + PropertyWrite_t batch; + batch.writeType = PropertyWrite_Erase; + batch.prop = prop; + + m_pProperties->WritePropertyBatch( ulContainerHandle, &batch, 1 ); + + return batch.eError; + +} + +} + + +// ivrdriverlog.h +namespace vr +{ + +class IVRDriverLog +{ +public: + /** Writes a log message to the log file prefixed with the driver name */ + virtual void Log( const char *pchLogMessage ) = 0; +}; + + +static const char *IVRDriverLog_Version = "IVRDriverLog_001"; + +} +// ivrserverdriverhost.h +namespace vr +{ + +class ITrackedDeviceServerDriver; +struct TrackedDeviceDriverInfo_t; +struct DriverPose_t; + +/** This interface is provided by vrserver to allow the driver to notify +* the system when something changes about a device. These changes must +* not change the serial number or class of the device because those values +* are permanently associated with the device's index. */ +class IVRServerDriverHost +{ +public: + /** Notifies the server that a tracked device has been added. If this function returns true + * the server will call Activate on the device. If it returns false some kind of error + * has occurred and the device will not be activated. */ + virtual bool TrackedDeviceAdded( const char *pchDeviceSerialNumber, ETrackedDeviceClass eDeviceClass, ITrackedDeviceServerDriver *pDriver ) = 0; + + /** Notifies the server that a tracked device's pose has been updated */ + virtual void TrackedDevicePoseUpdated( uint32_t unWhichDevice, const DriverPose_t & newPose, uint32_t unPoseStructSize ) = 0; + + /** Notifies the server that vsync has occurred on the the display attached to the device. This is + * only permitted on devices of the HMD class. */ + virtual void VsyncEvent( double vsyncTimeOffsetSeconds ) = 0; + + /** notifies the server that the button was pressed */ + virtual void TrackedDeviceButtonPressed( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0; + + /** notifies the server that the button was unpressed */ + virtual void TrackedDeviceButtonUnpressed( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0; + + /** notifies the server that the button was pressed */ + virtual void TrackedDeviceButtonTouched( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0; + + /** notifies the server that the button was unpressed */ + virtual void TrackedDeviceButtonUntouched( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0; + + /** notifies the server than a controller axis changed */ + virtual void TrackedDeviceAxisUpdated( uint32_t unWhichDevice, uint32_t unWhichAxis, const VRControllerAxis_t & axisState ) = 0; + + /** Notifies the server that the proximity sensor on the specified device */ + virtual void ProximitySensorState( uint32_t unWhichDevice, bool bProximitySensorTriggered ) = 0; + + /** Sends a vendor specific event (VREvent_VendorSpecific_Reserved_Start..VREvent_VendorSpecific_Reserved_End */ + virtual void VendorSpecificEvent( uint32_t unWhichDevice, vr::EVREventType eventType, const VREvent_Data_t & eventData, double eventTimeOffset ) = 0; + + /** Returns true if SteamVR is exiting */ + virtual bool IsExiting() = 0; + + /** Returns true and fills the event with the next event on the queue if there is one. If there are no events + * this method returns false. uncbVREvent should be the size in bytes of the VREvent_t struct */ + virtual bool PollNextEvent( VREvent_t *pEvent, uint32_t uncbVREvent ) = 0; + + /** Provides access to device poses for drivers. Poses are in their "raw" tracking space which is uniquely + * defined by each driver providing poses for its devices. It is up to clients of this function to correlate + * poses across different drivers. Poses are indexed by their device id, and their associated driver and + * other properties can be looked up via IVRProperties. */ + virtual void GetRawTrackedDevicePoses( float fPredictedSecondsFromNow, TrackedDevicePose_t *pTrackedDevicePoseArray, uint32_t unTrackedDevicePoseArrayCount ) = 0; + + /** Notifies the server that a tracked device's display component transforms have been updated. */ + virtual void TrackedDeviceDisplayTransformUpdated( uint32_t unWhichDevice, HmdMatrix34_t eyeToHeadLeft, HmdMatrix34_t eyeToHeadRight ) = 0; +}; + +static const char *IVRServerDriverHost_Version = "IVRServerDriverHost_004"; + +} + +// ivrhiddenarea.h +namespace vr +{ + +class CVRHiddenAreaHelpers +{ +public: + CVRHiddenAreaHelpers( IVRProperties *pProperties ) : m_pProperties( pProperties ) {} + + /** Stores a hidden area mesh in a property */ + ETrackedPropertyError SetHiddenArea( EVREye eEye, EHiddenAreaMeshType type, HmdVector2_t *pVerts, uint32_t unVertCount ); + + /** retrieves a hidden area mesh from a property. Returns the vert count read out of the property. */ + uint32_t GetHiddenArea( EVREye eEye, EHiddenAreaMeshType type, HmdVector2_t *pVerts, uint32_t unVertCount, ETrackedPropertyError *peError ); + +private: + ETrackedDeviceProperty GetPropertyEnum( EVREye eEye, EHiddenAreaMeshType type ) + { + return (ETrackedDeviceProperty)(Prop_DisplayHiddenArea_Binary_Start + ((int)type * 2) + (int)eEye); + } + + IVRProperties *m_pProperties; +}; + + +inline ETrackedPropertyError CVRHiddenAreaHelpers::SetHiddenArea( EVREye eEye, EHiddenAreaMeshType type, HmdVector2_t *pVerts, uint32_t unVertCount ) +{ + ETrackedDeviceProperty prop = GetPropertyEnum( eEye, type ); + CVRPropertyHelpers propHelpers( m_pProperties ); + return propHelpers.SetProperty( propHelpers.TrackedDeviceToPropertyContainer( k_unTrackedDeviceIndex_Hmd ), prop, pVerts, sizeof( HmdVector2_t ) * unVertCount, k_unHiddenAreaPropertyTag ); +} + + +inline uint32_t CVRHiddenAreaHelpers::GetHiddenArea( EVREye eEye, EHiddenAreaMeshType type, HmdVector2_t *pVerts, uint32_t unVertCount, ETrackedPropertyError *peError ) +{ + ETrackedDeviceProperty prop = GetPropertyEnum( eEye, type ); + CVRPropertyHelpers propHelpers( m_pProperties ); + ETrackedPropertyError propError; + PropertyTypeTag_t unTag; + uint32_t unBytesNeeded = propHelpers.GetProperty( propHelpers.TrackedDeviceToPropertyContainer( k_unTrackedDeviceIndex_Hmd ), prop, pVerts, sizeof( HmdVector2_t )*unVertCount, &unTag, &propError ); + if ( propError == TrackedProp_Success && unTag != k_unHiddenAreaPropertyTag ) + { + propError = TrackedProp_WrongDataType; + unBytesNeeded = 0; + } + + if ( peError ) + { + *peError = propError; + } + + return unBytesNeeded / sizeof( HmdVector2_t ); +} + +} +// ivrwatchdoghost.h +namespace vr +{ + +/** This interface is provided by vrclient to allow the driver to make everything wake up */ +class IVRWatchdogHost +{ +public: + /** Client drivers in watchdog mode should call this when they have received a signal from hardware that should + * cause SteamVR to start */ + virtual void WatchdogWakeUp() = 0; +}; + +static const char *IVRWatchdogHost_Version = "IVRWatchdogHost_001"; + +}; + + + +// ivrvirtualdisplay.h +namespace vr +{ + // ---------------------------------------------------------------------------------------------- + // Purpose: This component is used for drivers that implement a virtual display (e.g. wireless). + // ---------------------------------------------------------------------------------------------- + class IVRVirtualDisplay + { + public: + + /** Submits final backbuffer for display. */ + virtual void Present( vr::SharedTextureHandle_t backbufferTextureHandle ) = 0; + + /** Block until the last presented buffer start scanning out. */ + virtual void WaitForPresent() = 0; + + /** Provides timing data for synchronizing with display. */ + virtual bool GetTimeSinceLastVsync( float *pfSecondsSinceLastVsync, uint64_t *pulFrameCounter ) = 0; + }; + + static const char *IVRVirtualDisplay_Version = "IVRVirtualDisplay_001"; + + /** Returns the current IVRVirtualDisplay pointer or NULL the interface could not be found. */ + VR_INTERFACE vr::IVRVirtualDisplay *VR_CALLTYPE VRVirtualDisplay(); +} + + +// ivrresources.h +namespace vr +{ + +class IVRResources +{ +public: + + // ------------------------------------ + // Shared Resource Methods + // ------------------------------------ + + /** Loads the specified resource into the provided buffer if large enough. + * Returns the size in bytes of the buffer required to hold the specified resource. */ + virtual uint32_t LoadSharedResource( const char *pchResourceName, char *pchBuffer, uint32_t unBufferLen ) = 0; + + /** Provides the full path to the specified resource. Resource names can include named directories for + * drivers and other things, and this resolves all of those and returns the actual physical path. + * pchResourceTypeDirectory is the subdirectory of resources to look in. */ + virtual uint32_t GetResourceFullPath( const char *pchResourceName, const char *pchResourceTypeDirectory, char *pchPathBuffer, uint32_t unBufferLen ) = 0; +}; + +static const char * const IVRResources_Version = "IVRResources_001"; + + +} +// ivrdrivermanager.h +namespace vr +{ + +class IVRDriverManager +{ +public: + virtual uint32_t GetDriverCount() const = 0; + + /** Returns the length of the number of bytes necessary to hold this string including the trailing null. */ + virtual uint32_t GetDriverName( vr::DriverId_t nDriver, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize ) = 0; +}; + +static const char * const IVRDriverManager_Version = "IVRDriverManager_001"; + +} // namespace vr + + + + + +namespace vr +{ + static const char * const k_InterfaceVersions[] = + { + IVRSettings_Version, + ITrackedDeviceServerDriver_Version, + IVRDisplayComponent_Version, + IVRDriverDirectModeComponent_Version, + IVRControllerComponent_Version, + IVRCameraComponent_Version, + IServerTrackedDeviceProvider_Version, + IVRWatchdogProvider_Version, + IVRVirtualDisplay_Version, + IVRDriverManager_Version, + IVRResources_Version, + nullptr + }; + + inline IVRDriverContext *&VRDriverContext() + { + static IVRDriverContext *pHost; + return pHost; + } + + class COpenVRDriverContext + { + public: + COpenVRDriverContext() : m_propertyHelpers(nullptr), m_hiddenAreaHelpers(nullptr) { Clear(); } + void Clear(); + + EVRInitError InitServer(); + EVRInitError InitWatchdog(); + + IVRSettings *VRSettings() + { + if ( m_pVRSettings == nullptr ) + { + EVRInitError eError; + m_pVRSettings = (IVRSettings *)VRDriverContext()->GetGenericInterface( IVRSettings_Version, &eError ); + } + return m_pVRSettings; + } + + IVRProperties *VRPropertiesRaw() + { + if ( m_pVRProperties == nullptr ) + { + EVRInitError eError; + m_pVRProperties = (IVRProperties *)VRDriverContext()->GetGenericInterface( IVRProperties_Version, &eError ); + m_propertyHelpers = CVRPropertyHelpers( m_pVRProperties ); + m_hiddenAreaHelpers = CVRHiddenAreaHelpers( m_pVRProperties ); + } + return m_pVRProperties; + } + + CVRPropertyHelpers *VRProperties() + { + VRPropertiesRaw(); + return &m_propertyHelpers; + } + + CVRHiddenAreaHelpers *VRHiddenArea() + { + VRPropertiesRaw(); + return &m_hiddenAreaHelpers; + } + + IVRServerDriverHost *VRServerDriverHost() + { + if ( m_pVRServerDriverHost == nullptr ) + { + EVRInitError eError; + m_pVRServerDriverHost = (IVRServerDriverHost *)VRDriverContext()->GetGenericInterface( IVRServerDriverHost_Version, &eError ); + } + return m_pVRServerDriverHost; + } + + IVRWatchdogHost *VRWatchdogHost() + { + if ( m_pVRWatchdogHost == nullptr ) + { + EVRInitError eError; + m_pVRWatchdogHost = (IVRWatchdogHost *)VRDriverContext()->GetGenericInterface( IVRWatchdogHost_Version, &eError ); + } + return m_pVRWatchdogHost; + } + + IVRDriverLog *VRDriverLog() + { + if ( m_pVRDriverLog == nullptr ) + { + EVRInitError eError; + m_pVRDriverLog = (IVRDriverLog *)VRDriverContext()->GetGenericInterface( IVRDriverLog_Version, &eError ); + } + return m_pVRDriverLog; + } + + DriverHandle_t VR_CALLTYPE VRDriverHandle() + { + return VRDriverContext()->GetDriverHandle(); + } + + IVRDriverManager *VRDriverManager() + { + if ( !m_pVRDriverManager ) + { + EVRInitError eError; + m_pVRDriverManager = (IVRDriverManager *)VRDriverContext()->GetGenericInterface( IVRDriverManager_Version, &eError ); + } + return m_pVRDriverManager; + } + + IVRResources *VRResources() + { + if ( !m_pVRResources ) + { + EVRInitError eError; + m_pVRResources = (IVRResources *)VRDriverContext()->GetGenericInterface( IVRResources_Version, &eError ); + } + return m_pVRResources; + } + + private: + CVRPropertyHelpers m_propertyHelpers; + CVRHiddenAreaHelpers m_hiddenAreaHelpers; + + IVRSettings *m_pVRSettings; + IVRProperties *m_pVRProperties; + IVRServerDriverHost *m_pVRServerDriverHost; + IVRWatchdogHost *m_pVRWatchdogHost; + IVRDriverLog *m_pVRDriverLog; + IVRDriverManager *m_pVRDriverManager; + IVRResources *m_pVRResources; + }; + + inline COpenVRDriverContext &OpenVRInternal_ModuleServerDriverContext() + { + static void *ctx[sizeof( COpenVRDriverContext ) / sizeof( void * )]; + return *(COpenVRDriverContext *)ctx; // bypass zero-init constructor + } + + inline IVRSettings *VR_CALLTYPE VRSettings() { return OpenVRInternal_ModuleServerDriverContext().VRSettings(); } + inline IVRProperties *VR_CALLTYPE VRPropertiesRaw() { return OpenVRInternal_ModuleServerDriverContext().VRPropertiesRaw(); } + inline CVRPropertyHelpers *VR_CALLTYPE VRProperties() { return OpenVRInternal_ModuleServerDriverContext().VRProperties(); } + inline CVRHiddenAreaHelpers *VR_CALLTYPE VRHiddenArea() { return OpenVRInternal_ModuleServerDriverContext().VRHiddenArea(); } + inline IVRDriverLog *VR_CALLTYPE VRDriverLog() { return OpenVRInternal_ModuleServerDriverContext().VRDriverLog(); } + inline IVRServerDriverHost *VR_CALLTYPE VRServerDriverHost() { return OpenVRInternal_ModuleServerDriverContext().VRServerDriverHost(); } + inline IVRWatchdogHost *VR_CALLTYPE VRWatchdogHost() { return OpenVRInternal_ModuleServerDriverContext().VRWatchdogHost(); } + inline DriverHandle_t VR_CALLTYPE VRDriverHandle() { return OpenVRInternal_ModuleServerDriverContext().VRDriverHandle(); } + inline IVRDriverManager *VR_CALLTYPE VRDriverManager() { return OpenVRInternal_ModuleServerDriverContext().VRDriverManager(); } + inline IVRResources *VR_CALLTYPE VRResources() { return OpenVRInternal_ModuleServerDriverContext().VRResources(); } + + inline void COpenVRDriverContext::Clear() + { + m_pVRSettings = nullptr; + m_pVRProperties = nullptr; + m_pVRServerDriverHost = nullptr; + m_pVRDriverLog = nullptr; + m_pVRWatchdogHost = nullptr; + m_pVRDriverManager = nullptr; + m_pVRResources = nullptr; + } + + inline EVRInitError COpenVRDriverContext::InitServer() + { + Clear(); + if ( !VRServerDriverHost() + || !VRSettings() + || !VRProperties() + || !VRDriverLog() + || !VRDriverManager() + || !VRResources() ) + return VRInitError_Init_InterfaceNotFound; + return VRInitError_None; + } + + inline EVRInitError COpenVRDriverContext::InitWatchdog() + { + Clear(); + if ( !VRWatchdogHost() + || !VRSettings() + || !VRDriverLog() ) + return VRInitError_Init_InterfaceNotFound; + return VRInitError_None; + } + + inline EVRInitError InitServerDriverContext( IVRDriverContext *pContext ) + { + VRDriverContext() = pContext; + return OpenVRInternal_ModuleServerDriverContext().InitServer(); + } + + inline EVRInitError InitWatchdogDriverContext( IVRDriverContext *pContext ) + { + VRDriverContext() = pContext; + return OpenVRInternal_ModuleServerDriverContext().InitWatchdog(); + } + + inline void CleanupDriverContext() + { + VRDriverContext() = nullptr; + OpenVRInternal_ModuleServerDriverContext().Clear(); + } + + #define VR_INIT_SERVER_DRIVER_CONTEXT( pContext ) \ + { \ + vr::EVRInitError eError = vr::InitServerDriverContext( pContext ); \ + if( eError != vr::VRInitError_None ) \ + return eError; \ + } + + #define VR_CLEANUP_SERVER_DRIVER_CONTEXT() \ + vr::CleanupDriverContext(); + + #define VR_INIT_WATCHDOG_DRIVER_CONTEXT( pContext ) \ + { \ + vr::EVRInitError eError = vr::InitWatchdogDriverContext( pContext ); \ + if( eError != vr::VRInitError_None ) \ + return eError; \ + } + + #define VR_CLEANUP_WATCHDOG_DRIVER_CONTEXT() \ + vr::CleanupDriverContext(); +} +// End + +#endif // _OPENVR_DRIVER_API + + diff --git a/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/OpenVR b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/OpenVR new file mode 100755 index 0000000000000000000000000000000000000000..1609501c77fcd0497c6c8d0c2c56a1db2a4b547d GIT binary patch literal 1318196 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%0AV;OAi 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

vHyJ@`%}18k7T>#zvUx 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 literal 0 HcmV?d00001 diff --git a/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Resources/Info.plist b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Resources/Info.plist new file mode 100644 index 000000000..50ff90a2c --- /dev/null +++ b/examples/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Resources/Info.plist @@ -0,0 +1,18 @@ + + + + + CFBundleIdentifier + com.valvesoftware.OpenVR.framework + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + OpenVR + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1.0 + + diff --git a/examples/ThirdPartyLibs/openvr/bin/osx64/libopenvr_api.a b/examples/ThirdPartyLibs/openvr/bin/osx64/libopenvr_api.a new file mode 100644 index 0000000000000000000000000000000000000000..12210366b9dc0eaa6d2f677c51078c8c2b70a941 GIT binary patch literal 1613520 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


a>sXJPLBMLNtxfX|C_DF3}QJ-!$pKbY}8 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

oW>@La)hDw&m$3TPYjadVKi7zZ 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ʳPxW>gfqgC&>GL&0HTD%i|Vx_T13;+r zF_YgOByT#$chmH~rQJk+KynOGwc%;1$^N0y37jsO93LB&1N%C|HAP6HkEoqK72s3V zBcT>=)pbfb{>s$@$I`*WtZttt-E0dG-Dhv@9-SKLKGvD#zuHP7)B1B+l8Sz5ZpQOZ zxKnmwbV$Ix_}@D=glC7~Ic>_e9UprzH`;wvX8P9b(STG<^KUnKpa2I#1?Zl@J8!vT zX2H~2ikhIXxvK1Jp5RD_9Dd^w!Pi!~#sp!{&Td9vF| zO~Wvav1~o-_}Gc#_jLqg!zM9?Wvt--6|tnqa9D&{dLw2Dk#NF>q>~o2y7JOpI-Pq5 zd=r!UJW%)0P(`U#dUPA!dm0!N6%~lK@sb$l_dwD|dLRRL*jOE7=j=(n5WAY3lfx6; zp+wv5^)4my!dhMb(@7p-cF^j$Fm$t6CQtQMTb=Q`+ec7~?(iGA*7ZJT^LnB?BJH zwTe*s&8^jJRi7}J6YeJS`9ME5P`Y$8-tEMAjZiRsWtwT0_y1g}2R6|$4IPkjD+^!nd{gpvOB1Ww&(5W%uh`W@|~{`vq;xSr(t{e zR%3{=rg_xP#=|x}3Ww{ditH=nE3I#O*(-_xis;lDh^i!R!^4#m+C^}?L?#?cu{%KQ z?ANVQf}1`w?xwJS!H}@R=5)7N?mJ&AC)bhr;^E|>$$RACP4!}8sfQQd#bgXf!+KeB zLRi|utlD@YR30?Vjt`w3#Qv+k{DiASnA7cyX?7F~BfiAgdrnS{o;#k^1~vw8Eh&TH z+?nm9Z*I%tiO^{*?(vvieh?d&!}1WQzEmnwKq>UKRD9j|h`JmK#O{EeY?YTq<>6Dz zc@vXaypODpn~MP>kCtk2<56<4OqC&@R>kwDdNxpH;Zlh#4j(&|6-f+>Fpj+*IiAAS z#IgIc$J5zkJ=u_ScGa;cW%tK(b^`C2XY*JL9LBb&JSBVX4bOen8)dwO?Sg7G(*~$k zFIC?a9Z};BUv(ME4&a7)Icuw?r^BjM35~UBM&bD-x>uo_3mdSP_zml^1NM5kFUtHI zc#2z;l#XP1pHMZ`;n$1y#W>Fo^aYthyuJ zga_oYKPk^JbID^GgJZu<$G+qMb)lL>_2X$ghAw5mPeVL#>>!?W?nNue=TJT}EWa70 zX4nGqdk6 z+}*djv4M%H4qcvISf2Xs?jAXMe|Tc}M)p7qnls|bf&aXJnB_aVfwdvy%+0-#85{F+ z!qkjOTUrKlGugtr&_OD$Dh}WbqK_TUZX}f5?TxKcVfWg5HtkB}TP5h32^C>KlzM#g zw4T*OI+YBhculG_iCIhEL^TmxZ!7(9qt3KZwRX2BMN2JK-$tXSTB&7(Y*gy!T5aiZ zNc_8p*nWVE)3%dWB(>ZS1`RqW&sWMzlW z96mWQF8X$8B70_R{5)Lhl?2DZy-n9g-RHVn^?}-B-C6vrq4;Jw|NpG);VVDiOw!h+ zk8TUWVYLh12C6_(A7ei~nH4*vzDvOWK#YW|_g z!*H*vO|gAdq(##5M8vWMH$-ifcPD3dukt&syOt1XCXO{&jy3T~{z;c)@#(I*9!Pwot~M=kAd77!{M%6ZZn_x}Z8Y_>vJTQzPelc! zJ2Pz4w%y{UVhM3;#&7hfPxDki4$BSXvi)b|QWf11n{M60Z5pg6-egr?Jkhh&)Xp_K zir+rmIPG!y&B3V17w!$R0GyA5QJB;c)-l&ov(2wUMBmcZ_m zvNBt2)(O(V!Js>>+Zqjt4Yx(!VL@zzBaG;L|7ra#`mw1=+&xO3khm$*Ifjj3{uF)C zcgoAF*wm3tXD)T5B>rWIZl^D{c8c=o5H@U8vRgPx8BJuziZI*qN>sNTNp*bfluu0u z@x#Z!0u64r-@+{s>5^&?g*v#^j3wCK1-bw~bi(QkHywV_(p9)o@al{`V22vjCF{

DkPTLa@E<;Mrjq+S(7a_KZ&_p8a%$ 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 Rc3ocjwReGRm)t>S`oBB2u2%p6 literal 0 HcmV?d00001 diff --git a/examples/ThirdPartyLibs/openvr/headers/openvr.h b/examples/ThirdPartyLibs/openvr/headers/openvr.h index 2020e9d3a..98410f163 100644 --- a/examples/ThirdPartyLibs/openvr/headers/openvr.h +++ b/examples/ThirdPartyLibs/openvr/headers/openvr.h @@ -143,6 +143,9 @@ enum ETrackingResult TrackingResult_Running_OutOfRange = 201, }; +typedef uint32_t DriverId_t; +static const uint32_t k_nDriverNone = 0xFFFFFFFF; + static const uint32_t k_unMaxDriverDebugResponseSize = 32768; /** Used to pass device IDs to API calls */ @@ -309,6 +312,10 @@ enum ETrackedDeviceProperty Prop_DisplayMCImageNumChannels_Int32 = 2040, Prop_DisplayMCImageData_Binary = 2041, Prop_SecondsFromPhotonsToVblank_Float = 2042, + Prop_DriverDirectModeSendsVsyncEvents_Bool = 2043, + Prop_DisplayDebugMode_Bool = 2044, + Prop_GraphicsAdapterLuid_Uint64 = 2045, + Prop_DriverProvidedChaperonePath_String = 2048, // Properties that are unique to TrackedDeviceClass_Controller Prop_AttachedDeviceId_String = 3000, @@ -330,15 +337,15 @@ enum ETrackedDeviceProperty Prop_ModeLabel_String = 4006, // Properties that are used for user interface like icons names - Prop_IconPathName_String = 5000, // usually a directory named "icons" - Prop_NamedIconPathDeviceOff_String = 5001, // PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others - Prop_NamedIconPathDeviceSearching_String = 5002, // PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others - Prop_NamedIconPathDeviceSearchingAlert_String = 5003, // PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others - Prop_NamedIconPathDeviceReady_String = 5004, // PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others - Prop_NamedIconPathDeviceReadyAlert_String = 5005, // PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others - Prop_NamedIconPathDeviceNotReady_String = 5006, // PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others - Prop_NamedIconPathDeviceStandby_String = 5007, // PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others - Prop_NamedIconPathDeviceAlertLow_String = 5008, // PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_IconPathName_String = 5000, // DEPRECATED. Value not referenced. Now expected to be part of icon path properties. + Prop_NamedIconPathDeviceOff_String = 5001, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceSearching_String = 5002, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceSearchingAlert_String = 5003, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceReady_String = 5004, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceReadyAlert_String = 5005, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceNotReady_String = 5006, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceStandby_String = 5007, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceAlertLow_String = 5008, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others // Properties that are used by helpers, but are opaque to applications Prop_DisplayHiddenArea_Binary_Start = 5100, @@ -458,6 +465,8 @@ enum EVREventType VREvent_WatchdogWakeUpRequested = 109, VREvent_LensDistortionChanged = 110, VREvent_PropertyChanged = 111, + VREvent_WirelessDisconnect = 112, + VREvent_WirelessReconnect = 113, VREvent_ButtonPress = 200, // data is controller VREvent_ButtonUnpress = 201, // data is controller @@ -539,6 +548,7 @@ enum EVREventType VREvent_ModelSkinSettingsHaveChanged = 853, VREvent_EnvironmentSettingsHaveChanged = 854, VREvent_PowerSettingsHaveChanged = 855, + VREvent_EnableHomeAppSettingsHaveChanged = 856, VREvent_StatusUpdate = 900, @@ -1044,6 +1054,8 @@ enum EVRInitError VRInitError_Init_WatchdogDisabledInSettings = 132, VRInitError_Init_VRDashboardNotFound = 133, VRInitError_Init_VRDashboardStartupFailed = 134, + VRInitError_Init_VRHomeNotFound = 135, + VRInitError_Init_VRHomeStartupFailed = 136, VRInitError_Driver_Failed = 200, VRInitError_Driver_Unknown = 201, @@ -1074,6 +1086,7 @@ enum EVRInitError VRInitError_Compositor_FirmwareRequiresUpdate = 402, VRInitError_Compositor_OverlayInitFailed = 403, VRInitError_Compositor_ScreenshotsInitFailed = 404, + VRInitError_Compositor_UnableToCreateDevice = 405, VRInitError_VendorSpecific_UnableToConnectToOculusRuntime = 1000, @@ -1265,6 +1278,22 @@ public: * and swap chain in DX10 and DX11. If an error occurs the index will be set to -1. */ virtual void GetDXGIOutputInfo( int32_t *pnAdapterIndex ) = 0; + + /** + * Returns platform- and texture-type specific adapter identification so that applications and the + * compositor are creating textures and swap chains on the same GPU. If an error occurs the device + * will be set to 0. + * [D3D10/11/12 Only (D3D9 Not Supported)] + * Returns the adapter LUID that identifies the GPU attached to the HMD. The user should + * enumerate all adapters using IDXGIFactory::EnumAdapters and IDXGIAdapter::GetDesc to find + * the adapter with the matching LUID, or use IDXGIFactory4::EnumAdapterByLuid. + * The discovered IDXGIAdapter should be used to create the device and swap chain. + * [Vulkan Only] + * Returns the vk::PhysicalDevice that should be used by the application. + * [macOS Only] + * Returns an id that should be used by the application. + */ + virtual void GetOutputDevice( uint64_t *pnDevice, ETextureType textureType ) = 0; // ------------------------------------ // Display Mode methods @@ -1482,7 +1511,7 @@ public: }; -static const char * const IVRSystem_Version = "IVRSystem_015"; +static const char * const IVRSystem_Version = "IVRSystem_016"; } @@ -1511,6 +1540,7 @@ namespace vr VRApplicationError_OldApplicationQuitting = 112, VRApplicationError_TransitionAborted = 113, VRApplicationError_IsTemplate = 114, // error when you try to call LaunchApplication() on a template type app (use LaunchTemplateApplication) + VRApplicationError_SteamVRIsExiting = 115, VRApplicationError_BufferTooSmall = 200, // The provided buffer was too small to fit the requested data VRApplicationError_PropertyNotSet = 201, // The requested property was not set @@ -1541,6 +1571,7 @@ namespace vr VRApplicationProperty_IsTemplate_Bool = 61, VRApplicationProperty_IsInstanced_Bool = 62, VRApplicationProperty_IsInternal_Bool = 63, + VRApplicationProperty_WantsCompositorPauseInStandby_Bool = 64, VRApplicationProperty_LastLaunchTime_Uint64 = 70, }; @@ -1770,7 +1801,7 @@ namespace vr static const char * const k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float = "speakersForwardYawOffsetDegrees"; static const char * const k_pch_SteamVR_BaseStationPowerManagement_Bool = "basestationPowerManagement"; static const char * const k_pch_SteamVR_NeverKillProcesses_Bool = "neverKillProcesses"; - static const char * const k_pch_SteamVR_RenderTargetMultiplier_Float = "renderTargetMultiplier"; + static const char * const k_pch_SteamVR_SupersampleScale_Float = "supersampleScale"; static const char * const k_pch_SteamVR_AllowAsyncReprojection_Bool = "allowAsyncReprojection"; static const char * const k_pch_SteamVR_AllowReprojection_Bool = "allowInterleavedReprojection"; static const char * const k_pch_SteamVR_ForceReprojection_Bool = "forceReprojection"; @@ -1783,10 +1814,10 @@ namespace vr static const char * const k_pch_SteamVR_StartDashboardFromAppLaunch_Bool = "startDashboardFromAppLaunch"; static const char * const k_pch_SteamVR_StartOverlayAppsFromDashboard_Bool = "startOverlayAppsFromDashboard"; static const char * const k_pch_SteamVR_EnableHomeApp = "enableHomeApp"; - static const char * const k_pch_SteamVR_SetInitialDefaultHomeApp = "setInitialDefaultHomeApp"; static const char * const k_pch_SteamVR_CycleBackgroundImageTimeSec_Int32 = "CycleBackgroundImageTimeSec"; static const char * const k_pch_SteamVR_RetailDemo_Bool = "retailDemo"; static const char * const k_pch_SteamVR_IpdOffset_Float = "ipdOffset"; + static const char * const k_pch_SteamVR_AllowSupersampleFiltering_Bool = "allowSupersampleFiltering"; //----------------------------------------------------------------------------- // lighthouse keys @@ -1844,6 +1875,7 @@ namespace vr static const char * const k_pch_Perf_AllowTimingStore_Bool = "allowTimingStore"; static const char * const k_pch_Perf_SaveTimingsOnExit_Bool = "saveTimingsOnExit"; static const char * const k_pch_Perf_TestData_Float = "perfTestData"; + static const char * const k_pch_Perf_LinuxGPUProfiling_Bool = "linuxGPUProfiling"; //----------------------------------------------------------------------------- // collision bounds keys @@ -1889,6 +1921,7 @@ namespace vr static const char * const k_pch_Power_TurnOffControllersTimeout_Float = "turnOffControllersTimeout"; static const char * const k_pch_Power_ReturnToWatchdogTimeout_Float = "returnToWatchdogTimeout"; static const char * const k_pch_Power_AutoLaunchSteamVROnButtonPress = "autoLaunchSteamVROnButtonPress"; + static const char * const k_pch_Power_PauseCompositorOnStandby_Bool = "pauseCompositorOnStandby"; //----------------------------------------------------------------------------- // dashboard keys @@ -2087,6 +2120,7 @@ enum EVRCompositorError VRCompositorError_SharedTexturesNotSupported = 106, VRCompositorError_IndexOutOfRange = 107, VRCompositorError_AlreadySubmitted = 108, + VRCompositorError_InvalidBounds = 109, }; const uint32_t VRCompositor_ReprojectionReason_Cpu = 0x01; @@ -3350,7 +3384,26 @@ public: static const char * const IVRResources_Version = "IVRResources_001"; -}// End +} +// ivrdrivermanager.h +namespace vr +{ + +class IVRDriverManager +{ +public: + virtual uint32_t GetDriverCount() const = 0; + + /** Returns the length of the number of bytes necessary to hold this string including the trailing null. */ + virtual uint32_t GetDriverName( vr::DriverId_t nDriver, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize ) = 0; +}; + +static const char * const IVRDriverManager_Version = "IVRDriverManager_001"; + +} // namespace vr + + +// End #endif // _OPENVR_API @@ -3571,6 +3624,17 @@ namespace vr return m_pVRTrackedCamera; } + IVRDriverManager *VRDriverManager() + { + CheckClear(); + if ( !m_pVRDriverManager ) + { + EVRInitError eError; + m_pVRDriverManager = ( IVRDriverManager * )VR_GetGenericInterface( IVRDriverManager_Version, &eError ); + } + return m_pVRDriverManager; + } + private: IVRSystem *m_pVRSystem; IVRChaperone *m_pVRChaperone; @@ -3584,6 +3648,7 @@ namespace vr IVRApplications *m_pVRApplications; IVRTrackedCamera *m_pVRTrackedCamera; IVRScreenshots *m_pVRScreenshots; + IVRDriverManager *m_pVRDriverManager; }; inline COpenVRContext &OpenVRInternal_ModuleContext() @@ -3604,6 +3669,7 @@ namespace vr inline IVRResources *VR_CALLTYPE VRResources() { return OpenVRInternal_ModuleContext().VRResources(); } inline IVRExtendedDisplay *VR_CALLTYPE VRExtendedDisplay() { return OpenVRInternal_ModuleContext().VRExtendedDisplay(); } inline IVRTrackedCamera *VR_CALLTYPE VRTrackedCamera() { return OpenVRInternal_ModuleContext().VRTrackedCamera(); } + inline IVRDriverManager *VR_CALLTYPE VRDriverManager() { return OpenVRInternal_ModuleContext().VRDriverManager(); } inline void COpenVRContext::Clear() { @@ -3619,6 +3685,7 @@ namespace vr m_pVRTrackedCamera = nullptr; m_pVRResources = nullptr; m_pVRScreenshots = nullptr; + m_pVRDriverManager = nullptr; } VR_INTERFACE uint32_t VR_CALLTYPE VR_InitInternal( EVRInitError *peError, EVRApplicationType eApplicationType ); diff --git a/examples/ThirdPartyLibs/openvr/headers/openvr_api.cs b/examples/ThirdPartyLibs/openvr/headers/openvr_api.cs index 377d91a65..e08047829 100644 --- a/examples/ThirdPartyLibs/openvr/headers/openvr_api.cs +++ b/examples/ThirdPartyLibs/openvr/headers/openvr_api.cs @@ -55,6 +55,11 @@ public struct IVRSystem [MarshalAs(UnmanagedType.FunctionPtr)] internal _GetDXGIOutputInfo GetDXGIOutputInfo; + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetOutputDevice(ref ulong pnDevice, ETextureType textureType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOutputDevice GetOutputDevice; + [UnmanagedFunctionPointer(CallingConvention.StdCall)] internal delegate bool _IsDisplayOnDesktop(); [MarshalAs(UnmanagedType.FunctionPtr)] @@ -1477,6 +1482,21 @@ public struct IVRResources } +[StructLayout(LayoutKind.Sequential)] +public struct IVRDriverManager +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetDriverCount(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDriverCount GetDriverCount; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetDriverName(uint nDriver, System.Text.StringBuilder pchValue, uint unBufferSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDriverName GetDriverName; + +} + public class CVRSystem { @@ -1531,6 +1551,11 @@ public class CVRSystem pnAdapterIndex = 0; FnTable.GetDXGIOutputInfo(ref pnAdapterIndex); } + public void GetOutputDevice(ref ulong pnDevice,ETextureType textureType) + { + pnDevice = 0; + FnTable.GetOutputDevice(ref pnDevice,textureType); + } public bool IsDisplayOnDesktop() { bool result = FnTable.IsDisplayOnDesktop(); @@ -1642,6 +1667,7 @@ public class CVRSystem } public bool PollNextEvent(ref VREvent_t pEvent,uint uncbVREvent) { +#if !UNITY_METRO if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) { @@ -1654,6 +1680,7 @@ public class CVRSystem event_packed.Unpack(ref pEvent); return packed_result; } +#endif bool result = FnTable.PollNextEvent(ref pEvent,uncbVREvent); return result; } @@ -1686,6 +1713,7 @@ public class CVRSystem } public bool GetControllerState(uint unControllerDeviceIndex,ref VRControllerState_t pControllerState,uint unControllerStateSize) { +#if !UNITY_METRO if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) { @@ -1698,6 +1726,7 @@ public class CVRSystem state_packed.Unpack(ref pControllerState); return packed_result; } +#endif bool result = FnTable.GetControllerState(unControllerDeviceIndex,ref pControllerState,unControllerStateSize); return result; } @@ -1715,6 +1744,7 @@ public class CVRSystem } public bool GetControllerStateWithPose(ETrackingUniverseOrigin eOrigin,uint unControllerDeviceIndex,ref VRControllerState_t pControllerState,uint unControllerStateSize,ref TrackedDevicePose_t pTrackedDevicePose) { +#if !UNITY_METRO if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) { @@ -1727,6 +1757,7 @@ public class CVRSystem state_packed.Unpack(ref pControllerState); return packed_result; } +#endif bool result = FnTable.GetControllerStateWithPose(eOrigin,unControllerDeviceIndex,ref pControllerState,unControllerStateSize,ref pTrackedDevicePose); return result; } @@ -2680,6 +2711,7 @@ public class CVROverlay } public bool PollNextOverlayEvent(ulong ulOverlayHandle,ref VREvent_t pEvent,uint uncbVREvent) { +#if !UNITY_METRO if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) { @@ -2692,6 +2724,7 @@ public class CVROverlay event_packed.Unpack(ref pEvent); return packed_result; } +#endif bool result = FnTable.PollNextOverlayEvent(ulOverlayHandle,ref pEvent,uncbVREvent); return result; } @@ -2956,6 +2989,7 @@ public class CVRRenderModels } public bool GetComponentState(string pchRenderModelName,string pchComponentName,ref VRControllerState_t pControllerState,ref RenderModel_ControllerMode_State_t pState,ref RenderModel_ComponentState_t pComponentState) { +#if !UNITY_METRO if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) { @@ -2968,6 +3002,7 @@ public class CVRRenderModels state_packed.Unpack(ref pControllerState); return packed_result; } +#endif bool result = FnTable.GetComponentState(pchRenderModelName,pchComponentName,ref pControllerState,ref pState,ref pComponentState); return result; } @@ -3145,6 +3180,26 @@ public class CVRResources } +public class CVRDriverManager +{ + IVRDriverManager FnTable; + internal CVRDriverManager(IntPtr pInterface) + { + FnTable = (IVRDriverManager)Marshal.PtrToStructure(pInterface, typeof(IVRDriverManager)); + } + public uint GetDriverCount() + { + uint result = FnTable.GetDriverCount(); + return result; + } + public uint GetDriverName(uint nDriver,System.Text.StringBuilder pchValue,uint unBufferSize) + { + uint result = FnTable.GetDriverName(nDriver,pchValue,unBufferSize); + return result; + } +} + + public class OpenVRInterop { [DllImportAttribute("openvr_api", EntryPoint = "VR_InitInternal", CallingConvention = CallingConvention.Cdecl)] @@ -3296,6 +3351,10 @@ public enum ETrackedDeviceProperty Prop_DisplayMCImageNumChannels_Int32 = 2040, Prop_DisplayMCImageData_Binary = 2041, Prop_SecondsFromPhotonsToVblank_Float = 2042, + Prop_DriverDirectModeSendsVsyncEvents_Bool = 2043, + Prop_DisplayDebugMode_Bool = 2044, + Prop_GraphicsAdapterLuid_Uint64 = 2045, + Prop_DriverProvidedChaperonePath_String = 2048, Prop_AttachedDeviceId_String = 3000, Prop_SupportedButtons_Uint64 = 3001, Prop_Axis0Type_Int32 = 3002, @@ -3381,6 +3440,8 @@ public enum EVREventType VREvent_WatchdogWakeUpRequested = 109, VREvent_LensDistortionChanged = 110, VREvent_PropertyChanged = 111, + VREvent_WirelessDisconnect = 112, + VREvent_WirelessReconnect = 113, VREvent_ButtonPress = 200, VREvent_ButtonUnpress = 201, VREvent_ButtonTouch = 202, @@ -3449,6 +3510,7 @@ public enum EVREventType VREvent_ModelSkinSettingsHaveChanged = 853, VREvent_EnvironmentSettingsHaveChanged = 854, VREvent_PowerSettingsHaveChanged = 855, + VREvent_EnableHomeAppSettingsHaveChanged = 856, VREvent_StatusUpdate = 900, VREvent_MCImageUpdated = 1000, VREvent_FirmwareUpdateStarted = 1100, @@ -3632,6 +3694,8 @@ public enum EVRInitError Init_WatchdogDisabledInSettings = 132, Init_VRDashboardNotFound = 133, Init_VRDashboardStartupFailed = 134, + Init_VRHomeNotFound = 135, + Init_VRHomeStartupFailed = 136, Driver_Failed = 200, Driver_Unknown = 201, Driver_HmdUnknown = 202, @@ -3658,6 +3722,7 @@ public enum EVRInitError Compositor_FirmwareRequiresUpdate = 402, Compositor_OverlayInitFailed = 403, Compositor_ScreenshotsInitFailed = 404, + Compositor_UnableToCreateDevice = 405, VendorSpecific_UnableToConnectToOculusRuntime = 1000, VendorSpecific_HmdFound_CantOpenDevice = 1101, VendorSpecific_HmdFound_UnableToRequestConfigStart = 1102, @@ -3733,6 +3798,7 @@ public enum EVRApplicationError OldApplicationQuitting = 112, TransitionAborted = 113, IsTemplate = 114, + SteamVRIsExiting = 115, BufferTooSmall = 200, PropertyNotSet = 201, UnknownProperty = 202, @@ -3754,6 +3820,7 @@ public enum EVRApplicationProperty IsTemplate_Bool = 61, IsInstanced_Bool = 62, IsInternal_Bool = 63, + WantsCompositorPauseInStandby_Bool = 64, LastLaunchTime_Uint64 = 70, } public enum EVRApplicationTransitionState @@ -3798,6 +3865,7 @@ public enum EVRCompositorError SharedTexturesNotSupported = 106, IndexOutOfRange = 107, AlreadySubmitted = 108, + InvalidBounds = 109, } public enum VROverlayInputMethod { @@ -4479,6 +4547,7 @@ public enum EVRScreenshotError public IntPtr m_pVRApplications; // class vr::IVRApplications * public IntPtr m_pVRTrackedCamera; // class vr::IVRTrackedCamera * public IntPtr m_pVRScreenshots; // class vr::IVRScreenshots * + public IntPtr m_pVRDriverManager; // class vr::IVRDriverManager * } public class OpenVR @@ -4524,6 +4593,7 @@ public class OpenVR return OpenVRInterop.GetInitToken(); } + public const uint k_nDriverNone = 4294967295; public const uint k_unMaxDriverDebugResponseSize = 32768; public const uint k_unTrackedDeviceIndex_Hmd = 0; public const uint k_unMaxTrackedDeviceCount = 16; @@ -4547,7 +4617,7 @@ public class OpenVR public const uint k_unControllerStateAxisCount = 5; public const ulong k_ulOverlayHandleInvalid = 0; public const uint k_unScreenshotHandleInvalid = 0; - public const string IVRSystem_Version = "IVRSystem_015"; + public const string IVRSystem_Version = "IVRSystem_016"; public const string IVRExtendedDisplay_Version = "IVRExtendedDisplay_001"; public const string IVRTrackedCamera_Version = "IVRTrackedCamera_003"; public const uint k_unMaxApplicationKeyLength = 128; @@ -4598,7 +4668,7 @@ public class OpenVR public const string k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float = "speakersForwardYawOffsetDegrees"; public const string k_pch_SteamVR_BaseStationPowerManagement_Bool = "basestationPowerManagement"; public const string k_pch_SteamVR_NeverKillProcesses_Bool = "neverKillProcesses"; - public const string k_pch_SteamVR_RenderTargetMultiplier_Float = "renderTargetMultiplier"; + public const string k_pch_SteamVR_SupersampleScale_Float = "supersampleScale"; public const string k_pch_SteamVR_AllowAsyncReprojection_Bool = "allowAsyncReprojection"; public const string k_pch_SteamVR_AllowReprojection_Bool = "allowInterleavedReprojection"; public const string k_pch_SteamVR_ForceReprojection_Bool = "forceReprojection"; @@ -4611,10 +4681,10 @@ public class OpenVR public const string k_pch_SteamVR_StartDashboardFromAppLaunch_Bool = "startDashboardFromAppLaunch"; public const string k_pch_SteamVR_StartOverlayAppsFromDashboard_Bool = "startOverlayAppsFromDashboard"; public const string k_pch_SteamVR_EnableHomeApp = "enableHomeApp"; - public const string k_pch_SteamVR_SetInitialDefaultHomeApp = "setInitialDefaultHomeApp"; public const string k_pch_SteamVR_CycleBackgroundImageTimeSec_Int32 = "CycleBackgroundImageTimeSec"; public const string k_pch_SteamVR_RetailDemo_Bool = "retailDemo"; public const string k_pch_SteamVR_IpdOffset_Float = "ipdOffset"; + public const string k_pch_SteamVR_AllowSupersampleFiltering_Bool = "allowSupersampleFiltering"; public const string k_pch_Lighthouse_Section = "driver_lighthouse"; public const string k_pch_Lighthouse_DisableIMU_Bool = "disableimu"; public const string k_pch_Lighthouse_UseDisambiguation_String = "usedisambiguation"; @@ -4654,6 +4724,7 @@ public class OpenVR public const string k_pch_Perf_AllowTimingStore_Bool = "allowTimingStore"; public const string k_pch_Perf_SaveTimingsOnExit_Bool = "saveTimingsOnExit"; public const string k_pch_Perf_TestData_Float = "perfTestData"; + public const string k_pch_Perf_LinuxGPUProfiling_Bool = "linuxGPUProfiling"; public const string k_pch_CollisionBounds_Section = "collisionBounds"; public const string k_pch_CollisionBounds_Style_Int32 = "CollisionBoundsStyle"; public const string k_pch_CollisionBounds_GroundPerimeterOn_Bool = "CollisionBoundsGroundPerimeterOn"; @@ -4687,6 +4758,7 @@ public class OpenVR public const string k_pch_Power_TurnOffControllersTimeout_Float = "turnOffControllersTimeout"; public const string k_pch_Power_ReturnToWatchdogTimeout_Float = "returnToWatchdogTimeout"; public const string k_pch_Power_AutoLaunchSteamVROnButtonPress = "autoLaunchSteamVROnButtonPress"; + public const string k_pch_Power_PauseCompositorOnStandby_Bool = "pauseCompositorOnStandby"; public const string k_pch_Dashboard_Section = "dashboard"; public const string k_pch_Dashboard_EnableDashboard_Bool = "enableDashboard"; public const string k_pch_Dashboard_ArcadeMode_Bool = "arcadeMode"; @@ -4694,6 +4766,7 @@ public class OpenVR public const string k_pch_Driver_Enable_Bool = "enable"; public const string IVRScreenshots_Version = "IVRScreenshots_001"; public const string IVRResources_Version = "IVRResources_001"; + public const string IVRDriverManager_Version = "IVRDriverManager_001"; static uint VRToken { get; set; } diff --git a/examples/ThirdPartyLibs/openvr/headers/openvr_api.json b/examples/ThirdPartyLibs/openvr/headers/openvr_api.json index 43c3bf958..f4fab7478 100644 --- a/examples/ThirdPartyLibs/openvr/headers/openvr_api.json +++ b/examples/ThirdPartyLibs/openvr/headers/openvr_api.json @@ -2,6 +2,7 @@ ,{"typedef": "vr::glInt_t","type": "int32_t"} ,{"typedef": "vr::glUInt_t","type": "uint32_t"} ,{"typedef": "vr::SharedTextureHandle_t","type": "uint64_t"} +,{"typedef": "vr::DriverId_t","type": "uint32_t"} ,{"typedef": "vr::TrackedDeviceIndex_t","type": "uint32_t"} ,{"typedef": "vr::PropertyContainerHandle_t","type": "uint64_t"} ,{"typedef": "vr::PropertyTypeTag_t","type": "uint32_t"} @@ -153,6 +154,10 @@ ,{"name": "Prop_DisplayMCImageNumChannels_Int32","value": "2040"} ,{"name": "Prop_DisplayMCImageData_Binary","value": "2041"} ,{"name": "Prop_SecondsFromPhotonsToVblank_Float","value": "2042"} + ,{"name": "Prop_DriverDirectModeSendsVsyncEvents_Bool","value": "2043"} + ,{"name": "Prop_DisplayDebugMode_Bool","value": "2044"} + ,{"name": "Prop_GraphicsAdapterLuid_Uint64","value": "2045"} + ,{"name": "Prop_DriverProvidedChaperonePath_String","value": "2048"} ,{"name": "Prop_AttachedDeviceId_String","value": "3000"} ,{"name": "Prop_SupportedButtons_Uint64","value": "3001"} ,{"name": "Prop_Axis0Type_Int32","value": "3002"} @@ -234,6 +239,8 @@ ,{"name": "VREvent_WatchdogWakeUpRequested","value": "109"} ,{"name": "VREvent_LensDistortionChanged","value": "110"} ,{"name": "VREvent_PropertyChanged","value": "111"} + ,{"name": "VREvent_WirelessDisconnect","value": "112"} + ,{"name": "VREvent_WirelessReconnect","value": "113"} ,{"name": "VREvent_ButtonPress","value": "200"} ,{"name": "VREvent_ButtonUnpress","value": "201"} ,{"name": "VREvent_ButtonTouch","value": "202"} @@ -302,6 +309,7 @@ ,{"name": "VREvent_ModelSkinSettingsHaveChanged","value": "853"} ,{"name": "VREvent_EnvironmentSettingsHaveChanged","value": "854"} ,{"name": "VREvent_PowerSettingsHaveChanged","value": "855"} + ,{"name": "VREvent_EnableHomeAppSettingsHaveChanged","value": "856"} ,{"name": "VREvent_StatusUpdate","value": "900"} ,{"name": "VREvent_MCImageUpdated","value": "1000"} ,{"name": "VREvent_FirmwareUpdateStarted","value": "1100"} @@ -473,6 +481,8 @@ ,{"name": "VRInitError_Init_WatchdogDisabledInSettings","value": "132"} ,{"name": "VRInitError_Init_VRDashboardNotFound","value": "133"} ,{"name": "VRInitError_Init_VRDashboardStartupFailed","value": "134"} + ,{"name": "VRInitError_Init_VRHomeNotFound","value": "135"} + ,{"name": "VRInitError_Init_VRHomeStartupFailed","value": "136"} ,{"name": "VRInitError_Driver_Failed","value": "200"} ,{"name": "VRInitError_Driver_Unknown","value": "201"} ,{"name": "VRInitError_Driver_HmdUnknown","value": "202"} @@ -499,6 +509,7 @@ ,{"name": "VRInitError_Compositor_FirmwareRequiresUpdate","value": "402"} ,{"name": "VRInitError_Compositor_OverlayInitFailed","value": "403"} ,{"name": "VRInitError_Compositor_ScreenshotsInitFailed","value": "404"} + ,{"name": "VRInitError_Compositor_UnableToCreateDevice","value": "405"} ,{"name": "VRInitError_VendorSpecific_UnableToConnectToOculusRuntime","value": "1000"} ,{"name": "VRInitError_VendorSpecific_HmdFound_CantOpenDevice","value": "1101"} ,{"name": "VRInitError_VendorSpecific_HmdFound_UnableToRequestConfigStart","value": "1102"} @@ -569,6 +580,7 @@ ,{"name": "VRApplicationError_OldApplicationQuitting","value": "112"} ,{"name": "VRApplicationError_TransitionAborted","value": "113"} ,{"name": "VRApplicationError_IsTemplate","value": "114"} + ,{"name": "VRApplicationError_SteamVRIsExiting","value": "115"} ,{"name": "VRApplicationError_BufferTooSmall","value": "200"} ,{"name": "VRApplicationError_PropertyNotSet","value": "201"} ,{"name": "VRApplicationError_UnknownProperty","value": "202"} @@ -589,6 +601,7 @@ ,{"name": "VRApplicationProperty_IsTemplate_Bool","value": "61"} ,{"name": "VRApplicationProperty_IsInstanced_Bool","value": "62"} ,{"name": "VRApplicationProperty_IsInternal_Bool","value": "63"} + ,{"name": "VRApplicationProperty_WantsCompositorPauseInStandby_Bool","value": "64"} ,{"name": "VRApplicationProperty_LastLaunchTime_Uint64","value": "70"} ]} , {"enumname": "vr::EVRApplicationTransitionState","values": [ @@ -628,6 +641,7 @@ ,{"name": "VRCompositorError_SharedTexturesNotSupported","value": "106"} ,{"name": "VRCompositorError_IndexOutOfRange","value": "107"} ,{"name": "VRCompositorError_AlreadySubmitted","value": "108"} + ,{"name": "VRCompositorError_InvalidBounds","value": "109"} ]} , {"enumname": "vr::VROverlayInputMethod","values": [ {"name": "VROverlayInputMethod_None","value": "0"} @@ -738,6 +752,8 @@ ]} ], "consts":[{ + "constname": "k_nDriverNone","consttype": "const uint32_t", "constval": "4294967295"} +,{ "constname": "k_unMaxDriverDebugResponseSize","consttype": "const uint32_t", "constval": "32768"} ,{ "constname": "k_unTrackedDeviceIndex_Hmd","consttype": "const uint32_t", "constval": "0"} @@ -784,7 +800,7 @@ ,{ "constname": "k_unScreenshotHandleInvalid","consttype": "const uint32_t", "constval": "0"} ,{ - "constname": "IVRSystem_Version","consttype": "const char *const", "constval": "IVRSystem_015"} + "constname": "IVRSystem_Version","consttype": "const char *const", "constval": "IVRSystem_016"} ,{ "constname": "IVRExtendedDisplay_Version","consttype": "const char *const", "constval": "IVRExtendedDisplay_001"} ,{ @@ -886,7 +902,7 @@ ,{ "constname": "k_pch_SteamVR_NeverKillProcesses_Bool","consttype": "const char *const", "constval": "neverKillProcesses"} ,{ - "constname": "k_pch_SteamVR_RenderTargetMultiplier_Float","consttype": "const char *const", "constval": "renderTargetMultiplier"} + "constname": "k_pch_SteamVR_SupersampleScale_Float","consttype": "const char *const", "constval": "supersampleScale"} ,{ "constname": "k_pch_SteamVR_AllowAsyncReprojection_Bool","consttype": "const char *const", "constval": "allowAsyncReprojection"} ,{ @@ -911,14 +927,14 @@ "constname": "k_pch_SteamVR_StartOverlayAppsFromDashboard_Bool","consttype": "const char *const", "constval": "startOverlayAppsFromDashboard"} ,{ "constname": "k_pch_SteamVR_EnableHomeApp","consttype": "const char *const", "constval": "enableHomeApp"} -,{ - "constname": "k_pch_SteamVR_SetInitialDefaultHomeApp","consttype": "const char *const", "constval": "setInitialDefaultHomeApp"} ,{ "constname": "k_pch_SteamVR_CycleBackgroundImageTimeSec_Int32","consttype": "const char *const", "constval": "CycleBackgroundImageTimeSec"} ,{ "constname": "k_pch_SteamVR_RetailDemo_Bool","consttype": "const char *const", "constval": "retailDemo"} ,{ "constname": "k_pch_SteamVR_IpdOffset_Float","consttype": "const char *const", "constval": "ipdOffset"} +,{ + "constname": "k_pch_SteamVR_AllowSupersampleFiltering_Bool","consttype": "const char *const", "constval": "allowSupersampleFiltering"} ,{ "constname": "k_pch_Lighthouse_Section","consttype": "const char *const", "constval": "driver_lighthouse"} ,{ @@ -997,6 +1013,8 @@ "constname": "k_pch_Perf_SaveTimingsOnExit_Bool","consttype": "const char *const", "constval": "saveTimingsOnExit"} ,{ "constname": "k_pch_Perf_TestData_Float","consttype": "const char *const", "constval": "perfTestData"} +,{ + "constname": "k_pch_Perf_LinuxGPUProfiling_Bool","consttype": "const char *const", "constval": "linuxGPUProfiling"} ,{ "constname": "k_pch_CollisionBounds_Section","consttype": "const char *const", "constval": "collisionBounds"} ,{ @@ -1063,6 +1081,8 @@ "constname": "k_pch_Power_ReturnToWatchdogTimeout_Float","consttype": "const char *const", "constval": "returnToWatchdogTimeout"} ,{ "constname": "k_pch_Power_AutoLaunchSteamVROnButtonPress","consttype": "const char *const", "constval": "autoLaunchSteamVROnButtonPress"} +,{ + "constname": "k_pch_Power_PauseCompositorOnStandby_Bool","consttype": "const char *const", "constval": "pauseCompositorOnStandby"} ,{ "constname": "k_pch_Dashboard_Section","consttype": "const char *const", "constval": "dashboard"} ,{ @@ -1077,6 +1097,8 @@ "constname": "IVRScreenshots_Version","consttype": "const char *const", "constval": "IVRScreenshots_001"} ,{ "constname": "IVRResources_Version","consttype": "const char *const", "constval": "IVRResources_001"} +,{ + "constname": "IVRDriverManager_Version","consttype": "const char *const", "constval": "IVRDriverManager_001"} ], "structs":[{"struct": "vr::HmdMatrix34_t","fields": [ { "fieldname": "m", "fieldtype": "float [3][4]"}]} @@ -1363,7 +1385,8 @@ { "fieldname": "m_pVRSettings", "fieldtype": "class vr::IVRSettings *"}, { "fieldname": "m_pVRApplications", "fieldtype": "class vr::IVRApplications *"}, { "fieldname": "m_pVRTrackedCamera", "fieldtype": "class vr::IVRTrackedCamera *"}, -{ "fieldname": "m_pVRScreenshots", "fieldtype": "class vr::IVRScreenshots *"}]} +{ "fieldname": "m_pVRScreenshots", "fieldtype": "class vr::IVRScreenshots *"}, +{ "fieldname": "m_pVRDriverManager", "fieldtype": "class vr::IVRDriverManager *"}]} ], "methods":[{ "classname": "vr::IVRSystem", @@ -1437,6 +1460,15 @@ { "paramname": "pnAdapterIndex" ,"paramtype": "int32_t *"} ] } +,{ + "classname": "vr::IVRSystem", + "methodname": "GetOutputDevice", + "returntype": "void", + "params": [ +{ "paramname": "pnDevice" ,"paramtype": "uint64_t *"}, +{ "paramname": "textureType" ,"paramtype": "vr::ETextureType"} + ] +} ,{ "classname": "vr::IVRSystem", "methodname": "IsDisplayOnDesktop", @@ -3844,5 +3876,20 @@ { "paramname": "unBufferLen" ,"paramtype": "uint32_t"} ] } +,{ + "classname": "vr::IVRDriverManager", + "methodname": "GetDriverCount", + "returntype": "uint32_t" +} +,{ + "classname": "vr::IVRDriverManager", + "methodname": "GetDriverName", + "returntype": "uint32_t", + "params": [ +{ "paramname": "nDriver" ,"paramtype": "vr::DriverId_t"}, +{ "paramname": "pchValue" ,"out_string": " " ,"paramtype": "char *"}, +{ "paramname": "unBufferSize" ,"paramtype": "uint32_t"} + ] +} ] } \ No newline at end of file diff --git a/examples/ThirdPartyLibs/openvr/headers/openvr_capi.h b/examples/ThirdPartyLibs/openvr/headers/openvr_capi.h index f89566817..24d277876 100644 --- a/examples/ThirdPartyLibs/openvr/headers/openvr_capi.h +++ b/examples/ThirdPartyLibs/openvr/headers/openvr_capi.h @@ -60,6 +60,7 @@ typedef uint32_t PropertyTypeTag_t; // OpenVR Constants +static const unsigned int k_nDriverNone = 4294967295; static const unsigned int k_unMaxDriverDebugResponseSize = 32768; static const unsigned int k_unTrackedDeviceIndex_Hmd = 0; static const unsigned int k_unMaxTrackedDeviceCount = 16; @@ -83,7 +84,7 @@ static const unsigned int k_unMaxPropertyStringSize = 32768; static const unsigned int k_unControllerStateAxisCount = 5; static const unsigned long k_ulOverlayHandleInvalid = 0; static const unsigned int k_unScreenshotHandleInvalid = 0; -static const char * IVRSystem_Version = "IVRSystem_015"; +static const char * IVRSystem_Version = "IVRSystem_016"; static const char * IVRExtendedDisplay_Version = "IVRExtendedDisplay_001"; static const char * IVRTrackedCamera_Version = "IVRTrackedCamera_003"; static const unsigned int k_unMaxApplicationKeyLength = 128; @@ -134,7 +135,7 @@ static const char * k_pch_SteamVR_UsingSpeakers_Bool = "usingSpeakers"; static const char * k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float = "speakersForwardYawOffsetDegrees"; static const char * k_pch_SteamVR_BaseStationPowerManagement_Bool = "basestationPowerManagement"; static const char * k_pch_SteamVR_NeverKillProcesses_Bool = "neverKillProcesses"; -static const char * k_pch_SteamVR_RenderTargetMultiplier_Float = "renderTargetMultiplier"; +static const char * k_pch_SteamVR_SupersampleScale_Float = "supersampleScale"; static const char * k_pch_SteamVR_AllowAsyncReprojection_Bool = "allowAsyncReprojection"; static const char * k_pch_SteamVR_AllowReprojection_Bool = "allowInterleavedReprojection"; static const char * k_pch_SteamVR_ForceReprojection_Bool = "forceReprojection"; @@ -147,10 +148,10 @@ static const char * k_pch_SteamVR_StartCompositorFromAppLaunch_Bool = "startComp static const char * k_pch_SteamVR_StartDashboardFromAppLaunch_Bool = "startDashboardFromAppLaunch"; static const char * k_pch_SteamVR_StartOverlayAppsFromDashboard_Bool = "startOverlayAppsFromDashboard"; static const char * k_pch_SteamVR_EnableHomeApp = "enableHomeApp"; -static const char * k_pch_SteamVR_SetInitialDefaultHomeApp = "setInitialDefaultHomeApp"; static const char * k_pch_SteamVR_CycleBackgroundImageTimeSec_Int32 = "CycleBackgroundImageTimeSec"; static const char * k_pch_SteamVR_RetailDemo_Bool = "retailDemo"; static const char * k_pch_SteamVR_IpdOffset_Float = "ipdOffset"; +static const char * k_pch_SteamVR_AllowSupersampleFiltering_Bool = "allowSupersampleFiltering"; static const char * k_pch_Lighthouse_Section = "driver_lighthouse"; static const char * k_pch_Lighthouse_DisableIMU_Bool = "disableimu"; static const char * k_pch_Lighthouse_UseDisambiguation_String = "usedisambiguation"; @@ -190,6 +191,7 @@ static const char * k_pch_Perf_NotifyOnlyOnce_Bool = "warnOnlyOnce"; static const char * k_pch_Perf_AllowTimingStore_Bool = "allowTimingStore"; static const char * k_pch_Perf_SaveTimingsOnExit_Bool = "saveTimingsOnExit"; static const char * k_pch_Perf_TestData_Float = "perfTestData"; +static const char * k_pch_Perf_LinuxGPUProfiling_Bool = "linuxGPUProfiling"; static const char * k_pch_CollisionBounds_Section = "collisionBounds"; static const char * k_pch_CollisionBounds_Style_Int32 = "CollisionBoundsStyle"; static const char * k_pch_CollisionBounds_GroundPerimeterOn_Bool = "CollisionBoundsGroundPerimeterOn"; @@ -223,6 +225,7 @@ static const char * k_pch_Power_TurnOffScreensTimeout_Float = "turnOffScreensTim static const char * k_pch_Power_TurnOffControllersTimeout_Float = "turnOffControllersTimeout"; static const char * k_pch_Power_ReturnToWatchdogTimeout_Float = "returnToWatchdogTimeout"; static const char * k_pch_Power_AutoLaunchSteamVROnButtonPress = "autoLaunchSteamVROnButtonPress"; +static const char * k_pch_Power_PauseCompositorOnStandby_Bool = "pauseCompositorOnStandby"; static const char * k_pch_Dashboard_Section = "dashboard"; static const char * k_pch_Dashboard_EnableDashboard_Bool = "enableDashboard"; static const char * k_pch_Dashboard_ArcadeMode_Bool = "arcadeMode"; @@ -230,6 +233,7 @@ static const char * k_pch_modelskin_Section = "modelskins"; static const char * k_pch_Driver_Enable_Bool = "enable"; static const char * IVRScreenshots_Version = "IVRScreenshots_001"; static const char * IVRResources_Version = "IVRResources_001"; +static const char * IVRDriverManager_Version = "IVRDriverManager_001"; // OpenVR Enums @@ -370,6 +374,10 @@ typedef enum ETrackedDeviceProperty ETrackedDeviceProperty_Prop_DisplayMCImageNumChannels_Int32 = 2040, ETrackedDeviceProperty_Prop_DisplayMCImageData_Binary = 2041, ETrackedDeviceProperty_Prop_SecondsFromPhotonsToVblank_Float = 2042, + ETrackedDeviceProperty_Prop_DriverDirectModeSendsVsyncEvents_Bool = 2043, + ETrackedDeviceProperty_Prop_DisplayDebugMode_Bool = 2044, + ETrackedDeviceProperty_Prop_GraphicsAdapterLuid_Uint64 = 2045, + ETrackedDeviceProperty_Prop_DriverProvidedChaperonePath_String = 2048, ETrackedDeviceProperty_Prop_AttachedDeviceId_String = 3000, ETrackedDeviceProperty_Prop_SupportedButtons_Uint64 = 3001, ETrackedDeviceProperty_Prop_Axis0Type_Int32 = 3002, @@ -459,6 +467,8 @@ typedef enum EVREventType EVREventType_VREvent_WatchdogWakeUpRequested = 109, EVREventType_VREvent_LensDistortionChanged = 110, EVREventType_VREvent_PropertyChanged = 111, + EVREventType_VREvent_WirelessDisconnect = 112, + EVREventType_VREvent_WirelessReconnect = 113, EVREventType_VREvent_ButtonPress = 200, EVREventType_VREvent_ButtonUnpress = 201, EVREventType_VREvent_ButtonTouch = 202, @@ -527,6 +537,7 @@ typedef enum EVREventType EVREventType_VREvent_ModelSkinSettingsHaveChanged = 853, EVREventType_VREvent_EnvironmentSettingsHaveChanged = 854, EVREventType_VREvent_PowerSettingsHaveChanged = 855, + EVREventType_VREvent_EnableHomeAppSettingsHaveChanged = 856, EVREventType_VREvent_StatusUpdate = 900, EVREventType_VREvent_MCImageUpdated = 1000, EVREventType_VREvent_FirmwareUpdateStarted = 1100, @@ -722,6 +733,8 @@ typedef enum EVRInitError EVRInitError_VRInitError_Init_WatchdogDisabledInSettings = 132, EVRInitError_VRInitError_Init_VRDashboardNotFound = 133, EVRInitError_VRInitError_Init_VRDashboardStartupFailed = 134, + EVRInitError_VRInitError_Init_VRHomeNotFound = 135, + EVRInitError_VRInitError_Init_VRHomeStartupFailed = 136, EVRInitError_VRInitError_Driver_Failed = 200, EVRInitError_VRInitError_Driver_Unknown = 201, EVRInitError_VRInitError_Driver_HmdUnknown = 202, @@ -748,6 +761,7 @@ typedef enum EVRInitError EVRInitError_VRInitError_Compositor_FirmwareRequiresUpdate = 402, EVRInitError_VRInitError_Compositor_OverlayInitFailed = 403, EVRInitError_VRInitError_Compositor_ScreenshotsInitFailed = 404, + EVRInitError_VRInitError_Compositor_UnableToCreateDevice = 405, EVRInitError_VRInitError_VendorSpecific_UnableToConnectToOculusRuntime = 1000, EVRInitError_VRInitError_VendorSpecific_HmdFound_CantOpenDevice = 1101, EVRInitError_VRInitError_VendorSpecific_HmdFound_UnableToRequestConfigStart = 1102, @@ -828,6 +842,7 @@ typedef enum EVRApplicationError EVRApplicationError_VRApplicationError_OldApplicationQuitting = 112, EVRApplicationError_VRApplicationError_TransitionAborted = 113, EVRApplicationError_VRApplicationError_IsTemplate = 114, + EVRApplicationError_VRApplicationError_SteamVRIsExiting = 115, EVRApplicationError_VRApplicationError_BufferTooSmall = 200, EVRApplicationError_VRApplicationError_PropertyNotSet = 201, EVRApplicationError_VRApplicationError_UnknownProperty = 202, @@ -850,6 +865,7 @@ typedef enum EVRApplicationProperty EVRApplicationProperty_VRApplicationProperty_IsTemplate_Bool = 61, EVRApplicationProperty_VRApplicationProperty_IsInstanced_Bool = 62, EVRApplicationProperty_VRApplicationProperty_IsInternal_Bool = 63, + EVRApplicationProperty_VRApplicationProperty_WantsCompositorPauseInStandby_Bool = 64, EVRApplicationProperty_VRApplicationProperty_LastLaunchTime_Uint64 = 70, } EVRApplicationProperty; @@ -899,6 +915,7 @@ typedef enum EVRCompositorError EVRCompositorError_VRCompositorError_SharedTexturesNotSupported = 106, EVRCompositorError_VRCompositorError_IndexOutOfRange = 107, EVRCompositorError_VRCompositorError_AlreadySubmitted = 108, + EVRCompositorError_VRCompositorError_InvalidBounds = 109, } EVRCompositorError; typedef enum VROverlayInputMethod @@ -1047,6 +1064,7 @@ typedef void * glSharedTextureHandle_t; typedef int32_t glInt_t; typedef uint32_t glUInt_t; typedef uint64_t SharedTextureHandle_t; +typedef uint32_t DriverId_t; typedef uint32_t TrackedDeviceIndex_t; typedef uint64_t PropertyContainerHandle_t; typedef uint32_t PropertyTypeTag_t; @@ -1503,6 +1521,7 @@ typedef struct COpenVRContext intptr_t m_pVRApplications; // class vr::IVRApplications * intptr_t m_pVRTrackedCamera; // class vr::IVRTrackedCamera * intptr_t m_pVRScreenshots; // class vr::IVRScreenshots * + intptr_t m_pVRDriverManager; // class vr::IVRDriverManager * } COpenVRContext; @@ -1560,6 +1579,7 @@ struct VR_IVRSystem_FnTable bool (OPENVR_FNTABLE_CALLTYPE *GetTimeSinceLastVsync)(float * pfSecondsSinceLastVsync, uint64_t * pulFrameCounter); int32_t (OPENVR_FNTABLE_CALLTYPE *GetD3D9AdapterIndex)(); void (OPENVR_FNTABLE_CALLTYPE *GetDXGIOutputInfo)(int32_t * pnAdapterIndex); + void (OPENVR_FNTABLE_CALLTYPE *GetOutputDevice)(uint64_t * pnDevice, ETextureType textureType); bool (OPENVR_FNTABLE_CALLTYPE *IsDisplayOnDesktop)(); bool (OPENVR_FNTABLE_CALLTYPE *SetDisplayVisibility)(bool bIsVisibleOnDesktop); void (OPENVR_FNTABLE_CALLTYPE *GetDeviceToAbsoluteTrackingPose)(ETrackingUniverseOrigin eOrigin, float fPredictedSecondsToPhotonsFromNow, struct TrackedDevicePose_t * pTrackedDevicePoseArray, uint32_t unTrackedDevicePoseArrayCount); @@ -1882,6 +1902,12 @@ struct VR_IVRResources_FnTable uint32_t (OPENVR_FNTABLE_CALLTYPE *GetResourceFullPath)(char * pchResourceName, char * pchResourceTypeDirectory, char * pchPathBuffer, uint32_t unBufferLen); }; +struct VR_IVRDriverManager_FnTable +{ + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetDriverCount)(); + uint32_t (OPENVR_FNTABLE_CALLTYPE *GetDriverName)(DriverId_t nDriver, char * pchValue, uint32_t unBufferSize); +}; + #if 0 // Global entry points diff --git a/examples/ThirdPartyLibs/openvr/headers/openvr_driver.h b/examples/ThirdPartyLibs/openvr/headers/openvr_driver.h index e0732a0f5..7e1d64596 100644 --- a/examples/ThirdPartyLibs/openvr/headers/openvr_driver.h +++ b/examples/ThirdPartyLibs/openvr/headers/openvr_driver.h @@ -143,6 +143,9 @@ enum ETrackingResult TrackingResult_Running_OutOfRange = 201, }; +typedef uint32_t DriverId_t; +static const uint32_t k_nDriverNone = 0xFFFFFFFF; + static const uint32_t k_unMaxDriverDebugResponseSize = 32768; /** Used to pass device IDs to API calls */ @@ -309,6 +312,10 @@ enum ETrackedDeviceProperty Prop_DisplayMCImageNumChannels_Int32 = 2040, Prop_DisplayMCImageData_Binary = 2041, Prop_SecondsFromPhotonsToVblank_Float = 2042, + Prop_DriverDirectModeSendsVsyncEvents_Bool = 2043, + Prop_DisplayDebugMode_Bool = 2044, + Prop_GraphicsAdapterLuid_Uint64 = 2045, + Prop_DriverProvidedChaperonePath_String = 2048, // Properties that are unique to TrackedDeviceClass_Controller Prop_AttachedDeviceId_String = 3000, @@ -330,15 +337,15 @@ enum ETrackedDeviceProperty Prop_ModeLabel_String = 4006, // Properties that are used for user interface like icons names - Prop_IconPathName_String = 5000, // usually a directory named "icons" - Prop_NamedIconPathDeviceOff_String = 5001, // PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others - Prop_NamedIconPathDeviceSearching_String = 5002, // PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others - Prop_NamedIconPathDeviceSearchingAlert_String = 5003, // PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others - Prop_NamedIconPathDeviceReady_String = 5004, // PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others - Prop_NamedIconPathDeviceReadyAlert_String = 5005, // PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others - Prop_NamedIconPathDeviceNotReady_String = 5006, // PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others - Prop_NamedIconPathDeviceStandby_String = 5007, // PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others - Prop_NamedIconPathDeviceAlertLow_String = 5008, // PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_IconPathName_String = 5000, // DEPRECATED. Value not referenced. Now expected to be part of icon path properties. + Prop_NamedIconPathDeviceOff_String = 5001, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceSearching_String = 5002, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceSearchingAlert_String = 5003, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceReady_String = 5004, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceReadyAlert_String = 5005, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceNotReady_String = 5006, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceStandby_String = 5007, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others + Prop_NamedIconPathDeviceAlertLow_String = 5008, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others // Properties that are used by helpers, but are opaque to applications Prop_DisplayHiddenArea_Binary_Start = 5100, @@ -458,6 +465,8 @@ enum EVREventType VREvent_WatchdogWakeUpRequested = 109, VREvent_LensDistortionChanged = 110, VREvent_PropertyChanged = 111, + VREvent_WirelessDisconnect = 112, + VREvent_WirelessReconnect = 113, VREvent_ButtonPress = 200, // data is controller VREvent_ButtonUnpress = 201, // data is controller @@ -539,6 +548,7 @@ enum EVREventType VREvent_ModelSkinSettingsHaveChanged = 853, VREvent_EnvironmentSettingsHaveChanged = 854, VREvent_PowerSettingsHaveChanged = 855, + VREvent_EnableHomeAppSettingsHaveChanged = 856, VREvent_StatusUpdate = 900, @@ -1044,6 +1054,8 @@ enum EVRInitError VRInitError_Init_WatchdogDisabledInSettings = 132, VRInitError_Init_VRDashboardNotFound = 133, VRInitError_Init_VRDashboardStartupFailed = 134, + VRInitError_Init_VRHomeNotFound = 135, + VRInitError_Init_VRHomeStartupFailed = 136, VRInitError_Driver_Failed = 200, VRInitError_Driver_Unknown = 201, @@ -1074,6 +1086,7 @@ enum EVRInitError VRInitError_Compositor_FirmwareRequiresUpdate = 402, VRInitError_Compositor_OverlayInitFailed = 403, VRInitError_Compositor_ScreenshotsInitFailed = 404, + VRInitError_Compositor_UnableToCreateDevice = 405, VRInitError_VendorSpecific_UnableToConnectToOculusRuntime = 1000, @@ -1374,7 +1387,7 @@ namespace vr static const char * const k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float = "speakersForwardYawOffsetDegrees"; static const char * const k_pch_SteamVR_BaseStationPowerManagement_Bool = "basestationPowerManagement"; static const char * const k_pch_SteamVR_NeverKillProcesses_Bool = "neverKillProcesses"; - static const char * const k_pch_SteamVR_RenderTargetMultiplier_Float = "renderTargetMultiplier"; + static const char * const k_pch_SteamVR_SupersampleScale_Float = "supersampleScale"; static const char * const k_pch_SteamVR_AllowAsyncReprojection_Bool = "allowAsyncReprojection"; static const char * const k_pch_SteamVR_AllowReprojection_Bool = "allowInterleavedReprojection"; static const char * const k_pch_SteamVR_ForceReprojection_Bool = "forceReprojection"; @@ -1387,10 +1400,10 @@ namespace vr static const char * const k_pch_SteamVR_StartDashboardFromAppLaunch_Bool = "startDashboardFromAppLaunch"; static const char * const k_pch_SteamVR_StartOverlayAppsFromDashboard_Bool = "startOverlayAppsFromDashboard"; static const char * const k_pch_SteamVR_EnableHomeApp = "enableHomeApp"; - static const char * const k_pch_SteamVR_SetInitialDefaultHomeApp = "setInitialDefaultHomeApp"; static const char * const k_pch_SteamVR_CycleBackgroundImageTimeSec_Int32 = "CycleBackgroundImageTimeSec"; static const char * const k_pch_SteamVR_RetailDemo_Bool = "retailDemo"; static const char * const k_pch_SteamVR_IpdOffset_Float = "ipdOffset"; + static const char * const k_pch_SteamVR_AllowSupersampleFiltering_Bool = "allowSupersampleFiltering"; //----------------------------------------------------------------------------- // lighthouse keys @@ -1448,6 +1461,7 @@ namespace vr static const char * const k_pch_Perf_AllowTimingStore_Bool = "allowTimingStore"; static const char * const k_pch_Perf_SaveTimingsOnExit_Bool = "saveTimingsOnExit"; static const char * const k_pch_Perf_TestData_Float = "perfTestData"; + static const char * const k_pch_Perf_LinuxGPUProfiling_Bool = "linuxGPUProfiling"; //----------------------------------------------------------------------------- // collision bounds keys @@ -1493,6 +1507,7 @@ namespace vr static const char * const k_pch_Power_TurnOffControllersTimeout_Float = "turnOffControllersTimeout"; static const char * const k_pch_Power_ReturnToWatchdogTimeout_Float = "returnToWatchdogTimeout"; static const char * const k_pch_Power_AutoLaunchSteamVROnButtonPress = "autoLaunchSteamVROnButtonPress"; + static const char * const k_pch_Power_PauseCompositorOnStandby_Bool = "pauseCompositorOnStandby"; //----------------------------------------------------------------------------- // dashboard keys @@ -2278,6 +2293,9 @@ public: * poses across different drivers. Poses are indexed by their device id, and their associated driver and * other properties can be looked up via IVRProperties. */ virtual void GetRawTrackedDevicePoses( float fPredictedSecondsFromNow, TrackedDevicePose_t *pTrackedDevicePoseArray, uint32_t unTrackedDevicePoseArrayCount ) = 0; + + /** Notifies the server that a tracked device's display component transforms have been updated. */ + virtual void TrackedDeviceDisplayTransformUpdated( uint32_t unWhichDevice, HmdMatrix34_t eyeToHeadLeft, HmdMatrix34_t eyeToHeadRight ) = 0; }; static const char *IVRServerDriverHost_Version = "IVRServerDriverHost_004"; @@ -2385,6 +2403,49 @@ namespace vr } +// ivrresources.h +namespace vr +{ + +class IVRResources +{ +public: + + // ------------------------------------ + // Shared Resource Methods + // ------------------------------------ + + /** Loads the specified resource into the provided buffer if large enough. + * Returns the size in bytes of the buffer required to hold the specified resource. */ + virtual uint32_t LoadSharedResource( const char *pchResourceName, char *pchBuffer, uint32_t unBufferLen ) = 0; + + /** Provides the full path to the specified resource. Resource names can include named directories for + * drivers and other things, and this resolves all of those and returns the actual physical path. + * pchResourceTypeDirectory is the subdirectory of resources to look in. */ + virtual uint32_t GetResourceFullPath( const char *pchResourceName, const char *pchResourceTypeDirectory, char *pchPathBuffer, uint32_t unBufferLen ) = 0; +}; + +static const char * const IVRResources_Version = "IVRResources_001"; + + +} +// ivrdrivermanager.h +namespace vr +{ + +class IVRDriverManager +{ +public: + virtual uint32_t GetDriverCount() const = 0; + + /** Returns the length of the number of bytes necessary to hold this string including the trailing null. */ + virtual uint32_t GetDriverName( vr::DriverId_t nDriver, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize ) = 0; +}; + +static const char * const IVRDriverManager_Version = "IVRDriverManager_001"; + +} // namespace vr + @@ -2402,6 +2463,8 @@ namespace vr IServerTrackedDeviceProvider_Version, IVRWatchdogProvider_Version, IVRVirtualDisplay_Version, + IVRDriverManager_Version, + IVRResources_Version, nullptr }; @@ -2489,14 +2552,37 @@ namespace vr return VRDriverContext()->GetDriverHandle(); } + IVRDriverManager *VRDriverManager() + { + if ( !m_pVRDriverManager ) + { + EVRInitError eError; + m_pVRDriverManager = (IVRDriverManager *)VRDriverContext()->GetGenericInterface( IVRDriverManager_Version, &eError ); + } + return m_pVRDriverManager; + } + + IVRResources *VRResources() + { + if ( !m_pVRResources ) + { + EVRInitError eError; + m_pVRResources = (IVRResources *)VRDriverContext()->GetGenericInterface( IVRResources_Version, &eError ); + } + return m_pVRResources; + } + private: - IVRSettings *m_pVRSettings; - IVRProperties *m_pVRProperties; - CVRPropertyHelpers m_propertyHelpers; + CVRPropertyHelpers m_propertyHelpers; CVRHiddenAreaHelpers m_hiddenAreaHelpers; - IVRServerDriverHost *m_pVRServerDriverHost; - IVRWatchdogHost *m_pVRWatchdogHost; - IVRDriverLog *m_pVRDriverLog; + + IVRSettings *m_pVRSettings; + IVRProperties *m_pVRProperties; + IVRServerDriverHost *m_pVRServerDriverHost; + IVRWatchdogHost *m_pVRWatchdogHost; + IVRDriverLog *m_pVRDriverLog; + IVRDriverManager *m_pVRDriverManager; + IVRResources *m_pVRResources; }; inline COpenVRDriverContext &OpenVRInternal_ModuleServerDriverContext() @@ -2513,6 +2599,9 @@ namespace vr inline IVRServerDriverHost *VR_CALLTYPE VRServerDriverHost() { return OpenVRInternal_ModuleServerDriverContext().VRServerDriverHost(); } inline IVRWatchdogHost *VR_CALLTYPE VRWatchdogHost() { return OpenVRInternal_ModuleServerDriverContext().VRWatchdogHost(); } inline DriverHandle_t VR_CALLTYPE VRDriverHandle() { return OpenVRInternal_ModuleServerDriverContext().VRDriverHandle(); } + inline IVRDriverManager *VR_CALLTYPE VRDriverManager() { return OpenVRInternal_ModuleServerDriverContext().VRDriverManager(); } + inline IVRResources *VR_CALLTYPE VRResources() { return OpenVRInternal_ModuleServerDriverContext().VRResources(); } + inline void COpenVRDriverContext::Clear() { m_pVRSettings = nullptr; @@ -2520,6 +2609,8 @@ namespace vr m_pVRServerDriverHost = nullptr; m_pVRDriverLog = nullptr; m_pVRWatchdogHost = nullptr; + m_pVRDriverManager = nullptr; + m_pVRResources = nullptr; } inline EVRInitError COpenVRDriverContext::InitServer() @@ -2528,7 +2619,9 @@ namespace vr if ( !VRServerDriverHost() || !VRSettings() || !VRProperties() - || !VRDriverLog() ) + || !VRDriverLog() + || !VRDriverManager() + || !VRResources() ) return VRInitError_Init_InterfaceNotFound; return VRInitError_None; } diff --git a/examples/ThirdPartyLibs/openvr/lib/linux32/libopenvr_api.so b/examples/ThirdPartyLibs/openvr/lib/linux32/libopenvr_api.so old mode 100644 new mode 100755 index ccfeabae6fa8e37b593e1bade321d48c983c8916..5d8b92e6247097b62be50369b866040d9dc1afa4 GIT binary patch literal 1897474 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 l6W}*D*dQnt1)#(V#R`y^5gK?h}S~( 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%0D&CPO~z)c8xF^cr7^ty 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%0ABXN&4^h99ITE4 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

@GD+?aaVl)ugxnk}N+A#d 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

>^4x&O2rQ#n0e}?C$oOmyw)c-X& zjH#i@P0As%Z^`RTG2=)};V(y%yMP^Ezp-0uFuEmAECwTP0wX5wK-VBgsq~S7D>UZwEor+J&6U)^9R8xH-3Lb9yOPG4@ z>7(+Exgf9@=wGC1=sy;D*NcPq%?3!`UyYx4OrnC>T*JI`qb9Ytf&TxQ)JB+OIH}#6 zd>=J6CbjmQQzhNW|6@{XmOiOPKWtL-Kd|s)S$G&q_!wEcgsy3mIVdra_|mt-1|}Mp zh^zc9zyu^Y;;^CioJPH@|0^_dhvK{|V&J)XK!Ji1}HSVWY z{QS^H>w!pDy4~*Pd2jS(Ux@0`yzWfGDR(Z!(_fIMPa}6RxmDH%5wOWj`r8Y*$b&|c z6Ug^3ftsVO;QnNAinOT@JqDY_`a-fdz@J5eU*ZbTU*eK>+yJw}U6BT9l*2ea9zuzG z#E!!`u5*!wmF_Km&q8&Dn~Dt)z0r}F_a}svuu9x=a%?(r-0?*%)6|MLW5BDVM!P0| zH6!CvPLxN?|>s3 z?ULNh+^P}kM>Lnaw_(L2lwDQw1DfbXUc?V*zZ!gM4fud?G)gcJ^#dGUC;HA7AIX>E z1Kvt$ruqbMTyA+O4+@GHxSk6`;X z%M#0JiIMlRXj-$hCs*zoBN#6+Y}E1!n?au-g>&<|5t)7w)Zc`)W_j9jQutY{aI+~q zAYEaSwTR}FB8Xe9S}S6Hy-52q{Aoh{5J)=@3+@we#sNdkBA7w4XlAM z91-IotI92q`XzZYKn`EXrXlLrN&VGbYxl_2ZU*%}8+zDYE3A3GLn2&XuC&%z4Pm{@ zN0}7v3O>9SacQ2v7xDG*Uc^ISpGFFn<_$khuGB7jy;tP@E|9me`!ey4XiuUifE&E* zhbF5%i54a+a@y|8IAk`umJsIw3`5=i``s5=q1~4awYizeDSnszED+j#sY_M7JOTW- zyA^VzPE)T|w99ehVnxTQ@C#*!VUiEEUY1j2++#U~+9YxcgJGzuzD+^hW1)RGt+Wl% z3-1HcBCsQ|z|H00Kc2SVtGZgOkEhYv(YMpG*Sn{IKS!Dh^6o(2P)lrb(qZ3$!)ARZ zB%1)Na{J|B>;w5TU>2708VWS7RUuUzYOVwT=L-B{zJN1GC4hH59dH{CTY{Bgd3 z2P{e?E`E*YUj^2)uC>5SoScoU+n*g6kPnk8Ko1l;r%0!dU3IdeH&<-Lx6GsbJmqz* zVheg{DSRHkui$r?o5

8_`>15~Rn+-HfxKWVr^n5PSXmb0X#muZQtt#S`4 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%0AV;OAi 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