From e3d37563fd0405117f035c111346f60ca12625ba Mon Sep 17 00:00:00 2001 From: Joe Ludwig Date: Thu, 1 Oct 2020 17:55:28 -0800 Subject: [PATCH] Removed out of date OSX files from the SDK [git-p4: depot-paths = "//vr/steamvr/sdk_release/": change = 6120212] --- .../Contents/Info.plist | 20 - bin/osx64/OpenVR.framework/Headers | 1 - bin/osx64/OpenVR.framework/OpenVR | 1 - bin/osx64/OpenVR.framework/Resources | 1 - .../Versions/A/Headers/openvr.h | 3777 ------------ .../Versions/A/Headers/openvr_api.cs | 5052 ----------------- .../Versions/A/Headers/openvr_api.json | 3923 ------------- .../Versions/A/Headers/openvr_capi.h | 1942 ------- .../Versions/A/Headers/openvr_driver.h | 2695 --------- bin/osx64/OpenVR.framework/Versions/A/OpenVR | Bin 1297628 -> 0 bytes .../Versions/A/Resources/Info.plist | 18 - bin/osx64/OpenVR.framework/Versions/Current | 1 - samples/bin/osx32/libopenvr_api.dylib | Bin 155708 -> 0 bytes 13 files changed, 17431 deletions(-) delete mode 100644 bin/osx32/libopenvr_api.dylib.dSYM/Contents/Info.plist delete mode 120000 bin/osx64/OpenVR.framework/Headers delete mode 120000 bin/osx64/OpenVR.framework/OpenVR delete mode 120000 bin/osx64/OpenVR.framework/Resources delete mode 100644 bin/osx64/OpenVR.framework/Versions/A/Headers/openvr.h delete mode 100644 bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_api.cs delete mode 100644 bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_api.json delete mode 100644 bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_capi.h delete mode 100644 bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_driver.h delete mode 100755 bin/osx64/OpenVR.framework/Versions/A/OpenVR delete mode 100644 bin/osx64/OpenVR.framework/Versions/A/Resources/Info.plist delete mode 120000 bin/osx64/OpenVR.framework/Versions/Current delete mode 100644 samples/bin/osx32/libopenvr_api.dylib diff --git a/bin/osx32/libopenvr_api.dylib.dSYM/Contents/Info.plist b/bin/osx32/libopenvr_api.dylib.dSYM/Contents/Info.plist deleted file mode 100644 index 60ac3d69..00000000 --- a/bin/osx32/libopenvr_api.dylib.dSYM/Contents/Info.plist +++ /dev/null @@ -1,20 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleIdentifier - com.apple.xcode.dsym.libopenvr_api.dylib - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - dSYM - CFBundleSignature - ???? - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/bin/osx64/OpenVR.framework/Headers b/bin/osx64/OpenVR.framework/Headers deleted file mode 120000 index a177d2a6..00000000 --- a/bin/osx64/OpenVR.framework/Headers +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Headers \ No newline at end of file diff --git a/bin/osx64/OpenVR.framework/OpenVR b/bin/osx64/OpenVR.framework/OpenVR deleted file mode 120000 index 6eef4e35..00000000 --- a/bin/osx64/OpenVR.framework/OpenVR +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/OpenVR \ No newline at end of file diff --git a/bin/osx64/OpenVR.framework/Resources b/bin/osx64/OpenVR.framework/Resources deleted file mode 120000 index 953ee36f..00000000 --- a/bin/osx64/OpenVR.framework/Resources +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Resources \ No newline at end of file diff --git a/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr.h b/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr.h deleted file mode 100644 index f945dbc1..00000000 --- a/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr.h +++ /dev/null @@ -1,3777 +0,0 @@ -#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, - Prop_DriverProvidedChaperonePath_String = 2048, - - // 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 specifying pose used to render provided scene texture (if different from value returned by WaitGetPoses). */ -struct VRTextureWithPose_t : public Texture_t -{ - HmdMatrix34_t mDeviceToAbsoluteTracking; // Actual pose used to render scene textures. -}; - -/** 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, - - // Set to indicate that pTexture is a pointer to a VRTextureWithPose_t. - Submit_TextureWithPose = 0x08, -}; - -/** 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_WirelessDisconnect = 112, - VREvent_WirelessReconnect = 113, - - 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, - VREvent_MessageOverlayCloseRequested = 1651, - - // 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_Init_RebootingBusy = 137, - VRInitError_Init_FirmwareUpdateBusy = 138, - VRInitError_Init_FirmwareRecoveryBusy = 139, - - - 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. - * pInstance is an optional parameter that is required only when textureType is TextureType_Vulkan. - * [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 VkPhysicalDevice that should be used by the application. - * pInstance must be the instance the application will use to query for the VkPhysicalDevice. The application - * must create the VkInstance with extensions returned by IVRCompositor::GetVulkanInstanceExtensionsRequired enabled. - * [macOS Only] - * Returns an id that should be used by the application. - */ - virtual void GetOutputDevice( uint64_t *pnDevice, ETextureType textureType, VkInstance_T *pInstance = nullptr ) = 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_017"; - -} - - -// 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_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 - 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_WantsCompositorPauseInStandby_Bool = 64, - - 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"; - static const char * const k_pch_SteamVR_EnableLinuxVulkanAsync_Bool = "enableLinuxVulkanAsync"; - - //----------------------------------------------------------------------------- - // 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"; - static const char * const k_pch_Power_PauseCompositorOnStandby_Bool = "pauseCompositorOnStandby"; - - //----------------------------------------------------------------------------- - // 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, - VRCompositorError_InvalidBounds = 109, -}; - -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; - - /** [ Vulkan/D3D12 Only ] - * There are two purposes for SetExplicitTimingMode: - * 1. To get a more accurate GPU timestamp for when the frame begins in Vulkan/D3D12 applications. - * 2. (Optional) To avoid having WaitGetPoses access the Vulkan queue so that the queue can be accessed from - * another thread while WaitGetPoses is executing. - * - * More accurate GPU timestamp for the start of the frame is achieved by the application calling - * SubmitExplicitTimingData immediately before its first submission to the Vulkan/D3D12 queue. - * This is more accurate because normally this GPU timestamp is recorded during WaitGetPoses. In D3D11, - * WaitGetPoses queues a GPU timestamp write, but it does not actually get submitted to the GPU until the - * application flushes. By using SubmitExplicitTimingData, the timestamp is recorded at the same place for - * Vulkan/D3D12 as it is for D3D11, resulting in a more accurate GPU time measurement for the frame. - * - * Avoiding WaitGetPoses accessing the Vulkan queue can be achieved using SetExplicitTimingMode as well. If this is desired, - * the application *MUST* call PostPresentHandoff itself prior to WaitGetPoses. If SetExplicitTimingMode is true and the - * application calls PostPresentHandoff, then WaitGetPoses is guaranteed not to access the queue. Note that PostPresentHandoff - * and SubmitExplicitTimingData will access the queue, so only WaitGetPoses becomes safe for accessing the queue from another - * thread. */ - virtual void SetExplicitTimingMode( bool bExplicitTimingMode ) = 0; - - /** [ Vulkan/D3D12 Only ] - * Submit explicit timing data. When SetExplicitTimingMode is true, this must be called immediately before - * the application's first vkQueueSubmit (Vulkan) or ID3D12CommandQueue::ExecuteCommandLists (D3D12) of each frame. - * This function will insert a GPU timestamp write just before the application starts its rendering. This function - * will perform a vkQueueSubmit on Vulkan so must not be done simultaneously with VkQueue operations on another thread. - * Returns VRCompositorError_RequestFailed if SetExplicitTimingMode is not enabled. */ - virtual EVRCompositorError SubmitExplicitTimingData() = 0; -}; - -static const char * const IVRCompositor_Version = "IVRCompositor_021"; - -} // 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; - - /** If the calling process owns the overlay and it's open, this will close it. **/ - virtual void CloseMessageOverlay() = 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. - * - * pStartupInfo is reserved for future use. - */ - inline IVRSystem *VR_Init( EVRInitError *peError, EVRApplicationType eApplicationType, const char *pStartupInfo = nullptr ); - - /** 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_InitInternal2( EVRInitError *peError, EVRApplicationType eApplicationType, const char *pStartupInfo ); - 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, const char *pStartupInfo ) - { - IVRSystem *pVRSystem = nullptr; - - EVRInitError eError; - VRToken() = VR_InitInternal2( &eError, eApplicationType, pStartupInfo ); - 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/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_api.cs b/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_api.cs deleted file mode 100644 index 393a9171..00000000 --- a/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_api.cs +++ /dev/null @@ -1,5052 +0,0 @@ -//======= 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, IntPtr pInstance); - [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; - - [UnmanagedFunctionPointer(CallingConvention.StdCall)] - internal delegate void _SetExplicitTimingMode(bool bExplicitTimingMode); - [MarshalAs(UnmanagedType.FunctionPtr)] - internal _SetExplicitTimingMode SetExplicitTimingMode; - - [UnmanagedFunctionPointer(CallingConvention.StdCall)] - internal delegate EVRCompositorError _SubmitExplicitTimingData(); - [MarshalAs(UnmanagedType.FunctionPtr)] - internal _SubmitExplicitTimingData SubmitExplicitTimingData; - -} - -[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; - - [UnmanagedFunctionPointer(CallingConvention.StdCall)] - internal delegate void _CloseMessageOverlay(); - [MarshalAs(UnmanagedType.FunctionPtr)] - internal _CloseMessageOverlay CloseMessageOverlay; - -} - -[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,IntPtr pInstance) - { - pnDevice = 0; - FnTable.GetOutputDevice(ref pnDevice,textureType,pInstance); - } - 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 !UNITY_METRO - 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; - } -#endif - 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 !UNITY_METRO - 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; - } -#endif - 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 !UNITY_METRO - 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; - } -#endif - 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 void SetExplicitTimingMode(bool bExplicitTimingMode) - { - FnTable.SetExplicitTimingMode(bExplicitTimingMode); - } - public EVRCompositorError SubmitExplicitTimingData() - { - EVRCompositorError result = FnTable.SubmitExplicitTimingData(); - 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 !UNITY_METRO - 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; - } -#endif - 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 void CloseMessageOverlay() - { - FnTable.CloseMessageOverlay(); - } -} - - -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 !UNITY_METRO - 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; - } -#endif - 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_DriverProvidedChaperonePath_String = 2048, - 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, - Submit_TextureWithPose = 8, -} -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_WirelessDisconnect = 112, - VREvent_WirelessReconnect = 113, - 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_MessageOverlayCloseRequested = 1651, - 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, - Init_RebootingBusy = 137, - Init_FirmwareUpdateBusy = 138, - Init_FirmwareRecoveryBusy = 139, - 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, - SteamVRIsExiting = 115, - 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, - WantsCompositorPauseInStandby_Bool = 64, - 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, - InvalidBounds = 109, -} -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 VRTextureWithPose_t -{ - public HmdMatrix34_t mDeviceToAbsoluteTracking; -} -[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_017"; - 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_021"; - 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_SteamVR_EnableLinuxVulkanAsync_Bool = "enableLinuxVulkanAsync"; - 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_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"; - 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/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_api.json b/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_api.json deleted file mode 100644 index 8fa11a63..00000000 --- a/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_api.json +++ /dev/null @@ -1,3923 +0,0 @@ -{"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_DriverProvidedChaperonePath_String","value": "2048"} - ,{"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"} - ,{"name": "Submit_TextureWithPose","value": "8"} -]} -, {"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_WirelessDisconnect","value": "112"} - ,{"name": "VREvent_WirelessReconnect","value": "113"} - ,{"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_MessageOverlayCloseRequested","value": "1651"} - ,{"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_Init_RebootingBusy","value": "137"} - ,{"name": "VRInitError_Init_FirmwareUpdateBusy","value": "138"} - ,{"name": "VRInitError_Init_FirmwareRecoveryBusy","value": "139"} - ,{"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_SteamVRIsExiting","value": "115"} - ,{"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_WantsCompositorPauseInStandby_Bool","value": "64"} - ,{"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"} - ,{"name": "VRCompositorError_InvalidBounds","value": "109"} -]} -, {"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_017"} -,{ - "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_021"} -,{ - "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_SteamVR_EnableLinuxVulkanAsync_Bool","consttype": "const char *const", "constval": "enableLinuxVulkanAsync"} -,{ - "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_Power_PauseCompositorOnStandby_Bool","consttype": "const char *const", "constval": "pauseCompositorOnStandby"} -,{ - "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::VRTextureWithPose_t","fields": [ -{ "fieldname": "mDeviceToAbsoluteTracking", "fieldtype": "struct vr::HmdMatrix34_t"}]} -,{"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"}, -{ "paramname": "pInstance" ,"paramtype": "struct VkInstance_T *"} - ] -} -,{ - "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::IVRCompositor", - "methodname": "SetExplicitTimingMode", - "returntype": "void", - "params": [ -{ "paramname": "bExplicitTimingMode" ,"paramtype": "bool"} - ] -} -,{ - "classname": "vr::IVRCompositor", - "methodname": "SubmitExplicitTimingData", - "returntype": "vr::EVRCompositorError" -} -,{ - "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::IVROverlay", - "methodname": "CloseMessageOverlay", - "returntype": "void" -} -,{ - "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/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_capi.h b/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_capi.h deleted file mode 100644 index 50f89586..00000000 --- a/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_capi.h +++ /dev/null @@ -1,1942 +0,0 @@ -//======= 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; -typedef uint64_t VRActionHandle_t; -typedef uint64_t VRActionSetHandle_t; -typedef uint64_t VRInputOriginHandle_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_017"; -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_021"; -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_SteamVR_EnableLinuxVulkanAsync_Bool = "enableLinuxVulkanAsync"; -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_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"; -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_DriverProvidedChaperonePath_String = 2048, - 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_Submit_TextureWithPose = 8, -} 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_WirelessDisconnect = 112, - EVREventType_VREvent_WirelessReconnect = 113, - 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_MessageOverlayCloseRequested = 1651, - 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_Init_RebootingBusy = 137, - EVRInitError_VRInitError_Init_FirmwareUpdateBusy = 138, - EVRInitError_VRInitError_Init_FirmwareRecoveryBusy = 139, - 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_SteamVRIsExiting = 115, - 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_WantsCompositorPauseInStandby_Bool = 64, - 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_VRCompositorError_InvalidBounds = 109, -} 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 VRTextureWithPose_t -{ - struct HmdMatrix34_t mDeviceToAbsoluteTracking; -} VRTextureWithPose_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, struct VkInstance_T * pInstance); - 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); - void (OPENVR_FNTABLE_CALLTYPE *SetExplicitTimingMode)(bool bExplicitTimingMode); - EVRCompositorError (OPENVR_FNTABLE_CALLTYPE *SubmitExplicitTimingData)(); -}; - -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); - void (OPENVR_FNTABLE_CALLTYPE *CloseMessageOverlay)(); -}; - -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/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_driver.h b/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_driver.h deleted file mode 100644 index 7ab997e2..00000000 --- a/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_driver.h +++ /dev/null @@ -1,2695 +0,0 @@ -#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, - Prop_DriverProvidedChaperonePath_String = 2048, - - // 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 specifying pose used to render provided scene texture (if different from value returned by WaitGetPoses). */ -struct VRTextureWithPose_t : public Texture_t -{ - HmdMatrix34_t mDeviceToAbsoluteTracking; // Actual pose used to render scene textures. -}; - -/** 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, - - // Set to indicate that pTexture is a pointer to a VRTextureWithPose_t. - Submit_TextureWithPose = 0x08, -}; - -/** 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_WirelessDisconnect = 112, - VREvent_WirelessReconnect = 113, - - 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, - VREvent_MessageOverlayCloseRequested = 1651, - - // 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_Init_RebootingBusy = 137, - VRInitError_Init_FirmwareUpdateBusy = 138, - VRInitError_Init_FirmwareRecoveryBusy = 139, - - - 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"; - static const char * const k_pch_SteamVR_EnableLinuxVulkanAsync_Bool = "enableLinuxVulkanAsync"; - - //----------------------------------------------------------------------------- - // 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"; - static const char * const k_pch_Power_PauseCompositorOnStandby_Bool = "pauseCompositorOnStandby"; - - //----------------------------------------------------------------------------- - // 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/bin/osx64/OpenVR.framework/Versions/A/OpenVR b/bin/osx64/OpenVR.framework/Versions/A/OpenVR deleted file mode 100755 index 3fb0184ae6ded708be828921b16972bb4bba6162..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1297628 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¥%ruE$d{^=1 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

vn(LhJjvYgwK7_}mCvQc$mycEL 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%0A*3yg`@hCI~O(2p42{dh-FHFgQI=AMQG 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 z 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�!l*9cL16|>gkn5KevYVUsF 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� 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

^4UvB!>rd0+P(*i~IK%Q}$reL|BWIdK1gp_9 zAX}|(pgrfh5W$2;PmFT`_iGRj(<2Xft^l$G)nOiko@0}H2GE&_G+-*EoQseaa`-m8 z^FD%l0~rxN&tp%x7#uO0wta~IPmq-Oc{GUu^IbdV0W_x!5W@K<2y*UaS&TrtVPb@H zIvNN$JWlHH0VXpb#*N?VDuyM7NH&C4lDdW26=zspxq7FhiCm3^Op7O|(82b(`@mpOtB1hmCro$tM79Gg^2>Fqv0(1CB z^cW`*MZ>&{*g=SaoZ|qUBVj!ce_}M$NPd)t-UMG~qVzIYp3&~y+?)q^DXT!Tfjg#=YHcQu6bw&lD|P70#sv_m+*0&ye= zhuLCVU`yefdL|Y{5yEdMi5lc_2cQ_QjXZ>4#Smf4!x4a-VEZq1XB*KuQCL(5XW&=77($C>Z z;#r0@1UYqp&P-&}^Yd%;GIDkRI^&MRLKcMhc@e}_AjBXb7~ekHG8BjyA` Qv-{w zPK@gZb42a~Qs_!RZ;ohnOQRbS5oAY>Et)$(lxsMQ*UGMTWr$bf`c{7xoGFU#={X>%gAEOi&x<^^yIXD@)`cM9r7y%%`ZlN578j!lDwhv^>AK zC|FWCykJFf(LytK=0qVUmX-%6=jB(Hmai~V{Ej(kX`|7{155LYiwXkg&6+ViP*9p* zwFE%~mQ+<#1{MYb!J^8-V0j>~B#>8Lp0^@UDtPI_%Yylp^jH-fZZenW2ZIH{f@`@{hrmDEuO7bcfj>sOP`KuUF9xTpTT0Wwp;PM=x z!Muv#h>G(35tmhzmgJX}4ad*qmlhWzY#UBRjw#NosFc*@1dcyDkY=V8Ra6v}EDoGJ z{^UU3qDti1rfx}a$wE*ic}s#3pBngmF38UnUGho z7cR=Ph^fpg4pbB^59Ajj)hPDzihx@Ify&ZASzdWXFi=%elwVqaNUBhCi}Naja4$j% zRFVajhorHI%&&s4%Y!BKyD+#IiGec`mtR^^5Gc$mUKA)@ge>$QprqJk4VbU-fkmZN z<$;2t#YL5o#17wA&xOI|c_`YVCCIph;pKO@nOam53=An47MNICT(zVGs0jqj_yCqg zrv%KbU@%}1IpPjh<`orVN}Rd8vK$psTJqgxg+-OYin2V^fHoZINw#m4EGjA~s$606 zrkl%yD~f|9iz^EQ-#a@n>eA6^W>QsIaZx@C6}<6*lg*rxyoJTVNa<^VsxLF7cv0_W zj6PCay3B3VhP9txIkU91QW=xVOUufF1=G=qvWtjiBaFx+A5Bh_duR} ze#HNPA^Nz{LHZark-ZXf`WTzeXn%;=SA9-~-A6{vUAYh@8~IlI(U6kQqY zQ^xtw*X2>=n_s%5tT?z_2Z=uNr~w2MrqrQt`S-;QJy}udYi3_H z0RbDpJ|_cZRa(3>I5W5?SkCbys!Vmn(n9T>|2`g}y@myXB?bQS+gkw8i3O>yr(sm; z1N!CYSpxkvP)e4RE)7nT5qh7Kzc^T_KBi+xuSgv_Ok0{ahHLj=+n4@!Nx%%l*tNi5bVWnO913kVRZ-28>t!gDWEto(IR-uMwrV=SHDO*^6xk;@E zTzz%m_>!T4lTHfc<>v>>Doy!9vkd=cc;%8ZQ&?G9Hh#niffYm+VVEVHUK-GGJT+}7 z8ZXAu;$o@Rz;vj#$?UFy)RAeunOJC)SCv(gHFBu88VSt8{1S_UsYMH;y^k7dCL_XV z$I)=qwMt-eRY^XlsnG&sm?F$17ID56m7LSaL2t!cCL)2foIccW)qn{CI_BcQBn;xR z7=n~aL*|U3CTmGSba-Qj8iqdw^Eb?I&?6+%<9d|{nsXskuS{Z8?`sR9@JN)9jdibL zD6Ofbi!rm_OHe4S$m~!QfXbI+s*NgN!RSzU8D(XGqLM|WfhBn*d5e*2PCxAgiXv|D zaq>SiX#Jt&w1o073}B`ud8RaqE(4>PtN;=4vb+lP5U%T11d8)eJ%wBVKn}$>D_B_x z3e&ItBSvY?of)WDQBfIO5~wJw5^1bAmz6L8l!q$ znba}LrC6GjbH>Oi`9g>p~XB3>y{1mN=;#Gl%jiNIDbjw$o9lspxhJy;C8JKdT)O0xAt9J*^ZK zkIb;#+#Wj$_2gqoaaNT@TE{3<($vyrf$Y*{DBBD3D)S2q&@LIotg5oI(sGt1Vvs(d zX+nE*GZ&b>0;|!~k)v&GMHR*}H!ze2OJOwX$cvz$sDg#YdcuOywj;=(oRQo~c@>2V zOY_R3yXR;WV-&MbZbqXhA(2(OBwA67Mj^tzknVjwq4Z`37h(y;x}H)J$i}i4Wh`k% z@l7r&U$PAPEHJ06fD5-?5-31VVkVZpsKXV#Wl(xryY9G?I*O{)y0Ng&FOhCBifS}# z+9as}&kcp*6P;R$B`qptR2s^|x}&9579n$JI(BIxNrem>7s7MzgkhLJ zReG(IokymDj1`4wb28hi0vk(2tyh&??v@dXvv-H#CIMDq3#k)Oaid1sa{Q7+EW!R3 z=Iu+0xQ3P12<3sD6a*DqUWxgwrtMxNNk`Pvb{E~s<^TU3%x)_C5D7DZ0Nurs@|8FMc%xO zqnHlDfz&Zt%3i5Nq`0mKOqw@xB=(!i3#6Mu8YS)v(_6-4tU}A$Jh?!lZ+(A4zpZ;a(;!;oW<8G;F414TIp3jF%(fRFB}!*q{vNU(Rqj z!Rh6}hUQMO8M#$*zO?#;DzN!iENMhJ^$IJJC8>mqIb&sj=mEVX%gReJUM;DJOdrsc z@l+5F}rk*t~?NGKM9Z)hb2efK<3W0i-v(4fhU5AOL=8g*+BJ# zRfH@e+$lan^zza-V%w~dUUx0Qr9@vjgyPGk8+QNMbh(r4+G0wHTep3~ojcQ8W9%*K zp3s+Me(p@JIrbJ3`Ck%yrdrxUZ z&eoU}cb6!AN+v2eS)aJe6L)nI6r z+bQ?v6YW)|aXA>cD`#N6@#T?uUfft&QrO``?P2913U!}i#274V5%srEUQ|?@<*Ym? z#T65|D)|b2F)^4>wD_xen8nq~K6!CVgf+~C%RYHx$*|%idq-GQpa93}pJf!z4{a)=m(&Vg1S-C_-CCi^2 zvHM-74Ci8cX*mxX0F+_+TrpgsZz094sq!T}gn~^Y&X}<~Z#VY&REDRI_VQcaiB5q&t3a-z#j!m`Id=THGf|$sGF`$$M?1T``moZ`D zq|C|g!8#9i^(fkPjlymVJGS6GK73j2FBv#*3iv)CO~(@!PE^?C!gFwJ6nI*uy1O>r zXwotf2+cKO0~!;8pNMhYE$p$J5NODLEknQla7bQ5i)Q*59;F#M$|`DU)&9gQe;kkY zmGL2*pU2c#|7lqD73KHw9pO*LF*~mKg5{ak&*?51l_@tp^1!&DuZZQJF%feRs;pr7 zgsLK*X0i!$(-YyJVV@(afbvI;rZ0UeU4VzR*th5#m82_@p8kdUoz4nGZSv(FdFdjbZI#qGW~Vp zhIg8Vr@`U5_16i@SHGiYRFy}H)EA-6Us}IRwvXuim440qsW+~E=ggiwc9s;B^T3gw@h0NYXlN5wV8w`03*}AkGE*wSS%vWihlPyl zHgCrzqf(;aV?vp(F9{YDVgBp#i-Hy7^D2=nJj?(Zl;f=|KLZot4Lc>Mvebuo_6Pf0RmIO%*HU@ngJw*saw$32ASfqyk#kpk?h#&x)W@|M&2 zkiP|I{Q+BV#p~UGO?Tq0R=|$?Q3g{H{zG_+1TgzIxQTFDl1ck5E>Q+--;7sY0Nb9y z%N2mx|BbSn4*A{4_YA~?66*lus{#jPC*j&T#|#5(JHRnh0h@3wPBCEik&bx;unad- zK5_xlk?NS8ggENoHWT5cJLWUM+ziL0&VoE@p#ZRLwqu$ATP}4>7hovpnC#gIr^GQ~ zz}8a748m<6**Nw-AFu=OhTRL;g11U$b*X2()5${Ei+vu2$fGzEgX~)+Xn($WRe0;Stw+nDS(($Qdo(9Z~jWOMT ztqC#aM0`A@?0^`P4H&?EDpv!h9~@)u08GIx4Lbl^06PFfc-5pBSL=4+hNCrrx!;K~ zt$^9Mr{k;~mP?Fz05CKw#%u*_xirR%$wj)$VoW8jk#4JwF;f?UUX6J30dJ2ns{zyR zjxl2k5MOJI2?MtMCdL#5Q9r+nF*^a{$$vQ_aW z=_>GX@#z>syfb<)VC&|1(+=3QE#7oLV0IEdlVFYx0sb?=WC5BF6U=php+gf*8(`Uqi6&_! z+=nEZF@WuWWu$RO!A8I|d_nFl!1VEnCgoc2acAyXfa&;((PMxqi$UWJo|MZHO(9`P zqFD{t+LCD60b72aXvSWL`fE)z1%Ms+G|SU~O`8#KEz-3;(JTjS!wn`|0aIQ~H1n@V z`u>t=>Hu3!l9_q~(z74j0NW2qGHU=kjz}_F>3$5tCLKsJN7upsiAg34uUPU}#}4adb37=J>i0Y3*}Pr%)3_@z%YP8(*sp_!1M ziI<}AR%P})j29OhC$|tXm&2_DewG=hYZ>Cb$~ftGMJ7~_blr-uF;;Y~HcnGBWNw4o zI{5uL()%kD+xjrV+J^LO1ANuQP#1@E|pFgCOu<(R;+j?;Q7Al_X|9}A&zj>$dCaXQX{4$gw?d5&qF z2Hpj5yU>YEzX%0*IowJSRvE&%0=x>xX~I|#sC1n4N{kuH9j9#t!nw+Ey70{5|7ZLW0klO|NHH7&Wg#Ef>I$lS*-$7jOI!-8zaKnz% zf-xawx8s!Ijkh*HgV%Qwa>o%d zPRrn!#IECGoDS&xrqMCTZ;WZ5662)fD-s=ZW1PS|z83|w zom}Yl^vB@$alq}dPTTJRpNVz4p2e8(GUA1954?@=-$i(xi2EN1zZ<;IAoF=Fb-L36 zyO(m{5Yf?Z~=64UYyfb0{2SD zU5ml29`5%*{&(=d9sFnGkPhhfm*DnVoYRDN@|zBdHyww?o6s@wPTMi@CIxTfHw}w- z%DxvLlfE$CX@^cuD+I3!I{Oyz@!Dc*OT5$75^vJi!R?`Vr)5igOxfGFP1}FL?Y=}Oa3B0UlxRABndo%< z24VgQ@~?pZdZLs2CS=}8bkhC?e|UvC_aneh6HVX?#PtPax;;weT_vD=qxKg>@GGz`{E$ zywAc`3m>&`tA)>6xXZ#fEZlA3hZgGhNAZ@mEtf$S9&2H$g`+Gy%fiVPW?Oi%g#{Lt zSh(E6Yc2e;dhD`tH(L0Kg+H{g#loLi_=ts@E!<(@3l_#r(t0|`!oe1vVBs(ePq#4L z!t*SgZQ-RB7Ft+t;nfyiZ();#w_A9xg}<<|v4u-53|Y9!!qpbuW#Kvte`R4PJ-Vj1 zW1iKYX?xQ4Bdqmk(k$fKk0#Wr{N7NQu$s17|H&9@VbUzjwNM;kaZX3mWy4b{Vux%x za%bSxVwjMHU9&Mp`b>+JYm=)~FmJMQ?O1F1P0BV+SBK@BYz?>RgJ?PV4lq1+oS=O9 z0D(Usi|5+#LRbUQv{=YB5sjO_Nx!t^A+9J7OPASnTW3!`_e=O8%dfNg*!Ay*7vL?; zFzFV$d^bH^z0%WWX*b`le74PB`gb%xxfZ&7H@uWz^~#^6UH`894h&;7^Bz)pjM|<_ z2e#~Cb#JurP78lx;m<96)WRn%eA~iK3%x)GK(cMQ1+dpZlV;mN@Ag?{SH?UTl z{!|-YwuQT_d+&H%f4!j_p9_2QUE0l8wyl5H-Gg@CkY>}_(ks2LT)WF(5}hBH@4~KL z{6J~6Jog;@#!X+#0O|Ak)3xd^V4*(@;vskbQ)A^Uc7B$Qy)~Mq->APP+fH2Q%H>*qn}xeZF;F}WoY9(;+@u_pp%^fuIhSnF|`4oT0+x!8R?JIepKcwe6tPa2uI)P&aj(}w9F+DM3_BM-FkbiMx| zGbg1<2q|B~r^M~cPCs$;Ve^;8-4fSd++X5zZ*fN+yd&xXAG~LdsaR2x&&-EE>$mv! zF__be5Jxa`=J_}ka5~Qf6bCa+Xji0`{l&7cVOA}|Wim|L*r>AENAIWO%}wMxGdsW7 zgm`#HOmySe*PxbH;F5+C4Jz=p60^LbtcoF=&(sY5Izf!X>sZV9Lb6m>`v4ijyW~|k zFSRt7vxM*8Y1e4~dw;nNcq2?&P)@Es;Kc_uhEn zcSmerzx!Atj5)f&&Ym)>a$L|o9%MpwA4TPP_T1?s({gh1moLv-ShN&xhy%x!TNODh zgB-r0&ICERDJ^x*Z(3SoT6V>1iA4Jwg)l0L`tjQGp&MOG*lCLy+!m7s`)--HbXyE#5w%o7 zG5Eb5ao(}7+p<1xXkU3bWmV+}jhRxQlIEqib@ zAvs#dFr21A3}E79oDW7Q?oBBZ+0?y@buj!M&~#XO4h|;e=PapM%p{zjQcE! zNRN*6N*q!ea4_lbMA!vagbvomWVQCh@D}oVZ^LjNWy^C;rmY$)ZnTg#!gP@Y$ zGBaViJ0VHWqM#8KMn#CYja<=)iijvdMG#zaal<_>C?Z$my@H5a)TixZMz27=H zOC_D|&LIEi`M+>x=98*ZRi~;>ZKvve?Nmx4?J$@4^bgDv?qVPQfQ&!n<=Ef+mqU+k zFWuilL(0t~Bcx?(Qf-%`gJ+K2YlE{J5;Nm;c9TpDUYcv+*J1Mr?aCh5OC6g!r^ox> z*ztgJ+&a65-hn6`q#*Ti{ByoV29)Qa*;~|zvMa?0Ne3opIK-Qq5n|6I>-b2;cm%+K z7Tkeyzp`7Yfl-}8lzh+7@t&axYhZxgXvcG6PgL~xMAfc78W&M8cX@)bqI^GX;FNcu z;c$xXa4>}Hn@h){tk@-iS;Au(aKuYnbi=0vA z@IVs+?2b}jPse?!6jYeyCWom4eYA;z&Zyc_X-0_SYL}_5fR8sfNcG^^)}>G8x{*wI z@cm5*ku<69P-Aa?Wpd33k{T$|BRDXFxA{Ob!ld&bq||9Z9z5TK5PMQFI{!Dx?+?;> zbJIgr*n}|GTQtWV>56h1?`vXsGcy!y zrwX>zgkaUQkCOO66T%uFsXlVKUU++aGn75vQv&qEfc=8+;Y@tA2_fpIt+>N#Xu?CQ z1hb@djLUVTBRauJdVCSVYzRxImtE#+0UJs}Dm^evWBkCS`;9l(pCq}{&!OZNABxV% z1B(bk=RkfD_fDq=B3yZ@<88fWH4={U9G3=Riwic+_ZHmu`eX4`Tt3aR9z}ZBqVCq& zQS{vHS)b{o;nFUtI``H0**!N~^;@d%muj;b9X{alhC!V!aCeF(6twqjqy@ zf{xmgQX(2e&Zgru&m?8$Y8)zoKWe_eQ^r>+{)*X4m(sC2a0!>q<1R0Ha#VA@LuYHY z&H0}7WfBd`EUU=bU;ZRhazS{^jb~)x3f^CtO{I*iMSC*x`UU zWD>M6OY08wOJ4s%`uOCRoB5aV2~y6-?gb`N+ZR{9?_!#oCWY?`i-MEW2~veXp6?Up zgQ<)q!Sp^gBzS;nyY08EP7qZ4YdahJl_%p~bGCD)?H zl)Lm#JEb;gL>>WY(#!XkfU}MO9Srm83OGaR zQB?^)&Ogl2SRRi`s}wEK!16#V9o-EaMJr%z!n2K*9|C6&2KKkGrXAK0YOAcdtp(>* z)uO}|BYhD*i_(e6k2|Y!pLvufa3H=`BI90WZ%q0Vmk1l)&bJOA5ZVxKvob^ zadq}Ka4V&;^h)-5IsL(hm0Rugtw5>OUg-;vDd$$S>45{wsvYk_R}rtHa29za_3E}o zE{PpzYile0{G>ozTmE7Gv+&4C^ql%>9%)RXHTrnrjWV2m9ND!C`4 z*A$LU=GsD`VoNeh2LghXRmIkFTd2@VUdt=dZe_647OX7KQ^fgGLZyGsttuQs(N!q4;<8Anyqcmf z{8O^nl5NSJDpBQDt4KJS!U~C|vV!9%uNcd(s2o{r&98KZTRa&-Qh>RZVBwJVU?dpI zFUz*%T1(IF&mB?;Wlt@w2<28$#Kl!(q4LxE%gaObIAbL`ty3V6q2e;;P>}!QpURXT z{vj0V=fBD={I6t)!Y#M-)3XJW6jme{%pFF@QG%gJs6s!F6*pI=*y#uC>2-bbpSXE?HbrK4h%0qI_t+wQ^XwH8NJ9jPIvx zZH+{7%P2D{EkVizD)~}tv4x&2L`kG)EghFXE*KmuFAoOu%d;!WZOKq5zamm-DW5*p zKNf1|$D{|ORJ0VW%IW##g`)~j&mNIoRcbG`WvD%wZLJ)cZ7n`Mx4g8h*q&t9{2^mO4xW-$TF%8(IFf=oA((Hk ztWfz+Wl(7;uT-h7P;PMyD}&{hLTiPBCD%xZVl1?l+6qUuQ$dF)iTpp+Ci@@35EULp zl3hh56CC3(>=0E>tSKE|I4nzfR9aPOskG3&lo={?e&(@KYkxABUluGZqhw@TB6*5o zWw|ZaTRJ>{M1Se<>=D82vI_lISeZXA>-#m7EG*9*RoawmEw+Z*%k*54{`|^dwza%0 zx2#OHrPz{dTjXu@W)+XD99mvgSXo+?rlv z%F8OPr4^;t?27EF!Z9Jr$7S@khCp)M|PdY~=v z*VnR1xwgP%{}u>D={!ZT5qTKuGY&82j z=Gm=*ApN~_ll=WWI-|@Sp>t~N{xUkJrv4_|nf!O})$;e%WOSan@K*8PIZNlfh;QXH z!1Q;K&wbI~2k1N(|D8CN3}&_j)ERqD|63Jj1MU4xbbJpS>{l504)NjSU!IoEtAn#} zKm0feF9$vaTmZiaTmo+eSHQc$!L;= z>=3>coCV(pW}O2poyW`l$(_P)1DC;ffLSL2%TK|PFj{AAq} zEIGy5K;%2Zw}F%3zk!S26ZdD*@Q>f0GI&xkJ?9U^{Q$V~L*e_ttOJAP58C}#!olZA zdRR9G%NE7iK&6EeN%9f6E3=x!--ml)wYWb4E`fumNct+^OB4r`jtvg)``|3;+FVbR>Cj3H(`b;0SU51$gWj;UiCz@K~n@%h_Po?ZI*}I6yi+Sgr%J z&JUKB)8+oq>B6UgSr-V)u;w#`F9)-35SClPtRsZw$Kc|6;T3cip6dgj6=yjeoE#KB zPrHL>z+>l%`}N=o__N^PkhuR89N8lLcW`?|__XIr{CV&&n01-3TnlEMCM^F4F27v3 z>z{G|#li`&*l-O5{sbPI5clEdiGS9K!g4j3b)&G{17;m5EPn&Dt`wFH|HAiE{ogIT z9URyrd?z?U=jT~|1WtlaCcOik-(zeFn1l>7Db8Lld<~d&val4vteb`9*NW+VB^@m+ zPa_=$oSr23Y;X?zCdJfWfFB35ZWorFA&I|yK=^fF*7?HnLB-VGfWM;sgZ~Ei+{zHLQ72jrXphft#;6khLZQB1b;U9uo2N28u zf`iM2pV=qjN5E%+li;}GY#;}|3hqVl$G{cvcfjo{B>cy~{oq4iDDjPfgWw$aEHLXT zVwnVIR|@Y3hYk_G6Wq?`zDfQIoC7aEQ{pRtPXm|0_ksg!A_uD|ih2Rd5cx z>@4wL0tdkrFjr{BRho&uMN3_qR*<9|32m|Mr z>AGTx6Z8G7`-IYIbAaNtDYzkoyF;|CBw>|mb-ZV!t8i^2UgKW5nvE`r|;4xA+J1??aFMQ|4U zfW9C6YkmL8a)0Yaln2-%K9Tab{kh`43EU4J1LwhafD6wP{|_mq@hbRlaBu$?aX)gC zgwHz4Sk55k@+|cVZ-sk5>9Jv%24}%nYCcokZveBdGnU&GXGwRM@Db-oe0lI`;39Y< zxc_YN9|h-VU4mt=_78pwxB|Wf96U$-e*qk!^$eDWz^sFfbGi z#eEnYc)9QlI0U|unDZ}kvABN_?yT#L<@4Yqt*fy72>x?P;m6_5I^kH3K3CF{y-fJ| z#2kL|a^dsg&bs4R;@Us0)3Cf=`+uYG2jE@?e+e9Tleqr^90V^r5B1|}aX%4Uc(d>p zaEaD`Sf;`4q|1oq_23-%z2GAFlVH|)$MOx$*9$)kW*vAee^E^J`8MG*h9rIM1>v*7 ztRs(Q1kAefSoVQgXCBLqVAh?-@;Pwf$HG4avravhziRh~g-<>o^#$AyW}SO16O`{sH{6PC%C4h=ez`TzHt6>t7DM3+^TG8^P@>#Q#nDe(=3u)-}lT7jR{z z@C#ln@%66~o&@K>?*y}sLYBM11@I5RTCYaSFo#F;1L)m2K{2h@fV;t!LnXZP!TpB| z$G~Gp2)`0sXcvAbIC-S-C%`%IxApx;iTkg#JNS?hJnzxsei}FlejPYOx)@o024>xi zEL%tAe%8^*@)O0`KQDYf+`kV_g0I{r{v#oAzfm!@H{jL_B)%N@ zG;pXx{BP0REu17)^`%$%8n_4ggg>nPgTDwK1OE*7XI~`#+g>8^m%z^gvu;Y3b;KNB z`NhJ!!2QF*S1bS2AAxTHm%-msO!+e+{{IWC^_4sh)_O}0yHL`Tg#XhN)BFnhUtXl$ z!P~$&@KxXf_zrLh{4;O`y!s-Ek9Bae^bzy(vMx@RDBMd|2)`1{IyzZCt?$1^_%ZFD z*6UfUmrD4N8-?GY`6l6Sfb$;{?tPi~FBgO_1P4ATd>L5j{-p442N&)Z_Xog{qVSO~ zm+*?ie_JZ@@5dI*Tb&Rq+1ZI77EN4XJ{?LQMZv(RqQkD|9 z{4?QoW8%O6KZWDqv7ZZH2WH)+EZoLC;?jOhV{Z{zZifMjMI!;-NaA%#TEay&$ z|MDM%w}adND0~Gt2tIUD{A+zdDb4>a{_g>2N#`ERZ#0wcJ(e@3kUsie!}3aSGPQB3{ebA+ei&bne*J^*fqex$E}L*U22TA$KkJ0(7?S1AP6 z`ju#ZoEpEg?pc-t#QeUp4qBEI;^JOdFZ^mS>!xM-JeYOVvaGs<{bvJO-_%K9t#|50 zV69*3C19;j>eXPaSL!CP)-QA~SnCmb2%L*Z{3q^`_zU2j;QWil{ZruVR^esS;y(|5 zF}Scz+;0E}ULyP$xN@PeH6!=8UnCp{hrsUxN5DS=_rFy9pE8U4qryAEA@Hr*eN5bc z3+^8mwi0rGXj1rcu-0ev9kAAabV5@6YduGog0()OPlF><5?;%t;$Q0-8U$$G|s$3*gUz%iv#v1Fw|u zS7ju=0{Ap=34A^{dztu8gY)3ef{WlI<|MrAtHi$r4!v4<1RMch1`cG!{e$2j_zz&( zm!jUMO}i!h0Q4xu!CJ4Op-1Ts zu-2>eZEzm$zXn&pZF?pB_WcsyGr>vlI5-Es30wgG5uAU6+`nNT^83xgZv*GS4}%NW zhk5G;JMe~dBB0!BYg0O z!Tq0+@P7o(g8!ubgL|%&``bS&{$B$wd`|e^!6on^SBd{@QQS`<=Ke1aUJEY#ySPuo zf9PJ}EA{>0kAj0=5cm7R{orHv+u1hbBJmNVWc{>PRrS3CpGf}iy!aSw=&@W2jmWrg_v2)MjT_{^)tf9_D>_kmfL zJj*u_2fh=`HWOG* zelOBby1H4e1qZ>O0Y|{U1hZ~$mJNBizYM+)oF%>AEYEtMxaYwc&Bu!Sx53$`3qSux z@!$Ro;WvVl#|yW?r@y+612LA>eTqo|AeOTNh;5D}hv+W9& z&_{&xgTe#13bRcMmdzg(4qhyL(#OD2;lF^#CWNoOP23CMnSyX~r?~$WoQn&;=XP-q z>=NGjapAF9;m{`#-lf84ep0xU65a>SvB4pdPlDMN2g}dy5dUnGgXM@jg#&NK{osD^ zp?4v^w}^WRTmnC&-QOzi=YAUDzg_qaaQ+>_FS=XYi{KlR=Xue6@pIth|FFDMF~v_dfLQ*h-N_aZ%jWO0 z|18-`6P{2^-z&g(gM*ie`~C1Ac$M(p?@4@xD}=8Fm%z7y1FseLuYg0~|J9rm_tU;F z;f>uOd=5C57mkD3h7rpR#A-hD5#c-G&Nhu$eh+5bMl2WKFX6L|BbKX))%yQegpc}x z0@5pWT_103oT_x<3~nZh3im(LRZ zcX04*;U9s=z|a3F)sHr@gUHX*4`zFaEW==B7m;`h%=Qskc7xeYBFla-+e>7*9?W(V zS#AZh{X~|}gV~NE%Xh(SPm$$eFxypR`5*9qgIAX&{cLBETVx4=+3q6CdNA8x zWZ4F0JB%!GFxz8fxeUy98Ck9cvwcRE8^Ov>Bk>*J0NG_^xev^C8(Dq~X8VmSzXh`$ zN0yeK$@8#1N0wv2Y}b+HG%(wDWO*T&?L4xa4`zFhEMs7{`^b_8v;9YwE5U3BlI2}s zWe<}0RxsOzWcfUp?L)GB7tD4dSsn(ny-1eF!E85@WzB!e^RfL%mJ`8jN0P+?vpq?c z4Pdq_$#Mah?Mt#;0%kjtEUyByy-Akqz-)JtfwsXnyIWXJ1WcetI6^MFx%H;c?`^UHd+1- zW_z0~M?Eah!*(}WP6f05O_mpe*$yYmW-#01WSIc7T~3zWV7AZ6@125iSlR0& z{y3QJcCvgK%=SB39t5);PnO?;*`6m$>m!nWw(H4qEST+kvOE{ec0O6o2D80SmSHg4 z{bbn=X8WHkuK=?hP?l@JY!8&>Mljn2W%(4C?Sry>4a{~zS$+a$d!a0U0JGgtmKDE{ z=VAMyEYAS59Z{C&gV~-a%Q`UI6=m55X8WQnmw?&MD9fwBY;Tn1IxyQEWw{B=_D5On z1}i(H#NPt5JyMqc1hZXImOq2pJ}JxUM^QfD6Txh+lqC#iyQM4}!EC>j8C~gV~NM%g4ZMPnG3fFxypS`2m>i ztFk->W;?4ae+RR@RhFY3ljmW(t1PF2+5Rfa3&CuMm1Q%S?Xj{2h8?uS>6CT$XjjC$6A!DhN-2cY4-s?z?f!)L|2y+xv>)kvC4EL{sOW>b_9|y1g1Jd&)N#7~pbHJOx+OFJ7!P+ig2CVJxT?;Pa{@cJ0fWH9N zcIJKp)^_>Y{wV1={mYV`)42dw68wFzw)^!b zu(osB|KAdR1^(XzZog0B`#o6ONA3NS_<#CW#r;BXKX?wT?R;GW*7n410Uv<>FMx~S z!~ZPdYrCu$f1+s1b+s6I{4e*5crVC5kI(<+AwvL+TzxX#;bHO=TA`>_-AnCUxhb-%V!Jk z0+-Gbz7kw~f$%%Q1%&ruaIiz%@75d^{sB1KDNN0?N>900_;26}!as`Adc;xLKtPv2 zSlj9Q09e~&<71ykaQlSzq?{u2`#k(*4?p7J747cuPxNr7hi5$e1`mJG!}ojm*B)*;(jEU%9^UBTS9rMK z;d?#&OAjASeT%a^pX=cZJ-o}qH+%SD51&MRku&_L;;h}C?C@~H!@E6vx#9q|IwJ2C zw%fap3ftj-#p8az$Nfc9OF*^b3EMV;qyKGG7rav?ewNR?)yFN*L(P*9=^-N zU-0m^Jbb^0AM)_eJ^ULF|H;FD^>EwMRDRjdx5mTAc=&h^pXA}wJ^TU>cYFA34{!AF zW)E-k@Wme9?%{-o_jveK9)6uL^>QLNc=%2af5~(IH$8m6hkxqfM?GBe@ZUYW`dD{) z9p&L?c=#j_zre%29$xF=b3Huj;fp(8Xh>%jmkCu2<2;TkUx}IBx;JmM-4< zO`1#tyv6%%biJLfchL1tx(?9wF1r4Wu6NUQ16}W>i^pB>r|ScBeUPr3=;AHkH`DcD zx^AKCBXr$L*GK8%?ccn`o40k}PS?lj`UG8{r0Wj4c)RwUbn&+9Pt$cbUH8z%+m=5| z7jH-YJY77#UEiSVn{<7Pu5Z&t($D$3 zo31^=S^CX&T}i)RMc011-a}WOuJ_T!X*ip%|G)hIzghmlK$P?+lh$OP0%ZJNRg#P! z{A!Tl;L?|D&_rzV2F=Cn#1Yv_l)XQMRWb+D4*kf=OWLeRS=@a3llf<-5@=?hp6DhS zQ*#BQb>%P4+LM6UN|r*T}bo4f%5 zv$eBm)NSUBvTAda?3*n)D3@U~M`(+(Xy&|sQKrls0o1c$=I~}4zNi{6W7pe`UwUU^ z&&>GjzQyIevOTx(B2zZboVV4mHdn_>)y!NSPs+Yr9e28iil1M-g1G4+NTe)X#P z?y2A8c3NA%1n+E_D5h9`=Yx;e5=QVq3aiwAn`=TEmKMUr?zaU{wXF6VapIk z47K$_`dds9(m#|DLi(Ex6>1BG(e3i+p_m_xZdY~(quZ6i!RU6e zG^kAs^51NLPa74C&WJTZ^*7nKtK>i0C4vfwyi-FM@HWe66Ok6SDS<&E&@R{P=I%ke>iq z@RNVQo3h!*zlgEEs+GQ}ebZC)``koyB0ft6N5yv0=J4)RxRX|1hZ5scw4OV%FP(|a z=#^hJ_~15ab_bc{RB`sWwnM7~L_Q zm>8dq?j~<+O*LwbOR*?)h1dP2E3tP>L~paywWd%ANRR=KRD|%;}+fm<(OUQg$rzd|gwqOXp&P zk`#F9Qzi!oxhk`==9Gu)dVo^8YE^T@a z%b5Xe0C-@SA5I=qrhCo@KrA#qBpbzz_#{8IIw(VW46)1YJ=82r$7g9cMX579hVd!9 zo#JS8G(;sl(x*~xxie^_J37)69ktj)ceGl6b*14JOmao070z6-deXb%$@Phu88WM_ z>|l~{>&+vfXqN&w^Ctfy|v6}SV|5}>m12D|S6Pqg;FavA={gyNPHjvjX5_`^ma|XQ6?0v(kUql;L+R6ZJQ@O5AIBG&T>^`aj2ehE zH(1ic${VforIWgYp~U2PCZ3q(#**IN^@-`Z8MTBt9M?%(z)k8=T>hg5i=J*-t@UNx$X zoJZqYDy=>#Emu;kK1vETj&qYdRgxwhfhm&U6iMefQ>#Im_Am6RYN7; zK)veT_^hjXkKN5Tp|f>1?9{GT+rVmcwdWfSKl4vHs-EYaQ&hdy86}yMT6556@~#q6 zZ#?fvNR1)A!$+-Ay~9h5fqm6SSdHzeeWK-#5xS;hFP=+eTx&#C&sMF8fWwP(F5s9+ zReczz16AjFW&{q8^GymIUKc*-cifC2isX@d*idskwBT{QBfbR;?HzX^l?{yURVU!M z(|)_3)Iq$n^{0iD^J6lNZ{iTs@rbpD(Z;cRLwB0q@5K&hs}Y8mGG?s?)7Y@pqUExJJq*|HddyblfuUfYW=&yyL=Z;J)#jduUk4 zqbHNyqr*D)88h1s%+od;v@w_I;?vGABPwUCP}M`v z#&I5x@3X(1h!1}dmPN~*8)DnX=cY61frw|VrDnMH28~+bx~q!ik9gh?+{JDRA%r2Y zRB?k3t7A5{rMt#Z0_jq|Ar*Vwy*hRD@O=)osy4YF${ zw0Acx;7!pK(_8{WYQ9S2<~S{6@j(8(*gjQQYQdv}N^p=@d_40+`mWO8qB?u*oThp0 zAbl?xpqH>KD*qa&F<+7nar5|$XBup0YMqJNf>&egB_x{ZVs+bDBAsd_!MXZjH#fei zbEBV{Hq(mEAkD3v%S|$KM`j!H+BE<4O+V@VLPm4orf6!tP_&p>b3nJ?EH%9=&X2Ih zcEB!N{l=)I+NI-Im9%71$jiSpFr~FUOePHt6c1Tt+0MV+#W1BGaK0dvO7h}f9GRpV z%s+b;4W%97soisTgg7a{U^P(#`<-B(63{kw+}P^scA9U_28W zpyol916MnQFiUHr++;*{4-8E6C+GUlCaVkoz?A8h*q3QE9!$lyyV`eu+4RL{CsXoC z*0B_1D8xRRfV(`_jF-O=&Ct%8*oHXmPEbq0p4QF~JbnHhxRmx5(d(sK##)u3b25?K z=kQlEAsxG7`g5}5{k99Ax;Kgp->#g^uw|r(V@=<4lif(v%w<=w zHGOr`b~wG-QPYzZqHR<3m6?0vfr!qp#=JXn#OhV=g4%GW+aXUIWb)x|giJo3BCU`q zY5(wMNZwXc(y)QZ>TtDC&SuqgmtM79&|T_a3x8(tH+0VU++ljEhR4xeD?E-*kqY5S z)l;M{cv7XSfuXSLl#Q+i3%iTsa(5%1#Bi|nJje+t=LVF%fxVNlB!9`H`qIoffg@mN z!Fk4l4R4UEj#jDxyCU_t zYVzQ!c?J*eDod*d*pDvbEY*|HDWYm+Hw7_Y9IlOyG}@3)_%gGaPV;oZx0h2UJ$mbA zB8}}Hqcn@4Ikq0Ls0It26zJRh>b*5Qt`nSG@FaP!QT zEZ01$OYJW=OnAcny{DAHo)H1RzqHkEDkd2eo02RVn4rvzToTcB%l*(>T!RWpwyvwr z(F7idUjhHmcFo5+9j$g?H;UY5w-y7G^HjmG49DjKxVlyMn6X=OJf0flT~OqgS2L=c z&SYMNH1Y{D!%WxKBvQ>B=WX&18CEiPsF%y&z+3w4k(V>59km?fEi?p0n@`O_^^K?3 zqp)OF=!^$@iFomcXPEk%g(^m?V>hoBjV5rnU$}Ds3lEpnLb$ z4zyR&Y2WHhDSdP1XRzHo!N&L14%P~fr-#N z**COzKh@Hc;fsJaU2(RdO4+GAD4j6Z!I56WVy(SH$5D5k6}!5HN9U2Guc;pjd)!)i zobgkW<@lVeYTb|(8sz>hwj)LB_x|3`3aO4ooc+x(JyFdjn%rC+xwDo#PpMH}%+O$` z);Y5}x7E4J`Pf!yCk-m(2ptcyYQ^Nfhgz_O-qV?(!3Q1E(W6aAYtMsQcDW$MAGv5U zSktXbom!SwPWlMP{LdYXJ(YK+yi1)ZH}qs3bgtYPEjlKrcSl}(eOuwkcxLC?)DG$? zXEQY7c0GX0>?BH`f%|6Q*m1>~T|bmFipXarMk^Jg&`M^791V+$Ew;&MY;Z(Vue{ zyOfAt(wX@KBkQB~|JA%yarVxP?~1W!Rq^DD=u)D#qPkIwu)Z62rqN5tJ3BV0IgLt) zyB(xkR892V<(wbU$93m~$Q?o>_p2$D{R*iFCHtFEqzlY`8ZA#varO_+(ku3)mjP`a zkdNqlQusJONM|~@d^V4)i*}yJZbJ^%tmP_kPE+l+}kRu-cxkdm%m6P&IrgOkd#T5Gc)&GO5HgZyBRa zdUQP4?a`wC+vi0_b{JLdqz}@ZZEpQDXt?^6vJcihByu(Lz%y zk>r`6Iv>9?!5bo72b`S2TfGTB(LFmwOBj5pY-5a$L^*p>N67UD0uGN>NDUd(4A=ig zpx8r(s4 zP0cyS;H-D9((Rp_ozDwzo;jcP>hi%zrTL+e{I@JsjCjDB(ObRM@j4xOtec6w_JEtV z_gx@^YhK}RTG^T+V3h<1GXnkQ>sYWQF_Fd>E93X%ff}#AWq5)GzrKbrY8R%-^ZZSe zDV>Xd?+s}u;mcS6BsXZ`wGq(x`kMp+;^7hbY+D11*^Dx8v;ntyZ zN2VAqtwi)iS1a9dwA7~5Hq_eKDdvQDbsf>GXGq^9J}f&{!@?bWVuFrCW0AnwW-YzF z=QM=TC95bp2WIDHSSgYG?;L1ykH9;k?IzRH8du%i!?W5?(2QBrLY|;zN_6YVl>!3- z+MzA&wZA1bZtkwun3}OHv!!r4?y68BX zGmkJ6sB=r>2g9U8d6Ex?N!>I(D}AfcZU17IGpn5enrg~A-hrTIJmyMUV<=84$7!HY zt0yw->Z>`Xcg+4hFQL;#*9H64t$u-Uzn(Rl26y1Ky?J7C?kjc2t}p#a7oB=a({92{l(est)?lsjbKZwE zEpc0me@NG-p(SUT;|oz!9@AX{U3C0ta+l62jN^DjCu&z|9oJMLXor+181e4YvFg}p zMM3#LBp{jw?sLcIDV>9Ve?!%+ZZaCEWOeUX**AaHnm>#NDpcJ-+tl>wrX1<3D!r#ZkD9MWr|fpmvD9!p<+Pf||q(9fuugPAq+Mv<#f8XG~;a zCEk~upcZ@kczn8+VU>l2*UPFqRr2J+8Y+@!@x`*pdIWu=Q>TOnoZqLs%QPLagg#JP zE2!9|)u7__V(pntWTG5iJx^iU{W@7MMOK*7KB=^%^A29e_e0;vz&$tdIorLS8tTE> zuQx@%OLcwOVM#9O@Axv2s}*!Z!!t4`A^Q0Y<1=4k>xZbGpsJZ|%{n5&z6JhI3@+$r%4f~DnXJVnh6tfAp? z;|XkFtlW5D4Gx?a7+?dV=*B}d4XMdcDQoLcN9=s>jp?=Vy)`_n5j8&^?K6hbI*756 z7P&O-fZ3;Xxp-8F(0M>oA);PyH0lTMsl%lIgiaZ-c?Gh{5+~KmQBr;prNa}X2&p@I zt|$QFOjGB9=pTNKDSUvD9o&jg z*T`-9Jxq_zuZTRMs$~=!t0h+YocM`YxHO)`#}XsAk|sJhql&_p-E|6xieY49l>S#G z0dv_0@%3bDX{iK_vnjW+LX9DjX9{4SbL0NKBkDW}940GkswBwH5NorEj`Q9j8swAV z+6*l&Q5l+R^O_ow1Jb}l9Wdn8V&UTni# z)hFiZWxd19gAm6-(^=+zl!I6$?UC3)?-T5?AgcV5bcG>*YAh4+wj!FD)1R~-V6n?P zOG+OG#Z670d!S9<`>KkbX!_yW>grZiVdp$1LRFOvwu_WWN0X2C)~UsAO=v1%vLfy{ z1IVLEZqKNdVGV1$mFl!f-olz9m1v#Zn2|HaT|BNEny{!7qTd{o8uG*)lY36!dZC`| zq&#(UrQUF{%R5}0|GcJtFsWu#K^-6Gv>Tck7&TbPu?TkvmZx=Jd`Na5gk-zUmw4)u z9I&XL5}As)PZW6Tq&pl##P*A++=hCoDVt?;hw2Qeg#m%Mg>4&1-o5Q1?`CM{msI@_ zDv;WrLA5tD+MaO=od{3Icgzk9PY&aVr1)$2TT^c`k)#3h_i#`Xj zz!Y%nLMK&JAY}THY-v@u#^a%V-#X|2X5&g&r)$i$h|sK1lB{o%MNm55Kq?v*6dv#6 zb2f)+{!5!TW@czJp>r%ZPr8iZEdDW#!MUE34ihi^K|SrhwU~$GQF3(xHBPJKvr}rW z)WPR-t13PtlwO_$afZv0i)eiN;7ih}Fim0OX)^bk+B2S-s@^b4-n&$nZd z8Hm#VODz@}4m72B?N$gc!lH)g)Yr2989IJN>x)auo3+uAwXVEb?ANFcYEJcL7uObB zUQAV`=qLf#`l0VLg|}r_D`1OhQ>5FNH+)sa7V_FHBwW|~H*Y&rD`exV-B63Opb(pp z3C5(la$){fXhDgdw>?@=Xiu@0X+ddksEt}sh<0nGhBUr6iE1Dfrc*2O=ai#xI*%vLQ;10Oot+7V?94)l+{ z==9KZPX~2G2cr>#T{+z$=)^2|cbaQ=4OZTaA6a~bWNdMLp9tKedIaM8%xMfOOxZrX zc5pB{$hxR0``6CWw{g}UE>)=8wH|j+BH}_$%xVo-lG#g%hz1~P1j!@qXnH!aCrZaa zcMj6~z%_QaXVG@?7U$|@oqDx&);Zr$U!l}|QT;ys@2hWw=X!H}A*f?6&f&3ogQc^A zVe6&mK9wfx2aG1>GSSI+YI1Ix%)`sRNjYZY9hIt=nb$2GZ*Wr{%Gfe%*W*wj#1k=9kcD6H6d&&Iy-FIgRbpvF1gZl&?{>POtX(n ze8*g3F3l4Wws)+~w(q6}U;bD1WWJZmt^TrBlSr9wdqgYmt)7c{rR>gG!gTe94Sz>p z{J6T2C>A-iZa8SyxU#{~wJ~txs8!mmd8YJIa*YSN@G*AdVY{-U(P4Ju!P`w;jY^C) zoW=uuN)EOgPrfv&O|BpITdmq2Q)2v`xzU%uBVSw#(ZJZ-6u)sC$bH$t7=AaN0OQi+ z{3Gy&BWQRK-f)QXjKizp_(x)%>E^oIMuz^sv5{rQvaVo%qZz zoZZQzm6bg|2V=9OG%?UadhlaYZPb$$n^FNRdj@$KPj6GJuHx0-?)W6`7o;!iv_eFC z$|e$Yo@QxD9@!+DIQ8S&n;>g!RHKhy{0U9XXVCyI`pl8~$|FiZ&;u>)`_)oEUn!*} zjujmq+>l*5bzDZNtBa;-V`+@`^qIFT(QZYqIUa={T4xMd2;>i@&LwAFD^8A2(K^Bu zuRT#*wF2gF`*_zB?U$m3Dd#6j+Fc7{A{4r;HgGcRb7BMZv*V#CO5U9)t;3VNvqqYa zzNbubRQvMONsbyZuYYRg&Qm5i9kex9?^xf-hwpsb);pu;s^dV~gay3~YQQFY)N}(^ zZO>@~6~9(A(pTGcW$U->s-o@d)ZqSW7TFZF}-t@eidwWMhH ze98uvx*P8Q0U6PZ9r@=(N6vYwv{DPL@%5^$U1#;o?jP7y);x*8CwHb}d*hP{QlFpP zN#??)sdmejTkiL%va54W^w0VmLb+|A9cI$fQRB)xcs&hWo#ug@IO}E0FYk;RYE=&LuAsG-eq&FFI;PM~0%KPnD`P-$^jn)5_Y&!Q2sDUEP$PjyF^f49wV- z)G+;el2eEo6DNzS!$N!5r_hshsb%DO`g}vhwnqz3kpVVux^_(smr^#=i>pW0 zWIQ$*+Y_g~L)EcKhHGF~hKw=B25E?*UU>THoao@WoI~n0t9Kx?{)o1r1DQ{96T&m# z>hn9sW{c0Dc}`3=I)IC)%IqJ&`8QB-Pw3vH%B`ViBR-d`V;hS)$xq$2eKwA!#yYdk)1v~36J;q4`LECbQHi%WMI=VueLSZ%u2MwHNfHZzYK zUmIWa^EgVB%fjA(QhR4hGoos2r7K3 zs8=%<5<#u<=K*Am@?S{s^OUkXgM7VAjhJ}4>*!NuxFj8^Ya7jCN|f?-fm=d5sk>y| zBK5k-My&`=*t<`$VU% zyt3fXz^T>w8lx^_W7LG;>orA<2Vbip;uE$Nw8Cj%_Jc_w%DjaOTPKiHGL^iEQ1vI}Pn4nkygGKz;Dx_u0Hty@n! z1v0S>@l=epKKHv}zZz40=v%BMTl%1`vZW~X<**Kl;JW|UU z&0kmt$flg{3Hk z`O~8xqq)I$sbB}wYbVHn=3HjUdG1K-`D8}3S;10kD5WVCn2Z{cs)@`}GgbvDC3bEi zzT|SU6DgUxF}_z-xmfzCmrkA3ran9cdJx0aL8F-(R`%UTQ>0#+nktpiP08kJ6FIt* zOd2Mp=BRzuO{CS0*QIH#hI(IgsB4qSb+l=4x;by5rP4aEH=fQcxdw7FJ9M?4B|E+; z>VB%3pgXYXeM>C^DrJtVhj!D&Cufq>v!UzikPc!aX^@oIN9HCDVgk@b49CW&*2QPX zQ~S76TI$0^lt%A^6ZB4HH8>nng|3Y5G%?*0xFvlM=gBC2^=n3sa9M|?`l~c^|3AB9 zG|{Z^F*53qZo?SG+6rriS7Z(V@inlpcCp)t~9{ zHqOmXW@zLW*$sEAyXwAmcA9ULL3I!L9+=%R9Z&C+x=#jf&zYGTNTm{~&EefCD?G4m zc#t#zsbAFe-|C}#1~;%J+^S0rznjD1_1lIygNI`~s3S=2i$>-qrsI=z;6bvyrU$L_ zua*auj4jF7?6%?ciP`P(9UO}UI%M@y5~(+%$pTpf-r*?WTA_uz=ni*Exzh18V4j3p z;nBpo>BOvLAMf(6VT#vaPir%EE{;WNRZqB%*334mV;z_J##Ca4lZVF*(;Op}j!6oJ zD4W@x(?okJRATHEBHzp2sKHamw?%3eWcII(SweZ7nqcE#dUb)PR)$;Fx{>kSF?qLj zv2|A;K{C~T;hX#f#s@gBW?DO`a=?aIwU%wJ?Z1Qkdn;uf@7yAhT2DvNwNk?Mn!TlY zC*9KO88yB1KeZ3s#&bo~Sxn8nv$X5hN4uO|g+JfBU293G8MPBi4F@CYdkc4X4sCAZ zi zJ{a$!@mRa@(HnX2svb0Yg@kEz2 zF6WG=BUE1Ty>{E;8UHl;Kp4A($%Zoz8trh`k5g03D=!&ZQfpEq>cF5xGD0T%4o2c7 z+=G$$-mRk>t?o>sH*(${ZcUhbGYOi^O3y(?Of#v;kc_2)W-=K| zEj1@O=AKMqj>D39kRARIADC-W_-coxgx@tB%gm)_M>13LAWMxQGO6ZRR?j+RwQ)32 z4Y_7#(9i-XWw?agxs?vjba!&dT&4GMp3#UClOl0k>QhLVlY_IF(Zo5iy&K{?=tWUK zcEpL-)9`jQL9Vji*0(LXb$DoCc9Lu}(2udy?D%wKGEOOuPpF&3!-iN*50)bY+^KGq z-{nT<@7>#E6}Y<2xwOm;Y+AoQ8rwS=OOj16Uhoe4e(CW2(&hW5+xJV4@0VWRFMYmW ztdRdF%m0%|69ks&#ytBfF zI6C~NLdLWypgrL*92A(r2h+mZ8Y4K7YA|L;idTTmI(= zTmE>%mf>DQ-iHnO7w$BKXL!@YhBr3cZHU+Kf`)ti^*L;Kt-`&Ad@;Oh;a-2ag$-|8 z*pT;O!}}KQGo-K2kS~3P=k4>?$&Qe}+&T>JZ-?Ri?J&Hn9hN^|It=e%M~A^*hd<37 zUH<3oFtoKD-Tr*;FtoNEhUT`zQ05&y{ygpIF{IDXFn9F&-^&g|9qKUDmyTXT85!zJ zN1y*a?=X~ar=flB4Edj}(@?&hA%9vr4ef5Hq228a`|DMwvD5eGX=m6FZ->9_?Cdba z(e1BSorZkwG`w3~hUe`v^if@%{xo-W`qSKHXtTSF!w`Rc=`yroU4~&tSGVb2f8FRZ z^Z{Kx27iY7+-0b1U4}NN%g|SJ8R}$LpZ{I$HspP`VWiq^s0ZDKdeGhBf3|KzKizHU zle-Q5Z?~ae?KX@byAAcP+t3bm8%A&4hBmv$&_4U$1pj;B&tXGjZRoQNS#Fvf_!|&I zyKnhl2}4g{Xeh$|Hs3JpGSmb^Mex5K{=ofJ#s7T%X2stKG?wXxu>IxN?N6ou7eh$C zIblPow0HvUT!OdAcGcb?GB8O7Flm-AyG+%RvV3E(I;-wmjUGB?;VPw4Vc(>RgK7pH(WCC=1HT-C`Kht=o2+n7wZab|bijz>@qSnnCK`V8lA#Rq*E z9SU26^yzUrPM?t1CsMKKwis=q)aA1cC0Zl<#I;vd!Qt3;3Di;HJ7-OGvxk4x-bWFI zw`L4V*xsLYf*e+)Bp0-Up$@=lo+5MvP%S5S*tN?Csdd##{AT%*svQhT)lN0?TW6Lr z9z)$jaEp0zcMa9)a>ZfxQah9E9QHR4+R4`r*b)2h(M~n*al8=jq;Atop)jw=U-bF= zx_WmT-g3gN|LAD*f?D5{phD{V9`v*EgDLBiYTvv{u>I_dwOizVCFSBa$|roUqt&MzspIvy@E({Ut7AuWhBh+q9od)8#Aa0Xh(l;cl=iBO zCU(W750_uVJEBS2aO3lB(eK-aW&fuNgg(S<8;&BuYO8=1PCJkjzG+({zJ}<=4A~Od gK%XRbMtAUy7ljwN5on-;G!3dd8{G~hcLZ4eA2!x@iU0rr diff --git a/bin/osx64/OpenVR.framework/Versions/A/Resources/Info.plist b/bin/osx64/OpenVR.framework/Versions/A/Resources/Info.plist deleted file mode 100644 index 50ff90a2..00000000 --- a/bin/osx64/OpenVR.framework/Versions/A/Resources/Info.plist +++ /dev/null @@ -1,18 +0,0 @@ - - - - - CFBundleIdentifier - com.valvesoftware.OpenVR.framework - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - OpenVR - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1.0 - - diff --git a/bin/osx64/OpenVR.framework/Versions/Current b/bin/osx64/OpenVR.framework/Versions/Current deleted file mode 120000 index 8c7e5a66..00000000 --- a/bin/osx64/OpenVR.framework/Versions/Current +++ /dev/null @@ -1 +0,0 @@ -A \ No newline at end of file diff --git a/samples/bin/osx32/libopenvr_api.dylib b/samples/bin/osx32/libopenvr_api.dylib deleted file mode 100644 index 3cc3fd4e7e1494c9684f2a5652c49cd50142e4d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155708 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%0D3dUl)FZC(1u6{OBI4 z^fP#({H{_R{|^ek!4u`L75*oM-{6Vz$A$kl!f&wQk81BF>LY{S0liDiC>@7={C2$9 zfg2roivxedfuC^TKRWPR4t&_uRQKmNFvBxm`CkTld-;z7v;3Eww=|`{WR)?rIMW7m zmRE!S4>(i#uT|8^_Rx;U^Up=oQvGuiF#S{RsE=yJKcg_Ge+-_17xgmvrxEoO1-;Jt z$c|Yb^;alkD-M3zXE5nmAH8<4HYX;(!S{fk^>h9@nrQpS3*Ymgx5sxL>}B|l-QZ7& zZ=O@6h{0U>NAMHCnZnnrolk_%jv2nv25sNTc)yVL8N3lVqkWn@X`c<#KAxYX7!msn zrZ*U0?DtYoVtm=L^3Q5zY?U1<{t;~W2efg5-;T*|U8o6e7k+~c|ByCL@EiOu(5wD{ zw6~KF)0k&LDfl~H`h6Jm_VhasnCZ8~QC^0`fA_R+y9sYoAB3C0YQoJXUBBUoQqm~ zgm%y1Ex>mB$v*>M2p@&9&yH!IIY0H9*k`cek1OsZza5j`oX@I6-NW!3JW+mgZtE7| zH`ws^I^4Ho6(4e*YFPNqIV;0o=-{_w@|*Kmg-2=s8*KPX9sG8z;_p&TutE6EIj-k` zGo?p&J%pVbS$!CwW=6d!R~3_*$Ev18iT+elN4cRnQft5HEk&-|UQVS?X| zRd|H{4B_t+O!vq?ijTs$Z^z1guQvaTabNIZ(^JE9jRU{oz^xxnrT?V^8~=Qb3J6M! z4}&X@)$IfC2%xw`Fz*VW2ngn#0TkB(yOc`*Jng_oek9fWatHo~1Lqx=N`J8ff5n06 zi}C8~VbHhO{CDg}GxtAAn>Eo^n6rK{_=mum@{@&eGX>pe{Mj+nv$U0_c&+$&u}?5b znIBw^@@dE9=lu&54Z?5m^}u%j{K|oi{iBZlpB>YF-s?b7euDO&!G^z-3J6LJpB%tol{Wv#iJISF z($oEXDj+B^Ja$a}+N+hZjIB_0y{3^x3Y+Bgxvc1(WW8$vM?jjD2=Y`*`08#iE%yJO&&7K8JtonEbpag~BWR z1{?lDNBv^QDmzx2Nylb`qAP>c${!G?c`3J6N%w`212 zjueVnvvm9!OnMdmNy<3E-)qC<=RG?VmkYnahQF2y2ugI{j>*sac__Xl{09FBc#Aet zza*u9`l*1RMEmSm`RD7(*!t*f9Uk8MLt*$WM||3`;{S%G_Zoh|-N2dr6Su_&{bR?p zkM|5w{9EiZ*!ZV(vNk6sza5i5biXz~eU1)~!G^z(3J6N%w`212ej|#A@Ec5e#%CWs z3d7&0kjCWay+{;46MlmYf4`%Cv19U&KB)PRJyrYPV8dTZ1q3Df-;T*&_+w>kwF$q$ zq^JMw;U&KvlfUsNntz+{8*KRP?qzbn@28r7%4ypF1{;36dzswleNq$`3BSRHzt0hW zc1-_=9?|^w3BSRH|GoU*|ET7le7g3(!G{06{6F-V=5G{!gAMAt~51v37T{@60Xyz7i&wP4-CYX1iQG7};??R*as$kxUMsdGj z-i=1FLon}1qxijG-jzo255c@MjUsEV_Al>Fqc}>ix^<cs;@Y^x@X2~Y47jWfZvX3U;c~QKG%F5 z9|prnrRRV)PK3vf$v-Ik^M&7F!=LZqw`1}T34f*V8*KRP?$Q5tO#Z%?v;&t5zrlt- zu8kA^w`20V{-_D!!f&wQA9e8CG5PcVqzP^peuE8v$iZ*N5e(adx;r*W!Tg5(u z4S%7deA+Sjd2cAi7lhwn!*9?3bl;B2&-+Fx?h}544ga9S|8`7%-cw5P8{s$D@Y~(X z2YL`YOSJpEKbXSs4=I%7 zw`1}TzNHC%xkU3DZ20>e^^qNuKlF~~fBH<#Z?NHaQ2{}T{>S}2Z1{(?af07q-?@4`#Jis< zHVEb&&=lQ*x41OELon}zrudFv-VIIhs9@d^O|eTb?~11Qn_%7DAb(!D$@KF$xzmEWdnEbpCoZ_#-Z}605nf=qR$rJY3G3_(=kamJ!WsO|T zz+d_&gpY!l{;^~7oBK&07Jh>bf1Jz^hCi-QGCbz~(__lD`vy;x-`tDZB>V;&{$87V z^uHae@J}YCWj!GLmf!@xHct4z*M`Z@d)XKQms07U4=qo{O%8mo10PwLN>5u`wAISO%VEx`9dkb8df>x=3sFx~JR;`tQU$GH z!Dj#Dlq$_{_Aj0(*z7-CYjBI}6g3bEw9>HdP_M}ys->kQuC)li?b{c%Mw(qNg&HCm}!DhYk zuY%3`;|%0OmIt$*SPsniFzbWg5p34`h6S7TyAv+d^kzNoa$wqL*4I8}%)hSvH(>BL zH2$k#vtIS#HMB3DSdVHHY}S*0EZD3MO}R+ZoAsVmg3bEPU4qSe%xi+p`bx#cn%}IK z+$PwpfBZ|ZS* z`P|P54n3>Q?-Ok1TX!0MG2dh8cWL?$U#{&p^O;Kom;O$h*9bQAi%o*fd|@ZBO3&YG z`n$y3%;&u=*v!uzhH}jCnEAF-1e^J?C4$ZTSB+pZpVeacU()W~AlS?|eN}M&pS1ad zg3Wx;uLPUVfaALgJqWR7E?;xMXW;~aJdR3LrceMT61)K3#_gZak#!t7j3Er#eZ}$^p{=~u$ z#190U{_8IUoBrr43da-u%QLSK_oaXNDZ!?{_j_Y5_uS82r|C_9>}tWLfAyST(_gA> z*Yu{pa~tqs=+E%2BZ_+koAYT82{z}`elFOYPy3@_b3W~L!RCD0ln!mbIiL1n!RCD0 z>4MGqv~vZU^J#U0&G|H+V7{S5u|creKi@6b?3cVlu-Py99l>V5khmUVDQJf%{Z!%F72{!AM<$}$6<%NRHdgT>@&3fe~!DhX(SFl;H z{F-31UipAvvtIe6V6$HNoM5wF`HEn(UYQ-#;W6u#M+-LVm9qu&4Je8;1)KHC8o_40 z(ks}kS4IV!^~xIsoAt`u1)KHCe!*t`;1R)Q{@~Yw&HTY`!Djy89l>V)ATOlDXXX!1 z7HsAZ76~@<2j>em^9LTmX8s^z_@)2sm1>YmMU+|#dZGvAHJRtbUPHq1V!E*%<3dVg$%Kcq}FBUu` zI3{>l@TY+JWRp36`31q|JnQ{}&H32J1c%O1#ozj^U~~R+w_sPPHs2#SaXxdscF#Ij zn}1kvtNe2JJf#+VW z+)J3RcHpQ3|I~pG{#YviMGkzY1M|un1TNv;*_%>vmjnOWfls_9mA>79f9Sy3*QV0f zIq>Hlc*ucW@l^g*4t$dXKjgr#JMjGLQtb;l@Ldl4I|t6YK9#@9fqNbJDF>dmIhB98 z1K;4lk2&x=4m@v5s(q^+_-Y5f&4GX9z`u0h-41-x)>QY-ao~#`_$CMbiUU93z)v{v z|2gp78&ci(Iq-T1{)z)X@4z4Vc&dGC9Qd;e$0u1LzU07nIq*FW{5^%ODTe=78c#O( zd5shH?{SzS};aiN4cb_c5cP75G@STnC9DL{E zE5%oaZz(=Ez6yNH@m1nGA74Gb27IgVt;TmDzKii)g6~p%m*Kk{p9fzfJ}jdwjdBxvOx!ab#{&%-`P96pU&`q}|);n_EyYx1hP%+uY`x8|?_qwRr7hXV~Kn z`3ryxB2irI+8I8Bm#3c*jBGeV+2IQp%qv_tzofwLAJ1-K#>JBUfCtRl-MNu)v#5-R zXjq`Y+&X>J<6N6Rw86@zD{x7Bod;Je zCNEALC-~!dQQJ4SGaPAIr~I7sl5wj!6jH9yDRY@(u{9UZjl(BizOx>gyQVqV;w!)f z;B)bI0`A+4M&_3LI(_Z1Ej+gY7h2+-d0djM>B{wk0J)gVjYYz9@gM_J${%QM zkG1&bHlKFd+|Hu89{r4oy8qqc+dRdc;o|uSeRa^=f@>L5Z$-q=>jU$dz5+ijZj?sa zotKhcX_s44zbcaX+DUC@yLwVNv{J6ll#3~aI>ji%Rh2@Pe%YqS zv%Grc(z0q?1B_QSsyxXYWG`Ha^5ID$2b&H>|=e;|00U&wN8J3>;VFLT9D@E>=(Cf?k;Dn{!EG zyPy@&c9X8D@D?n?-N1oZ$W*|I3L}CV&k*VC;*7#Xekxj|vXedd3A5r7G0PkkNxB7! zE>pB5X%;G)j8T*zD$)+7Mpx2Qd(|FwNizo1L}OAHB@1OmMQKt~`@|N#Nh2MQWK_E? z^a(n>VYW&3iYvWWP&}__UeWt4I;IQI?r-W0>(^Kcyt9*Dh?wR#IEU$5T#O3c9q9Cj zgMkjTudBUbKkG`qII(|4B(3Go;5G|PTL+&`3Wg(|@ndCP;ey5U|1+_Y^n&UB=r~!V z;zV7loYpL{n^08jwzX>R0~Jwe-cj|6=i;IgcF4+c5w*?LO#Wa+K2c)#JUkg?g>X?e zGv<3GLdpE1g#{h&v%{J>YbL#rk_aU%ah~&n{s3S8)32iK*Fzod`bC}tmY35!Ym#Vz z@@|EHLp@&gYV$?juczVT52_>V$NK|b+!D{~plG2AM^(f;|FrS_21MDa6SEH2?l1KR zyy1;}dGq~RTFH#<+)eXK4(F0*|dN(b-PgY!LMcTY!Ukj?)==k;5!ug9!-uGB9 zbJ0n9K^5VY@>4XwUU{(E-=sz~2e3lV?5vc8;-aLxsJ1F%fo2ZnYCGuxmBW(etMHPD zw*~L^VZ@_rq0snoSu($P@qeZ%Ncunq!m1@GDuO=VRPaQ+t-ji3^$ybkY89OhO7uxp zw`eUMB=ZOGgl4AKM>4$WhiA?_MUGc}8axe!9=E%`#G_18YtQ10`2cGh z1RS#>AE1N5$Oq?`4jfxnWOdVQna5;cxX(`@sz-7@xTYW&XQ1QX% zln=E3#7>i5`}=Z(N-JA9_uHNWfV6LA@MGf(rxkc*`p6EUqz(QAArbF z-VX&MZiH!mD-=~lcssJA39kr6eV(Wr!8!o0l;GWPUsxWAJ`nbW_?jKxH*%|P%lpl0 zi}8Ap_8#VtKd6qPw|#9e?2oo}AcpzAabPW;m}+nLB;Kz&5HUXwSq0D5u{ld^u$t?O zJ$Pu(tw-8=M6gglJ&Ffq(x|CbgxTS+CmQzpqj<;5%`8(QZ)yd@)S%XUPZb(KD2tJg z5)Ti0B6uL&!|r|+-uI(<=gNi;u$j~W`{2?RldPC_$7^ePw(kSWQyspJV0hyP7tVlh z{Riimdi`5xzqCO`ar&TQUiwt?yv3@qOT3=+ewtxba2gU;?QiR(tyyhqu=nqyh688S zvIAmOA>Kkx>rAuy(REMq1@8AB_Cz$kztl*)sI~vrbcR{kg?($^W9f3?f<+68|3gzj zNk5$kRt?qEgx5+eymG=l(CS~y2>~wGjlFEUFYA_>{bWXK zV|l800mi8 zs*C5#G7abu;|Vk8&yO~h@y zW;Qgzgqiz0hO9-oJ8&zF~dRXl)!8ELg zjw($Z_^@7xJMn%8Mc44$ItQ+h>DJrCq-iG8x z+$H>yMyXZu_{>KS956Ifv^6s_8JJVC2ilQB?TRIE2>`LFW1S5~vtsxR^+%_R?y6B_tSNo zRGe2AEg-$3Z3wPvs94PDt^Mi&X2{~)bC+7fsKxyBTwc6L=SlItJJRe8`RdsRVq1_B z2`OPXKPBTV#^ir>P;Y^&5BNhNtk8q}gX^_r$K(SDZW13IiK${j%PP_F zLtaoI2+D{EfJKlJdB6Uio&}tZ8vx0Qja15#W-vYbOn1-e?q?{xmO&V=cVfef-PYCB zC!>d>R7r_792Bai;TJ4srPE#sYF>+xn*+tMzLXyAN43)xo985_wGT6)b-2W0DKjV9 zeRP;By}0|A(ACD_>T1t7Su(AwKmr-K1t z!C2vaD15$)mH-t!aS@5hWyeLNcIUeDHh2RjA@LTd0+M$P9bEP*K)6hDKF0f>sgih0 zPKftG>cbcxGZ=0|3^Y(5#fzw!E?+n~bFnYbef=J2%rw83Jx_4Wq(<;sd9+p->vzNw zWKaMQc%hJPc=K*<|KXCwZ5y+tvF!W<2)uO3GCA)nX#w7omqU{|C&wnCXwcT|1sb_? zq%k-Ezc9w_!ED2=GonxF>;Y;H0N$8Jk9Cc>RD~%osyYJoI#b$qv`dk?MMZ4zTkrTt zmjtk2k%BI7#9dnz1x1=?rv;NCWMH#2@J6q}@*&s}E^7EFzu>!s6T1m=A;ofiftuH4 z478no9p_x2wzF>HTnOcMo-Wq%>f`Nu;s!SB7>|EOzAWia@LHuB9P0L+v9;WGY#Pl4FhG++3^~xC+bwo?S7lPNt zDg0$V$G?*`^l^fjQ_dLWi*cO9+8171z2Z2?sV-?;cz_lz^&2+vIj5VBcwsyfEy{>(W?dYJG>=+3QfoeA3VHhJnoNdsMmv% zJ%t_R+TWxx^dUf1P$!o`yc&@>$VF|&!Q)dJ(7h&}x^k$03pOyM!)Ilfj$SJ{x%cr6 zVK->|{`e^)0i}3J;8XRddo0*swD@rO%k_$_FxgRcjxjcEJixF4pmaRNU{&Cu0w9u~tU=2Z8Quf}SX6FK#`~jMn z{mBU0pO3QwF6{WnYCXFs`ME@U^3u)vk>s!5~t%}1ywtl%e(S}?XmnW2#fr`B>}*}Sk-$8oY9rZI!mNyDSQ;q z_~s@h*dVh8@wKZ4nPt@=NV&?$EUgSvvb+Madg3L#cYV|Ay`i3mH9>y~_d1MG{F(`2 zZu^!x8d1Ndq%j+y2w7&H7CC9Abhh!VB7 zPZv+x*Mc*g20(0wksr)~*A~q9=m@_B#Pe5@MHIfd4Tbx1v-SyA9fU+C7jK*HXF4!+ z#3Kl^BpPif&j769W=RB+0_U&3_Yrfv3}$`+wlLeQQP&~DM0X%40<*kl`6cx}rw*Mz z{-aev%@;yIe-rXQ}U$wm933OgJ2U3Zq7@BJB zJI;ZWYoE@6cxCUqLOomY-n^@+Jtyrcl{Hhg&y9H_ndPbGjlZm|A+4rE_6moLUXGQi z(yGhVq+f=rTSyH1f4ek{x-At zX#o7BP2sQF{K!)`RjmMib925eyq;>~mA$B@xrF1Rik3?fOu+auK$^n%PY}A39 zZeXMAp{rJ;dIK9JG3P2kiquFdM9F8%f(>F&ipo1Ey^QY#V1?CBBh~|8`i&!{fgB z)!8mIt%4RQ+syr(VR1CmMyWeK^6Xh?to@g39;M5HrS~qd_BZGHCpIN8yXsg~hk>BN zqWf1jLeTHhQg9~@J2erk6-b!~)^emY1S^ps?6rbmt;zMQG}h1zdijvZEX^hZ_a7YS za_xwtjLfpi6wUqhz{UjL{gI*nFlA>0d3jhVlrUYc5Z^-}Dz>%TAbr0)FTa+>%-H%M2wz+Nb<*uu<(ZC0wZ*ik6X76WTl_N1gC|lEdqx zNPsaNf-%6I<2S?!hSwYTLW$uu1>GFwqVXfRj)n1l#FNb)*+E^|Az4vM;D>PG8eE*4 zIBIc(SiE-`1#`}?{4c-% zdF$VfKTRh7ZvYkjj%Xv~ZP7?3|KFd36wVb9o6X4MI{?%2clt_3^p8=#NkC#RUA9|r zMuDKu*^1fF!|6bhWa)@Glb}52Xv&9A@+Y{&iYOAJ@KPhBQ!=)n26-I%;2nT_znDOu zn?4OTaL`7(Lpbql$1}DDq!e7(W%c1&5=C^+in>e3GoxYkm{+)AqM4SJqJ&qP7~!c2 z5mzs<`luz`F^xDZ%JowC){BK#kGs5RN2YuM5 zi+{DFPQhmlcS0ss(plw;2jYtg8LHp&YLc$VE~#mi4Ql99KHvL(UT>zhCu~igqAQZerezI9d+b$TKXM?iwNq>W=sHZ-{@uN4-AYv@=UdSAh zg~NjR;_VZw%J{nA$T}VPwT=)JESOCZ8;q>-$@5Z-s2+&1z!*ra8AZV^XPVR|7I`Az zhZ?3&a_k(ewsU;d4}cJ6R8kz;vu3`?yVK9iMEgS!Ir&D@K_! z_lYQl1{a;6-S+j{y$3!$+-`$u{NfSMp2rk-FVC5OIdGludrBu2MQk_r4u!uC@gB81&AArQJO9IPlQ&YKhszG;otsoOVL__6wV1rc)6uf zE1W>m7t{YmtBigLw}CJG>P5af0XzqrHin?jzndcTR0<#P>yTWOun*vOT2Gjh?>dW) z*esUI?Y>CD*V z7(|wn

8lSXJ?3J?U+NnLI~Fx!U@5%gcFLL&DT%D(2dgWh*jn7`{4^}?VE}OXpk~l?c;CL zk$3ED8VM<(^Y@fa2TpdTj*FHuCD@t$=mjA=%g~A0;OS&%mVKG3BaGAK!Ugp~As3P& z7*|#b7aYaT8dyFm6G~+d=hw>JCCXYt^Kq04Pd6}C(EBmksGOTb?-ssAI3eUj;e^DtiGvD?5kTQc~<59>-g($~5o=%@YrVMdl8nUwDB_S)@ zgHFtzehOKcWtXmsEOX6JzzpPEfN1lfYL=#z8~HGUqgYu1Y4B}Bf2we~*w#(erM7hm zV4zn9-5hE%K^>^xz>5}J=8Z{4z%I}#BE-_>%12-=b?ySsIhWszX2X4++qCQ=BWc++ zcrTg&mzEf@lmKU7Mh=2O_yG@t;P4;|2FY#v{ch-p_gjE;SU+4wt2=xv@Z%*bkq78Du z6rYjJgC@j?C+cUZmt1muF*+Od?T$W=AJCm!ix)+K2F1T!qnl0Ma5A-)XpLllJPTRZ zq)he7ZoG1H9!?ywf4M;y#BRNuc&W|tMBR$!}5dmsfH{3uO?RVJo`oT zZ-Ca-C;bN6i|6`zcQoM@;>vz;RWf|+R>@ms#$>+rEFd(tjZCc^WUBB)xEVjk74qdI z6_h{Q3%`r=1D4ox3r&CaFxjBiSLfrocZgYfk1$m*?mbF;GhylOf(4CEEOhkdV@eV{ zH@WP>M=juRd;m{KsymQ)$?oFKyTQ?&m6Db*t&+Q=yO9jmrgl`+F!5?!Sa1rzuQ7T4 zg%9I&7rEkLm@E-__%Ybk-1L5QP%5>|uduJIrg4cG{Z;yrFLCvefhJW!U*9&X@8L%v z-4IQelPO38&gnr`mx;2H&{X9tjIqKIU)R?({^a;%TZC~il0PhYPVT)qmTH&N-+~I4 znJ~3NL2^T4T3<3Uh1MiIzcM6!%eqS$Oo)1-(3vFnaax$?z&sB>sUz45KGiJ*N|jsj z*uj6{%TdLWd!dKao#PNi36;3cw#Ko`ElzjRt6uKhlt5MQhQ{RF3-5Cp)WfE`d`r^1 z1-T!7{KDNhUIOOY;eu$-pHhGUT2uCOe9yt5+H?4P*W+z4Y~A9_TRXPpA8`}w;zuNc z!Pn9g?_tn+czNxVBkpt~b3_|h6ZC<#eUx?CBKC>s)V6BfDR<)Fth-FHuVzcu)}KJb z5B#kSdeAaff({?_OW{!*3ZtzIf1JRpI4&%AJqOMIh&rzaOAt-P^z?Dr-XFnKD!)-) zhsI>LG(hVTZD<($H%?ODE7>?5h->V+*)u_-rkVA6tD`tt%Q~vPkKx_812JFimkRd* z%$bF(;h$#YA5J9sZNq5?tF-{@g1B;HMcSH_b{FDccM{7~&5m3s9 zI0h1hTO7CbF+E7z07Z+GYCDYuz`eJ5Q}KkFZpm6QhxsIR404W}ZK4qpk?G`qqAC!y zj{x3IQ@suPIQ#I%*pCs)h%2dTNY7LrSW_0DN7|H4MD45l$$_=ZjMP7)edszipk+eR z>Wo9v&MqjvV&}l=OFMG&Ll2#2jZW#Wx(!7clNRclY?YoE-H0Y<<=bH$2gZOo-L^KV zl2+Q?2t|18F=9+1=+L%oyOgoc;CBj-##Uqt)mnEz$2n=+MmxP$=&{O95Aoiq*(!x- z`PGlxWUU7W``A0QVf4#p4?`ci)L7B6z_%Wy_YlWoJ_W9WrgxS(Ce--2P>pa!woj?1X+TMm;s zO~DH}--|66Mwv`Vu{|7uJt$O~2hg=XgLCg-q?!^j0upe)_Nvm*Li6UsAx!TDd)QtK zM(OTnG3F?^JC}Ltx>J`Qk6%B{P_}cgp1m(=L9;Q^_p^8&Py)^h6h*>0`o6B^Fow0- ziCV6MImwKB=$iF%+?gaNUDwgyG!6^H5ttUJkB=s8M-f>hLD0vO?8yU|xO_FJlxL4& z2U6-^2-Ayo?jPfgtR6b7b~Yug&f?h*RWUg+yeEkyVKx?{B|2?QY*+@OJZG0zBPLEI z@mBbd$C!jbvz87u7z)#ShZI{F1QZG7!# zXzk&ByHkkrUfsdPlD4fiC3`cClMff)b`5lBO}D~kBN(%6JLjlVwYOZ`5Vs?g$fRn| z?EuX^uotkU$L6-ih;JiC^uC&oK1`Y0ur{8B_ zbR;sJt((G+Zq^s0%mw@b2s3(L0Agy?w%4P)w*Bi?KK}TOdob8H+}(BmxZ-VhukPn) zdL6@e%r*a}|8>XL$e|HK)|NMA+WugXYug`uLG|w#;|mMkkaz#jWlwWs)cC@d@rk{h zu!LJXT81I#`SGNeDV4xIS-y8A+MyeAxA z+~6#h{AnDlkpn+CK=T{dCefSK4}{KkSI(_0h{$N$-GFNy#5T;|p%9NPUXpnnPBl{m zLw`-`jRVN+4j`@EWH!NUu;f+2`Bn&QcYXh`XyV*_9TVQ5hVyIqh)cnTwJ1v(L!pN$ z#{kVtsOC&=KPvPuMBK#;N*D1F>0&jKFpQp|7vi?my^xh7dxp}8@-7fg=(b7np5b3e zJ6d=AJFFKXyfos=6>l34bPmOxN0QDXZjXq4vIM{Q#wpF&s=x9zLyAiv$YIOavL()a@cBV%yVYO> za3k)yD{*c*>fIG-Zc?Ojyx(#KY`)btIpe|w!v!<2Gk3YtgW0|MZzh4Fefn^|M=Oy;sj>=gz5f zSKQf`boRxa{Yj@b;q);S&h|Cu=d;~>2AJc_I;-9rInOk_aRSC2obuK(|Q zvm_vzsA%1NQV>+cVNn6MVF`i)j%?BjCLtL}B+HnYuvn<0!8R=FXkCldsbZy;+NmN% zK^>JUwbV}QMlH2tOKq^Uom#6@Y59M@=iT>avVfHG`+xomH@WwobI-Zwp1Uvay*tvd z?FDH;@pSJ0N%vcBIdfm#b^l+16|J0p={_bs#+h;PNw|H0sQdpKep9RazYO#CXO8yz zP~0vq5|rmLc)ZJebb3~@m;P@*O0#?R=MOab5#jQJ5uxkB9(JrQq4Z9$WpUPhFoUkP-F+~Vl?O9fc`)-z*+yuJFP>XpXj!~TwN7}jWQm+U zm2JX#M#)_-AY@tDgYM;NY4kf>zjxzMwH4poufSrdU&ph5Rq~v3(*a7# z&_8?9_Tb5=@v?hmlGtG)EgYTl=m0zz&YuN!$2kbSaq-4IxX!2K>(wHA;|p#6mh7pA zr-3bfkEabsw!T#I+)KDe!4W)01m7uw@qDW#d&%MPy>lNY+zDHad6-w2;2tJ;7a}44 z3vE4GvL%OS_b%eilc@X(CqdD0pJ}d=2(3?gZ?Jg8f?mbIxR?Zw&4j-&CG z4|<{TF>J}r_IZo6k^3MFcM{-S6ve>hz>8ks>)CuhLbEP8bqT_q{@t>3(SddD)qC&U zt9a4#;`?zMXWM-!Jy~HMoX-79*?Ov;@8kEBEGa<%I#>jt9^S9wa zURK;X;YTIw%6`xPoscs(Hz^hYgn$HO}4qUQvx2mi0J=_$l+De$)0LUNBU~V1rF0+J1~{lOz6>S2M^Ef zs6}?DhoP_qj_7prcM;}v$ged5kq(J53S$+QoyEM9!W~lXJf0oV?#p28vj=hySKGQ` ztrb?g&&soHj^a4Sgg7*xD?!~c+fJ@?GG|L%yZegPo!TuPqHo%931+sA?N+4!{W#_$ z*|KSo+i0adUxIM^{IO+cKle%N(y6;~hc++M#)I271J`K3jNgsIgJPZ&Ox@M;fdP%> z+C?mh+7_eX0#E}J_XUckbjWm$<^P4QnU%nYf=Xirc*7M8n;@W=cU0gKa zMM!};M=$@D%+%kKhe_ft{T3HX%f+=HilL|2`@WNUJ4cf6i#a(hy(>Xc_S;v_%JZJ5 zmLR090)@H!W+C3Zjq+}xYdJ6T)puQqcnVGkiXSq6cU!Wpl-+$-KoWd!uN0BBk zQ0d2G`p1W5H6nY{&Ua_qFY4enA&gfAYs5GtIh$(2`*X-3i|R#G0T1z!VLM*2tfA;G zEx0>-sXWTU&o0`@$}R4UisdWZpx$oX$&`(@Md*jp2z9pP!WR2meEV6XK75p2X+b6y zAiA?bB+NH1+8-~;axeyx-ssv~`9n~ibWPYI3*CbKhWx4`zI{f#Tli{*8i>QW82YyKv zPiC51mo~3h-i!z9iRI0Sf;YCRsjvLFq*FT;3@Pip4Z*9sGeFXZyf#;Ud%twT{kV$C z*`<*YkD}n>EjPM%t)}}_kcvOcG>up67Xp?(%h}n!3u(E$Ou#n=tJ^Pr;zC6~xNK`JE)wihIupC9(2hzCqNFS@^cR-!*Kl%|m%PsajRr*KH zsW+xTbONL8cc9`#3n9`2cx!?53f$?;z}DAGo_ifPxVBw`X;3)Capdg;%PVsF1TpB6 z#Bu47yk}_t?6`f)KA$xjXs~j5>QZ?MzXM+~p;e_2W9eOM7|(wAkEz4Uw0KRfJ*pZX z%ixNI3!m8M*?w~ru@#7V<0cNw&P-s-gq%TOaL+S3-Uqr8i4@)k`hW2F9*3%j#`gms z-|sIyG`_Dps^xb^%ctn;hsJll2AV%tIyAm>eE;g<|NF-G-c0NB$M=6>(Yw#_eG(Y< zI=(-JL<+}u=l6w5mrv-id}?vQOFg*E5H}g#i&J?1^i5gERYHEjR~9c>f+KQl9O9kV zh4$(c^S<1HFDz?1Jj`}lTK*hWj--~fEMB2XmUM^Ymc^~g*`F_2T6X7-cO<#i3(A(1 zwAkDB6)&Uko|Rx6nBu6k<7$#WaO6BUyvM)z$yBq#A6`g+~r2RvleErK3*eSOfDYsOIcgJPH&tqa;ZZ;Q}k%e!bOS!GiKkSufSN0v1 za$K;{dF!1uP`EX{7Hz;TU;Se-vL)%*2KM^w++JPtnAyn%;k{ft%eA`Bh0WD*b0fLn za|}LD#3sc)&bD9t)6dSC;LF}(ym!aC#0xbY_R}j6+Qyoh?!I%k^pg!d7Qs7ex5Q7o zp1^7z^~b+*8?w%QIi5G-p2=Iv-oXROrP-xpOP7XvprhS#yKsk!mrq^AJMq0DWu|ku zREIj(mowhd{LXURXt{VJ->YiIOI7$O=S_UC3U2e}f2$|?14mo9#z zt7B=r3y5}tU(RiAZToFEw&*n9aN$emOWNw*+J%>!T7hw|;=Ba%OB}*7FRhZ7Zg?39 z&+=}@;sl}hw>yGs`y1M8`~J|fb2<;-+}j5We+*{d&#THdmMpO(5gagg)zK%cm*4Bc zaSx8*J3OQ6*v0Wwi8mqc=H}s*5z?!0XbkD9?MjqF%ckk*%e;R-cTXyzXR#x0v_F2hu6F#$F#cA0QX!&RNk``I^mwnXI7C^!~0+N-F zS~gp9po8GbmR)}RIw`p-ThiUhh|Dz^J{;e*?(Etamy$4Tt2lF zSEnvtT#TpTxPX>d(oWcp&lk#m|4JE-z914@?s6MB7IhL@3+@cgn+L#yQGFG$cfen^3b@Msh{oS2=pBi&VS zA3N@{o<{4`w{a%`gY?*IHgS_?|;^uGM?Qva+{2g~{G^ z2afl2cA;{6g<5+W!h;;i)Vy^^H||W!P}N4qs>bFLVmf38ZM(lbRqr&PU4<7S1E1I2 zaIA9yo(tcC84_*oBe-hEy{Njbo8c@_x~{>q_ELk^juSgHggzxVGsjYe+go;+!#0=P z@~RWiwrq;QO4SuS#V}i^zV&k1n|vJgHp_oBdKap!WpM^G%4HHQ^Fr2(AaJ}zj$XpC zrDgFJaM+8dEgrtn$@e;2Utj^g$S>3Qx?ZlehY9I+6?_b!SziO!EBl0t=Q>VPCwxErbhGoJ0!7uY)GP0)40p z`7Jw#V!nAAuLG-RIE31RE%fBEG()+l62erxch}bTQ|1n*=8JQv=zD>zp8@A-a`0u_ zo)V8iZalnjJR#fm4Fp|KmMdu~XPk37$6-)D4ql+x+D2B1a~6Psn0IlCk3!weS9KVxG8bhio0IijpC-o z-6Za2akq$@5%&#ow~D(>+^o3U#cdOJr?@$BKN5GBxVyzw2Ft`NZn3yM#4Q!Kr?|(7 zdy=@8xV^>gCvJan1L6)5cc{1*iW?Mnw76r%9WQQ3+$rKt7k7rZ72;NlTO)3rxDjz< z;w}((k+^Yjmx$Xc?h0`e;@&Clz2e?4Zc^M;;;t5Vjkqas*NVGd+>PR<#oZ+CW^uQO zn-TX7akq-QP28-w+r@1Ycc-{HaX%7wm$1`xW#als`1(t12<8_mc8Qx^skzk zgtCMlC-fE}6XSIbUShZ46saXd|J=31tbbA{4-b#U0-y)Iumh=xst@Bh(KM z0(UGTbUmRaLa!0x7N^F-5^%>ggrbCa+F$buA-u`9r{;LP5V3>j#L7IU38j9bQ7^gg(WHT=N4$IYKBWwc~w469{c1bSI%-63P(T zOz7}#fSw~Xnb2B7cN2Py&@Tz`Ouyy~jPg6~CKM*b!{wTX3Ef2KJwkkjQ*#*Bd^;Kl zoll6T|25YT`ZA%f5DF36Kxho1cL`lc$iVErV-TUCg!&PhM(7kmO@w+9dXP|eLT?gM zg#JqCV~p4}MLa~|1tc|cobo$DL5A_tk(wEVUL({*XcM8c*fyRabSWX;8B?>2^1eeT zO^El-)O?LG?jUqGp;kgaAoNv2FA$0mdY#a55JO-Jh7W~dK<$9T7S@1Xulm9HH~d?O1klq- z`4;-Lx(d!!h{F!99!EcB8e&{sBoPJ?sDj0oQK{!(Cla7>dHI5o7y@X)Y6CH5pq>DY z%iC<@N)bSh7dG`(0AFz^E^j*>o&Q#` zKgobw;dCyu&E%sY5QII4S>kUKj)E^{&&uD&mFH@RB57g#>8a`siolwjAc>8U~yXJBk3!o|TW>7)L4J zFUj&OKnwvMiSb8;)NmkIA=i9AQSoP7smamIWDh8e(LhzJns{Tu(9#k)OcNVEdA{6;2s^G46PJ4@ooxPJ#bB z20R7F!%WkxN7bALe>Z&fD>$qbF{{wp80W9>)r)W*v%{(PCn#DO^qzKFI)UTBz@Jc4 zzkuWB@4>Jvks~(QS|SZV=EI8NJp*JjN!bpE-3)78yGt_8LL%3|VF3uG3P>D?m^~{WywPd# zKXjxLpwwSeY6wYC&`u)dKzciDEeK)5<+tSOT1aJkXl3WU6^R`U|2`rilr7mFBl0nj zUhp>%!TGl0nUci$A`m8eEqrwWobSOGbId~Y^ zA>~i-)eCUkvB*txn8Qop6li@Nd9Q+g8RS^Zo|SHzZ|ERJfRc}AbT<1Xj+}Wq&F3iR zPB=Hg7qe&O>!^#2Fn-5jC%|IKu#n5Z&boMy$P^%MT`bUbv6PfBH0urj2J$WiGTD)~ z4Ha`50=cG9N1!gI!Ec1G*1>trp?n|tWc@uywwIAt*5A*GtUSyXkR|dWf=T%sk@qoD zQMAcHum~alb`mYj*F{iT3;`C<(?`Nt0)*+kN`&(jrT&^o6V#&AokV^G#EoM?N3!+h zapFHPs*-IekqO=H?2G7c0wG(N6kZ%dws}Oj`gf(x1wsuTCS?h-!Z>S*d{wVa zcKoe?uY?^*`WbKv=x!V2uQrMy&=1h-40s&QCyYk(2-*ZGvRL>Tkb*VIr#GSl*_=-a zGaLe}<82Js1bd&8#!O^_v-w#NqK<~c0Z0tTI8p|1;5inKOQ`}v%0RZe^IJ z9R~Dh2%*NWlfwPy?RGfFHoX@f=!6jX18f5WI;5#F?5F5aHC+8@|Lj9i_t(eUg;R z(6vv4zllf+2vroePk^u%{zghE`Zwd4?Cd-iVw|Ii_(AqMb^1R)kDxAxGHF;DNv8pT zqO$i_=szpjs zSRTTw_jCgoMr1x5W=JS;Ag+LdcI_4w0c!GIPdEdC9O2Z$C5TFjItF$k5SKCoDwA?5 zDRY6il!X`|NV%94?tWYfkJd?~>5e&{lwXl@Jdh8NCovx6kd$4d90kOUvuEYaH^wn~-(+yx!D<`AHu*hWG-X7d z0pd2C7f>2xdl$Y+>jru$EAj+gG}DP(1c$y*xazwVti7ni(P%5XA#pH~5;Tt@N}}1b zvS6LcMk9s*6U>n<4C{_D&gkQ(lCKp~oYChbQo0;{29eU`=yN$KU5-B0q;xs@EGDJP z(ML`Lx*UCez&IRz@O7+hoO6QrfpS9GO(GjQOX_g4-&9x=+!nH6zC*SbK)wwAlf`iU zgr1InwTZ~fD11tLlgM@;Kgp-3=lHFlh#@cl~^d~;k-_* zg^~dBcOYU~5KOkmNWKHkYCD`d+UH=zJt!$L1bPEnftIOyqt$YVx{$~)ASXI(Q;Ka$ zfcdKhvXC`F^E-qvUq^Gk`V@#eK1iAH(M=QVOW=3Q#Ma|C2xd&4{mS_f)vh5@4`#O> zw?hZA@$O6YdpInSIV^ zlmT(eZ{y)M+pplO4Is1pE+OwxaOj8VoC}BLCzRnpOs9qm&zdfF0tqnji7a~_QB#Jj zP~QOJPFFncB-<`l-aFvsI;WE941vQqO+>DOLtiM%(C`?CYb4oDk?j~FC!k%r`MMpg zkZg~`R|$}rubym$e+0rfeTa02L(xJh0TOVsP?)cF8z)LVpZPkt>%`?cUp{7qk2a{| zu|!TR%-0<{Uq4{JZrAxbhFNLT`8u7*VLD$zDFwn|M2yqVk46Bq@(q^#H-Rv{RYblE z#4SflSJ6eJoQiC-93N)(=fPo|wM6cN!*UeL13*3mBE~uIX7^@#U#B2GU0~dMiQEHZ zF|3%LI=z9UILBM}FbSS_GtO!vd|J!&gmMQEcP{LKV5T#YoVVn?=bK%ez%5Xrg zife%|oexNU7>axol2)>+uR={x#TwS(B=lg8wsnBU^DwC zkT;#N-f2JYg1}7t&p$7DTGqhpjQ_#x?!9`pAnzX|n__r8!@7Egbu~}d)z?{9*Xg?A zUQ6+oPg$+r1fo~zV%w)(bV^*_WI_ZbGCpeh5#psUl4l$_9$36 zn@$066W8tXe=x6HIaB3fY?nQN{4C!t^%{6AC}Idu&t_s@hCQDEP2oA~4R#Qo-2h-7 zf5w1s!ZPkwB5Pm^@@SXO_YpV@iASjbA7`=Dx3JpyK$tZp6h5%u3`9(R{d$yc4l5Yp z8@f60uuDAz#2tP4#Da3qBjq?WhY9fSXRB$1!$iJMgaaV!TPPe79|R)iJOnfUFOmE` zIMsG|e!X`G0(dxmE%VVsr^n@zx)?|$e4(rX@+BaPNa+rTYH<{nR?4Chw!b3e5g-Pt zMi$R+!58DMmmhLM2r%ML7{JAI!8w<%OC~Rd0JAGc1`z;TBp8mp?>Gw(&wFMucns`N z0yH*#F>?1a%%d`}UWOhZ8x))FoM)WL+|UphhHAK(g;oW}ZDav7J7)Zg>_d+LnFzKa zME;I0b~k)61@Cn9K*C}Ou;rf3RQRNd$i+m?1ag(bb|aGe5(0k20(=}onVkIm!nsI> zMeuV*91X;skS<3E*=k6chBnNndoLXc%_s^otge8@q3hjbq=E@e&-@C%mxJG$&YAaA8E`_G6(3d?>zLRj{9l5!K2 zXW9Ri`hH87y|nSMy6i>t>h@)?+xj=C4-J7KP~$4JSM>^Ns+U(=Lzq&xt}rSJkS#u>yCIss0lM1b=ZP5B-v-+;rBPz;*^fr|{L2a6WPM-E^ZSAKec|blB zMJ5!!lFb&u<-NM1eOrAAbvXjTY9SpO0<6o2i7ba*Mu6rRBt^<4@Z~w*hseVjS81#(~s2()eaFDaSJp1{`<1{0EQ`2#jE;lm|>?<6=P->+w=3lYx-J zqc(K|kXmF>D1X*%@OZYtJ|LgsP$r<+G0tN6Dh#KK@$wOn#1PIZTQnKwfveJROq64AxTmpjg!9KxD`xiBBOJ=K~hh zFX0R)3r#_L-1`{#d#XiarzCA>DA4_S2J1e*o+={X5TG_sQfxgeSIS~uhD*v%Na2>* z9jnhl(xm*B6b{brigcx>{DYJyfm{V&Om~DZ&JoOPFCZ>up{DdDg-?i|k_d3}dk%(7 zcY+CwhP@QL@*?Is0Mm(F3lSXtZ>Ok}QM4oA3x$U~+^ewg)ir2b>?3SsY8bj0);{W3 zG%|H95LS0zBK-d4efVPX{r(;&h`=D&|Ki!9TOYlkn-~JjLOq9yE}tE)Af?M^huD`8IL=B2rDh~j;!_iIJ|8Ei68}>7nag)}z2aEMaAnwAx z6=c@;BV^+yk7a!|oojq{z3?+6^&k))qKPTo+YZ)YiU8Glmt2RzVOIW1*ph z_I;h4Gz6IAtJxC&1p6CioyL*LXByn;ac66sfWeH&2KcVb{Bw*?oX7-D1K%JP7x&Q> zY@0L-kONZW&5`?nECyA~u}9j^YtB0w=q$`Yufo5SNPjr5I&AK|vz;o_5TM8%Wbq+o zzoUlB`)`Mr0C|sL0iO!K6Fc$#(cvXPUU{3M7<}D2@yfyyEV9BR?{Spd3w(TXB*r z@EO`!oL^}kN4b!)gH8MAK)84p!)xe914_d;9)iPpPRu>n$x`yS;j8a!F>Zs=xgI)*kSzdL5c4TOB`vGn_WXXYy#=4Cl$T8-Aml&o}o)_%X1*LhJHX zArgiJ^#PGMkV}F5626CLG2eD5uL9wENzD1E15Q%>98HaZGt3Uh8UqMB%>DG2z&YKa zKn?xq$Zhi}$P_~W1D3tp-U#Foq%X$h{ihC41UT=MLb$xOypRA*;e0AfA_fv5dx)L= zSs+YDUKjZZ5P6)50L0bv+o!~62r%M3RFa3lA9k4z#nRjkfb650`yT<}D6@rBez9Ca zfW}RSD;hBb7?Fh~AHTVT(0YW7C}WZgxDUuLL7am&bkGDF~UaNJLpD4e_Ciz%%0 z8b<&DjM4HHh&(W5vz9ad6Hv&bbkuh3rCqgCtu1~yOW^zwljm=U%tdK(8zrXTyO!^< z;%Epk>MNXac!GZ#{H;Xp!W>Ox2a$C^WE%!J-yWtDqanbKn;;T}b^BIfUaujQh5*?& z6S-LSSg#R2$CHKLSKy0r>!z>M&IlY28czab zpU=gn7?*c}GX)diTX1}QuLfbQy-c&_%b|f{Xb5mz`aT0#fj2UgX3xsSo@N4)O$Wf- zs+Liy0GyZMuOzYy9gjO(J{VPdQ1a}SJ)wqC3mtj^5z1v46-X(EZ>+^m;0)BIP=148 zH}_O!ztVpNoRU6=XA1r)e1o6mOa>y91whzZzRR+B21p-=@&MFhoF}O!A1o;5gvLo< z_epjMF$7W|-b(B<05uW}$E^b%7>Oak@2khM+4hFhqzT|%7e@ykLR?H-bQZvdsdF~i~xsvo3d#Lu%G<}zOe(&b_s^VXKByCU(b~JGKkx%?6~c|xo}T{2;eD? zN>Qs3KrVs*0+E}6U<_5iB*NkUQitL}N~HXalyiY_G?O?clI;zIr~2wFAidz9Mr1Uq zdNl%Mqqq}!pOZM_u)C;sC~sl{A>{-3#+;*-`l>@&g>oY0Y52x? zDCov%#JEh#68Oel7}~x;(bTQq$#{4LUkn7n6r7{o1dYWIV6EQAEbt@LJvJ{eq02jc zoL0%iqiDkk*JI1K9Z3Yp^hXBpL;Zrbt9e&Byad?j|IC1=yW|bq>DULfhoP!l84v-l z+q&HP+v@NVSPZt)!7s-Y)8UJ8dE1R|djZNV(l~u9EriE%;VPJV6Fc?kVnpas@TWwu7`HG2Fbz@a?Jw#ab&C!@O zD{O^pV>RI>tFpnWY-*}pXf+DlIP2PQRg4jv!vj>=f~s)1I$Ui%?TGy?Erv2hcz8hsV#Cz~R8wYS<3a8vZ0hRWEib3#Mx{6)`c3fGm-YdR-dJ+~ZSxH1|(C)!kX&b86T zhN?(p0IaHNtgC};Ehk#8>MEl#(XQM&?IJ6nCe%iwwGDHuzQg-km9t~Wv(~OYTt5p~ zLuGw9&(yy!OQP@MzRaj*tPWSzRW?<|Y8xB!jNky{eu$bWqU>@gl+;&&5VaZ_V^*cr z&`e!W;`Nc(LMt4ts*HrKX!yG3a6?s?szhT=$b=eMS-lS`%CnYQR@Pb3+67is4YWqF zH$^R{0<2i06{&2BhOOp?+N#ECB+`tUn^PGJBfJ(G*qkh|N~p#rGNT!>=7t*>cUE`~ zltD0*t7>ehwrVQtW?PN3k%g`WipCCUulX8o&2DUNvZ`z6)W-744%pwwHQ@!7DB9Y3 zWL#vp`5mCf*EWQ$KGprLQH^!Y^$h@(WvSto>aNbT)Z}p3Qb-(WhhvqsbpyJi(Z`xl zA&m`Z&#$SCg`<&5)PUV^q$laV(J;HVp*FTqRZdiM!wc)e4Rc~O*2NcDgRU7IP@|h8 zb+uJ2RM3W7ebv;4%2{>ceCgW-YR6K2>SlLr#^@t;jq{yGtyue2u}O`MF`F>DsWB1> zS5HJI3e`csn#Q_nRI^Q-h>i~S%fkzGz+}{BUHHo8M&t&foUW{9Bg5lnOMX>Tm>nN_ z7eqs!t*xvZQ`cA-i>fkqaBFr`W4-kMFgkmms2bJS5RHvP6RX51#O%3nw5GASuG(q{ z&qEW!cq19&2v8YCPmfvb!xl9NS1UBB%YY6aF8y}+@MzfS&;8CAj*62ZB5Ds^&>ykq zWAw7lQNoXWa6tL0jWkAVWiC_>bkRkf5~z%hnk*fP@|)1jYMa7Q-N$S(F%DGYE1Two zkv|NZjm@yLErLyz4Rc)D)GmqDjm@m?y+taBBk}htv4GlMWC1}d*+G%>hG;$8$3x04 zrE~5m!zH(m*p5^iMZKe5W3|ZTltvY;y*}KjjH@tSH?=F@s>b?AU3h^#Np#{z4M0r0 z2r_8e^g|5EWdpTz?fLw&xzEZgZf_Ma`tS%__a4p>Ko^UC&&!F-|Ei^ z$LtsrF{MZQozdTJY3`DzQ1hz?sCit%Olh!oJke}dIvjrpn5TVIgv zWf^(;;)|$`4Y%5vZ|(d@;j!6_k@z1KwdavR}G*pM0!n11^bdam3 z`&c7ZM748d{eaAXk88C5SlWJS3C$ZKvzq3reo<@DBI~qdGV-2%U&n+3!H(@fw{V_PMVE15kuz~4hL4h zfq{-hY-F06BQcT&p5g9xtjSovV)HS+c2@i7gU(Q6piuk3!3ebXLe`k(hAJ+D+cONI zMp&uL=6bH3I_Hvt(Exj;JO^|+?+nFV2^Jve_;ak$SR}}13tTogc+NjVjjgY4FK_4> zit@){eTelFdYoi>Sceipcd5b9E{i04Ua?y!nFpeTbgKJgLurj~oP(A7K189k@~cl7 zU~K*-EalOp7BV>$-iS!Vs%@CvXw_FXRL()JxxCd2G_p9w$IZp0u#Sh4vrDKF(+pN} zl4o+G=tf|+lpQ7n&##Q42Xf!I(5kCM_0({K0X`JpJ;=s#9e4%-Ci{pO4#i)3i2S7BdbCdjZAVLwmwZyZ+63x3q5TZ3T zH(-Qjb_by@rqqa}0N@JKvR~?pq5AyMSZ+>_9fW!+AW3mHNAj&> z5GrYW<9sXBI3HzuRb{NIrW);%A|^LSB8^QfOQaxuz}5-v&B>fKWg&LE{RR%!wbiaL z<~zbr8Z3pus3SLl>e?s^jrD{LscuK$K{-R+(UsAfS&fxV?Yrk-6k|JLr`!xiQG#P^ zV}1L9VlWC3;WZ5J90{d2DLe~XG}iUF1}lVZHOg3YM)8fQZK|J-@ywbUspiJ80|yGw z<(P!6HR^C-M;?@(UAxY_)^8ApQXR&^zPv%Y#UKu&V<(K33UI?vC?4jU41}|= zOSF?jS!wbp9nRspu*D9Nkrhc|UoJ;S7K_B1I(cM&tj}U@D`n@AWhPTaA?ln=(L;ew zB|oe;H_Ua)2*ug4!|)ISyS!N(6Hsx32I_MB93|>;eujNPeJ%IM(i$;%;G_nk!V6+p zKTEC$+O2Z3JpgfbaO-g}>k$Kf1G3813R;D3fr=f*}q=z+l#T zyGVACXrUwI_-;aTU91)xNozz5Q$hp>Mu>;1FHmN-yYAyGW>3Oazae%hyQPxn;=aWi zJ$>LnoM$yvOE(2KO1wa(drW}22HgUOuGVa)PdD3r8gWns1##Te?L|9q zExHa(hg|MhI)wdkzePl=n!@1*oV9Sb+D-~8us}+)d;Ww7Y&mn9DkC+uRZ;XW>84N} zRhwTZROK7v6;;i3%~5NT9vrxSLu=)5ARW)n3wFnHl!+~HgDVs37~O#iIP&z)=?JAse`P1mZTEC%oQs+(E~bgMw%KiU)4wR%Lg>2N?}IJ-+yK__x)$)K-a#u z_O1q3p8L<-xpwy<8Fia)U((|yW0b5%!^LFk>=Q7Gvvp0?!?a%A^r_~|I}R;ewio5H zS1b(B{Oy>?US7Bf!3;TuBm2I&^k$?plk(y^YwH6k8c`ca|}+5j&W!Ngc#r zg~Ji9_BzYJS`sHQjnvhiDLS*rmZftrqm0su-YC zXD`96L}xxoDafTGyX$N^)X{oxF|NU>+s<;QO>*}b`^vh@^f{TIHi>(VeMutybA-5? zkde*Ng`HJ)b{Y0IWZyi_Mx<*l3?24rdtCLnXr~dG9ihBnbaD2ZT~xd+rF`#{u10qq z2`TJ@ilVglIqk|pN7W0OE1F|h%pQ$3QCB<=Kdu48LRT~hcXls$hE+Hl=>!}q_BLIO zzxf=XsYS35?6TrDm)_9W`x$ra-$&L9YDaQ7QuZ`msYy;-feCs8(~b+fjdFYB+1uC# z28{6ByL3^75?v1R&~9VleadiF=KElh&B{LLd(j|21nyhYJfE&H&F*YbI+aX2ak4*g zwkOW+q+OJ}{H~gN0d@4?(E|sL)tiw?_7lqXjjVv#>C>7oYWMBEC47aw?bu5p7Kokf zZZ4vq&ulO4rZkR{{e|65+i5Tj`{2eVc>*xIwyNCaw_DDXMthr~JLSG&qP@y8t{fA0 z>yfVy8PVh)zQh#hagqS&l(0N`y7cjmv&TV#!a!35V10rs3rSjB@)G*GX_P+5;C{73L0j zkpW%=%jf6-+b`Hi@o1{4o-euJ(1 zfJ1hzX0`iVrM(9BvkK&@Jv)xa$j6R9ZIZ$h44k))T!^(C+7mz)fsA1dcuF}OkHfel z!@`=+G!$MMP__>4&S*r8F^2OvU#8XiaCI%_DTiJgjt;MkArTxp0+jveaMWUlqHf@; zRDE#bu3zZVZ`E}NXZaP=$|g-3H@b}Qs4FIp8Fy)UXvCDUM8{vD;XZYB%_=Z((BL8G zo_GGxVIxM48eKNVd0kNZ*%$Ej0)8p(wL9sSf&d&6L+S zPcKYS(}xu%QmFC7$+5xZ<#@O@t1^nInvV(5v*1Fdaa9v1gT!|W%kjVs@9T}LDl0?S zFw8i7#NOD%fU?3mapawA%d^Gd+53UWVgYFV2Vc?LlrPeP1T{U-C6V#l=dbZV^JhR7 zzxLplT;pMhhhX_~a9DY+ghyilHhg%oxsNihge8nO>g7e}D-Q<_du2~tgOolSA6nv- za=w5(g4a*O5YHlfXuL>;&cU16@B>5f8DP`SUq$0QD?j`t%JMlI({EEBr(lh+bgZTd9YY1P1uZiHt ze~65I9qDhty&?3U#YY$LLutGnkFVw9Kf_z~@Dp$28d><6HspIL@ZI>1bs6|k(lziC zUPHCQFZCO0HT(!}&e;q=a8lSR+aD8UaJCXkLhU$M8 z!tp7@diaTL@bQxl@%IhY?;gngGvdQf=MW!$>BrCye(DoLZH1rw)KI(N$3HVv?|VVt zjdbBBaCg&Y_?F*PAHmPzVzD0h*(d8*Q{4+ciF+Z6zX^PpsVw-B(WXk!pJuAeO6XT* zs@3;Huj@?}$M?+X8%&jhpZ%Jt?tB39ap}|O2ch5nrb@#PecM!lB=Y?@_~56WF;(*0 zkdH4ax4{qME5PXwAwK*i@U2%74}S0$rrHfZfbW@GA4d9FQ|*GE{++3MuR{3yrV7F5 z&D;_A$xopt{NOPjwVil>kGk^_@Qw1Qitm6ApRANV3cu2$E`(o-oAnm0hCkn_mMP4lXu@B?23KYd(M zo`E04<$k;2XCCsZeoulA_n=OJpMKt};`HD4svP{xZ@lUxd_`5U-K)mJkK>Az7{998 z<5fxemQPhbg>=vMsRVugK*2ijUG7u;;g?SGsp;?o_|#zu{8XJ!rRd+{Q?VaW51&fH zPdw~X>*1HCd@2J!{UqY8hrA7l2S4;G;=#8*@Tr~f1Aq0YPVuX)@Uy-A%8M`8(tZ3Y06%cHUoC*2n&4Nf;Fn(MS6TQOT;qBYe$*_u(66fD z=in#kU+-627{17_dTvBL;DVAM{KN{ssv~}@U)>8oko2qLo<%xqfx{2rTD(p0Gq`^& z2Vd>0xYCZfwpCYv# zesWZiTKxj*P4Zbz0NPPr9G!5{J$p4p%)Oh$6*A%G*^ecqP9pE@JwZ9XDV-LxiYL- z$_!R1BUOdDVYX7q8s)3FPMM`m&|{wRlrB>K_#$Oy@L_Md1@c!Q?h56txJ7kK-3r;a zLf6}nhuf4&+yNfULD`3tfs3&GnN`Zjtx}$fN0G19%9HsnXwN`4=A+DON>%()smNQ< z_bpXax)pkDMLvE7U4EAL^dcA?=(_4m7`nF-_-bOyR8YStihLQM{;R*d3x^FWK>o<_| zuHg;*)=-f@7-sShhQIWE!<+jf;o`D|E zo1R44G}CF*Q~IK52495CEtqTHMqb`V{@*c;>^r6>{hn!5{Lb`ee`k6s-Usb{(-Z$A zct1s)&rBo!nQ2B-`{nh56STtANy#CMay!5&}e5|6KRjK>=qhxzVGkC~n1 zQSqrBf8Z+5VHH;cFZURc3e3&3JZ8l#kEfyv@vrrm!MPq^V7{j)wZP*oy&iLW+*2Hh zga1a4-?|yHmU_(iGLKQZ9I}@~=B*wheXGY4xy{o(k^uj`;Jw%5%dYYiRXpnPrt#Tk zCgmv({Lo`2pYZszPk9b2ea2&iHh7A18$5=!(Nh$8-eV@72b}i!(wjXf56F23y1WDV z??K1yNaG(KPtN1@=e%Ac>G%3_hkK30F_RUdmjnO$BZ`A_J%8~S4nkotm8rTKG3y?x$L zZ=Z^siFrEUGcp06KQqwhu?G8$(zd)ay&zJeT&kTO#Gpv93d}^1kDDx@s z&wQTbZeOwWFXVBL58wFu&7kS`RQUZy#1H>uznMGLuR>q+tI~`7s^U_=Cw@8BGvi^g zj)_n77g<;OJz1<}k~96D%r*XQ*$S*vn*3%2zj9`M)$h&TlbfegWm|^l5cA>?9cr8?AqVW`jx+^;yu4F^atqj2Y*ozKQk4` z`8|RQ9rD0`eVHkz}jSRk(nHfwaBm{ zGd>J!kxPoqic5-&(h)`8+{hx2HM+>mj4m<~mlc_5YsKa4%FZH((D zDPvKwQQE`j#a2r8*rXWOhsFz~XeA~iRk{!Qdx+-J_a>L&*eWaQU;o@Q3ch#4eR2rJ z@F}pXi$2{mmEqBEy5ZOotJ2<|?!k1Vyp1c}@FfUuTlKF!{5>ge(bE!s62fQ-^ya-C z`=ys1uYEb}EgxN^^B&?Ka5`Pc!_I#H~Pr8uoGdY z!_I=OgPjK(hg}AHC+q{Tt6`sj-3a?KYzFon*zK@?f!zgbE-q3%V2_2hV9$gd0(&v+ zSlCIhGhk=KMqsapT>^V6?7grL!LET_2b+d{6}F=piu}BR@R9J}h2IAIA?$8gKf+33 zPk{nr1Vef#wAND)2DcEOVH^IIJyA}3#usdNthE+EdsqU~nVNZeW z2RjJ%LfA2|A=od&R>L;H9v3fCyjr8b;;HM#*hHktAo&>%c@oC7H!v!#;NR{CdKPL}dCUjTj@>1VYLj2+N? zA^4=zY(|!QetKrCA2LobE-Kg|nob4x^MD%9dqHBk4eoLOczeV*t%@ z?2{X@|LTQv3!LxMGOPl48g?V(?}jZ!SO&ghocIn---%xs#uyRg&oMQSlY`vQ7qJG? zCJs2j+gJ)rO5>?Pb~w*hXecjTAW!OH6xK_yj#-T~tkGT-gylI5jg-S*?0PAMp9BvL z{mi8}V}Yf?v8|YXzG4-8-%x?;ylOMbgqC3ncm?bmh}Q$S1=|MLiKnBB=fo=vW2zyf zPqP8_{0i(_u!qc{5;#->hf3g32^=bcLnUyi1P+zJp%VDNsRX|GbL<^qFTh&%T=0qknN6)^dyzxk>bfCubM!2(x`|Rf5n6$fxM$YyFB8Zj2k*fMtWR%l=b3=C&wdZ z#1k>EJStdT{$=MwkwJwYuI%quE29UN%~MxiSDYx6G&uiB&0asIDH|O?%=kw|2N08K z#&_X)q8Otq3H;pU^U_Y32M}{#X`kzsAd=qer$1#wq6-_Un1!|f?lKGeDdyZ-q!BKg zbUD6DI*(r^)rHIOq+N^L)4o{tS7!5UT**z{PHI;+`x*T_+)symmxZcoRh*yii8&xm z&RY=0RksbcsL}&cWxu5y2FRSb7`;M=i5wbiIByW30|=XAmS>NtqEttf5UWzs3`z8gN`ZZ|r|-OuVp z?2YZ4?38hnW5dGECyEgMS-V_MnKp4?puD_l!Gg+JwexTjCSd$@LA0EuP|lk;A+oxn zI63<1WGwlS-B3D28Uz8++AiX)annl1(q@me**iJ@$>gHs_~eDjMN-?4WPb!Vw6-x? zj?T#rvgBh&#R}D)%lQ(p5nuat_5EL2nG>O1rfnhf0_FIav;04*NqY#~Y7c=^4oE^* z!_i(O?Ym{zy67SCz$A2~OLb)kgUL>}GbDGn??lygpmz+!_uQSs=64E1yQ(aYG&hCI z=hfo69bDQIZ}lXnKb?HTOkT)ZDW9`oK{>9<$9J~4fibqQd|p7sx48A6IGQ|B{#HPF zRn6S;InB6=LdAPa)MyN!wl+mj1AP}7(pNF0lF=`AhK!6WkAWuUp-5*l-%|fqmi`U*TqFt=*R0@kk41 z%Q=8=W8-mC3!Ln9iv!Pge2J^2t)wgSzs&ub&yjnenO|YAF6<7FJ@_4f3)kz$9vQ@t zGZ{ZZP$hR=rz%xRr6XS9>a$zmSv z=xJ<{;l3Qq^|+X5{H%dxWu)P*hQ|5j_RZ$ya?b(QI*?M)Udq67M#op-cEjIqG1cwF z=tbGE=4iN_7jnnSCQY0iD3_@pY1Xu3cBiQGuP9QfVfT3vPsoUcypJL_r2|DuRo=1IdCaXL1qp>gi``< z96;Q9p;e^StJUJnznZ^P)A&sxa4%O)ux1O8%%F(Otd`#-&0y1;e;mJqwqE z;u>|V9vh;y*f`?n9cBG#3*Xgs{2}(@O48rmHOsm3t7B!?vTovL;WEV83hng-!ztD! z?W4sS^-8x)D!kRD=FfJVm@8}=PC)D{*>H`R=$bTTH*Np$U3pWif!eJSX4$9fi<83T z`O_jWthQruBM(6fYGaJGCLc?Fim@CQE>+1sC6%Y(BD8$?+I;wI+!fzGjrDn=?C{Gg ztK_%vnAFCOH0P&+KuhOoy5bmPQ$AEGlVO|fT*!Wc_!b+_pDfJARsAGnY(lINhpaeA zK*$?T2!27t4%uplG*{QotF9ePo^3j$z7aotDIr;gRL;Urj*z~c7=DbTRwT9&tFFV( zWD2^|Myu)?qq3>X**LG;W89ByG`dih4ZDcVc6oOTO4i;}CytwrTgxT&xQAR390|l` zQ^pb-Z;nOVv9(GtPT^&6UZF8jA|XgL9G=VgcM28@<1$BJ_X;+jH#R1 z@{$_Gt$~cSiYV`cY?QUiYC*&GRrsMNP}ewUWFgU%M)~t=#Mf#Z{g&u@LFel7+$dOM zwPZEzIVM<+pWdk|uWaTenew|*p~l9#P@^QYX|Hswr6_x|%TOPk!`mSlxP?jJhuQce ztw1wGp$oFst_0qY@P>TBZO6*h&s zblRMt8oR|fs9jh&jbhWx_#bJsp+LYcH_R^X-7ap6h1ETGlqGM{8qp!Xk zGhD6y1!{tU#ThfzJ$qCnX9fakBW_g0PquOl^ahfM z5QrDYjZnf!nK^F~-@wB#or{*eT_@OBzfiffRUm)v81~T0$0;!{eabLg+1VU*eWn|1q zAmt$%U_2{rj{t63sjxzso{>=644^0wHG34qWsVM{yQhqtCu>$@%!;g)M6B$ws2C&pg`AN< z0vR)7rVb0mk$U2=jk}=}P#eG>bQL5?4VE{=ap^TpepFA>IoH`+pJ|g8qkxO-;di>Cx zZO7Ka4^^_Lp9&P9g$8zF9K@6-bA(kIs0dgoga1|*b)W$>ZiA_y?ooTFumX{36iTLB z<_qy286#Mc^`#9IPZlYKL_9MdLIG4*DHNb-CC#`IgtUw=fwNjO#%b40d#x;X1g73GRq zS2<6jTc&4*W$g>5yP*}ENng&33OyoaB)Vsh4CT-r?WB{QU}>rdssu~ZJ}Z>;idH!k zZy*j*0tJ>b+9{hvCIi8&k@aPKxMMJGWV{J)+DI0c#=9qu%pR5SW&P>FnVzUdB%DFg zX(RmwGy`w8S0MF;tS99G;!kkwC`ug_%=+WrbP;MYcS7RCoX^T09q*n!I*A^hD`HFc zWW723r7o~Sq2ysnj6ukVH|s^yD$W+Ae4+GV7XDKnNJfnZ&13XN_ zrC&q&Yd8q_CI?;y`5I0Ge!<~iu2fdTNx4c+iEVAsl!N-*P zg@$?e>>o7D`)5x&&E|2Tg_yG`J@N@kS$Ov7owr^P#RFV=9fO{qE!^UmCr0z>9*^g$hNDMML(?6d-2LyggJ2ymT-BY@WltmKYe z>vTIUT$`mvX*dUXwuX8C?&}&(6yXkC4QBy&>ublgiVZbb!$I8BJ5$5Fvv-+>d2jDy z8V=y@-gh<3dweJKv*lD+hPqC}X}}L?n0NdBM8mw_cbA5F$8X;=?6`po3^hr^$)KTP z8n#9l>K+Y806(o^HPTS;Yd8V8+nKhU^e97}rQyUFLtUofz@>(YYB&Y>0S)th;a_W* zcMM;CmevRNIo_yY-Z{KM!=+y`)QJ8zPaNe(TQ$r(iHpv*d3Z1JI1Te|;)K9x zpK}fMgoZPKJp;&(wpVYcJ{nE~ZWLIlK*UgwI`DOddPl>&=eWl?c3Qmac&NZ}mHwKc zDm9!1yiCLD>xOz;^IL#N2eh88hFYuP>{3HzG|YRF|0XcTZNNtlwE1~&@;HIxsv=>i zxjH-oc!h=&fWNQd4B*!^oCEw<4f9^0QwG^GOTS^Lb2Xdh__&I)e|(ZAX+bbSQLCs#L@gqa-P{!< zrQNcDw1i%usJxpr-L?y95^^c2QVpijoGzfFr~Py@-!n7knVDy1o_XeS<|+F@p8BQWCg8s^ z2CsgUr`A=_yBHIJzs6W$@WP$cm6|5q`+TWjg}a|O3vL2_mteXRdU2JeLwCq*WQ_3y z_zuD9P@ejZ;4^Q*t7(*@r|3Li5fd3|V3iwrT)-+3|@>G>zD6wk2 z;11wc!Nb6o;4$Dk1^4|aPyJBv)Kh5xZ;|r;IZvG^baI4@UU`y}_@TqUr@h5@z38s6zpRoObUvs{WQ}S${ zxcN>9M38wq6HVLMCu-+|r68K|+`~I4zo)tU+ zymqOkqi`qGoq`*IkH3KYp$h@Op0VP4$9IZ9-52$r;$H{+b-_)*lY;wz^Oos8H39ru zVAgqnmkXx5%R3qOsk;1pwNK*HUFJWPIAaTNKe*s2;Fm1dbV>{I)k?vAzypFOfIlsG zq%dC{5IhC^TfuZk`ht+A(+B)|!KDlH750lbpN+tq1vf3qSC-(C+u!mL-De zp8AmBrnly+ErLtV&sY6|)zWXcJD!38&4#to(z%<8ZnGgJZ#?bK= zEl__D|32VVm+Lsgz+HkTk6)l}5j=Dv>@)yV9rYD2P(Km>(vk)0FM^wZOV$e=;In`! ze(A}$FIxONfUg!zwj@3vafX*HQ1=K{xQFo(j?<^=fS(aO4E%~KH2q27a|F}9jmrho z{f$=$t^@934F2G*$wBdN0{*1nKHwh+9tO^Po2EYoe3sxz;L8M)-HQQWDi_(l_`LX! zT(&@s3np6_g>Tn%$R0+OV6us^L-0h`0`)7~A2u=;zeC3_c@OMb2p;ZRpl%mj*S|m= z6ihZW{wcWBTA)t9QolQ#SfH*HO!hVI6+HF91?trQ&~ZwK7N|ZO!}i95f=Bi&P=69k zwm6nVbbPYM(IdFy(+kw3V6xBg$|fCW;tQxp!DU}up!NwKzH@>4xnQ#6@$zPh-=|9M zS)guUtW@3p1?pSkKLLEg22GRfeSAc4-Pdr{y5J7r?+We%Uf-hQ(;cDr+88!M7H*Wh zePe;D6-+imdTfk!v~j_u|GPj{M|FI%Bho8)=;sU69|cbVpR!5EX_{Q1>IIX%5lisI z;|tVx>^R8<>X2Z%ue5Npes=`;48e4d=t{wKpXfD$*>(wI=n{t(sQq>v;3>gnzh9tU zyhYP&1g;WHccES(nC?WqPB7h#dZ%Erf$|tI%Ujq%iN!RXiG>B~TY||h$_uX2{$v|v zEo02rPAX7sg6R&|LBVu)>!$?My{+F8O!v1wC7A9zec{za6Lf%=2rhkbfx1d?9q?U( z)yV}azg5RCds%_HL~tYUZMOg70(Hp7FE3D4TXp>5R}`ong2#aO37!Q0yf+@*S)nseO+)9@NqplP9N~w z1y7z2UI`wmD^MR7JOX@BaMRKP^(Vo7z;E3q`2oIBuv&(C6ioNT{#Y>C>REWLjz0=251=D@9J%Z_8*~bOb{jqtynhxC~dy3%FFl_z^ZUSx;+y}fx@C5J| z1Wy4!CAg%%K%Ku`)0_Yv60BC@?q9*Bz=3z_IBHda>a+1BxDQz{*(-SKyL6ngOAFKi z!DN@{*6SqCmlfcSYmLV?6sR-aEqDv|83Yf-3e=_V(f$*_*9k7W3Uwj4WNU$1)F*L( z>je+NR>JLqM}UvJUdJiv!2P^}%Yc6(xDj~ydv%;);32_u_wHkY>0aKlejSJI6qNM}Y4YJOTWO;3?p$osx&n0(GC@GT?>*?cWFd7r`A}1?qM0ll%ZL6|A}oRKMU- z;O_`-giVMO->>6$0Iw4~u??~UnB?aaa6)iNZ-Lq`afX1uZ^sAztKg>XXrF_c<`8g` z;HK*e)PD&k+fsk9@ka{Oxt5MkHl}V6-1o@>^+UmAbLzFbbR4of)g!p<&I0un!HvLI z$90^>kplH)!NXrFP|pf3{c?eN{|!2hx*Kv*FxjxWAff%qj@8EmlP#;K1(!TlpjLc9 z$06HR9~Vsat^O`}Yzl4ZgF4P6aN&^PKNYCU1(*F9ZA|dU(`b`+9N;Ge!+wUU_>g|L z<5`qNFxk*r^kJb18yc4j9(#46`jp_2Qw!CJH|jW3z}p0q-K}2;o;TYv)N2b> zr{FT+TLpIjKP`9+xM#PHKlJ)S^-aMez^8mf`!~IzP<06&SyHGT7Cd%FA?(fRIAgH& zahu>N-~)n7&n#4b6g&aEY>$plHo|VPai~x|BbaQ3t+`ofURtR33MSiO1s~J?WIwD$ zaL0cXs=EXa0e9V^;|xU#)j`3NO)yz?tM+f&P^iuqJOmsS44WhBOM*+Ig{u5E9iMEJ z#RbF0i29k}jvETqS^p_C6NTz#!Nb6XAD4H5uMs>ngm-O!;NypNoJrtn!KEK6R38@H z0sPWW=s0yZ6{@X*n}F{ZT(Y}Rz3P*ahmRDh>jZavv`{@_<2|rz@?Sd6Fz|JPCxG_~ z?z_2A9T8l53)1?Oj^7CUQ^91LZRhRUpX{@>eOlwGy@l#4g3G>uw)YwBPqy1WD|ig{ z+g`O-`@V6sn89q;c6#VMETwj~1%C|6BV{{2b|iS>w82 z7Aos5jZ1!2sKy0%94b`#`?NpVqC4kqjmaL}mG?;e!-y}q3HWXMwg1H5VJk=Q6!06r zqW$asS*Z31Zv0oFTJTlv-w0bUy9D{9D0f3or6D?O$40q<$i} z4*0F3+J6f8BPSNA2Lunl5cc!#({cKWi`4akM}WU0xa=g@$h%+C0*(tNn|?{bLnjxh3m?#N zMu0a7o&+8cJoJ(x^#j`<_@W0T{$kkP6FdR@sNlYr7pXUXL&uqTMUlEr@Z>2)>RUE` zWs#~npyQOh3O08Hlbyj|2p)P(kvbxH4EWS>9bcVRq!NP39^s;cKTv`Dh3N8cwjg4#39v+fB zEG<&I1((96(C-A3eZ?ZCOOtuq$Z{v3ssql9s z4s0lXM)2gjVINU2*;IVRcXgbmc#-N5Og0wp6HIm%&w7~R^kLDhNS)6ZYZ|~`6g>I) zB6Zw^rZe`1A{7h zA1qR|?@o1B2fXM98V`>bsn;^@Q^VgZQU}Dp={rU0XM%@-|0#G3_$5Eo?@j^N3vT*p zk?OJilSS$yf+wFSQuhcZJCaWTlP*WLBn$sn(;<73=L;sAl6Tntuq*i!V2V$+C7XUk z@v)`>`;tA3!9(Cr0#h8aH~E?$OWt0!P+cmxv2>y86Fhbr=nE#hl;=L8X-;0SP+cil zEnBEM1vdiUD46V5UjKhOeqH@SRs9o<$)4qHf`=LwD)m#Hho+UVwIg`!l7(tiFxkC) z$)h?B*}i2p;ZPsGhasUkg*4ztA+N zfZrgvv3H@m4)}!y+Q#z-1e2ZTVZmhU`M(8|z2^r7lg;NJ2`0PGNx@|M`EP>B{_}~G znm*ZpE)`66pvwi5E$EP7vIo6hFxiB@S}@s#ez#z<4gDd(WFPudg2_hoJ%Y(j^h1Kl zR`kyVlfCFE!DKUf!7p{*$ZqsY1(WUQGX#_U=yL^=4e3h+lO5>|g2|S2k6^MVJt&xL zO5Y-w>`H%8Fxi&APcYe+{-I#9G5xq;vNQcR!DMUt#9!%rlD+9t!DMr~Trk<4ULlxl zPhVl<8(=?5FxjAfk6^Mx{b9jmi~4rKWRH5kV6sX5ZNY4pS}@tBep)cur(X1Hoj0;k z{Yt@Pr@Blq*{WVHnCw-r7fd#*TLqKd>OR3_yZR=|A#UCR^7#1(Ut&J%Y*R^&NuA z?)8{pvVHwS!DRnBDVS_v|3fg@!7llY&KudnK3y=`!>$obHnAH7lU?j4!DJh|TQJ$j z9u!PAvTqekcCtqVldbFr1(Ut(M+B42>?Z}2-E8$+ogcEDeX?M(pS?sd+0Z^$Fxk;= z6il|XHwq?u+P#9wruGej$*%UWV6v@!mteB5eNZsj*nU(n+1Z{FOt!WQ9@lvzd)tcz zlg;fn2`0PSb%M$E_FBPYe|w8yvcY|wV6wwKB$#Y*e@ZafHYu`wqcm_j^n*+5Y~aV6y+66ihb2{~?&{fS3GE=Z$QEpDvi}f!7Eoo8S$C z$u4-4V6qL~Etu?s4++RkZn%0v=Z9>EpDdW{ zhc6LKHpI^rOm@T@1(PlDje^OZc&}ixDSm@svMW9;m~4yRC7A4s9~4YB#vc_-cE+a! zldbWBCw1P)-uPm{WOMvYg30dqTLqKt@kYU9e|&>rvO(S>nCy@b3MO0Rw+JSCZ;NOZr+5bBt zm}~;RcuJ>Bb^y;7Of~>lG44}jPp@74CxLehCOd#5g2~q34+N9FzrQes{{IK)y?-M5 znC}3;5tz#R5#R>GC*TZB{vx%N;s7rOP6&Pz@FxV90pBCI0(e4j4e;ZF$p+xR1iu6L zWlw3E9l$}sJAu~=-UHkv_zvLRg30FLX9bg8#`^`6J;t92CYz7{6#O*sNq^R9kv+sW z2_{>Os|CLjxJNMALfj*m>@-zT^m_%nhBfgcb|_5vRjOm+qj3%(2Zq-QjpgTU_)Ome0l!OdEAWQ|cL0A@a5wOn;9lUz1n&es z{;;NV1MsT^4*_2;xTI*2%2!Gi=OL|HrCuR;>@0lOVB-swT5jVNN?mQ^5YF2Ro~l;r zqk<>#?q>xzzD238+W5^%{YdcGxk^FIaJo}uJ{A4aPU}ho-(ujO82IJrqjvm81Ha$E zpEK~o2L7Xgi%U{;-eBPK47|<2A2#q84g7Nh|HZ(^pOm71ih(aNaKC}SV&HEX_$dRw z@YdkNZ@IfqM=79s|FRu|m&+9dM1g|K6=J)0r^* ze{T5y$-wz1r}D7az-Jlw0s~)W;HZH+HRe3L%kck@;s0L-zT3d}8Ti`<{;`37W#Hc% z_-Ot_Zqm*z=H-JGVmS) z4;%Qi2L6(P_Z#?LjUh$x`G$f2WZ)x4{Dm(~@oKSwPc!hD1}-=7QUk9v@HzuuY2c`V zI}Q9U1Mf6&!oVLj@aGJS<1Xp~{Aes%j$a7B75H6b zu@QwMB6M6s;TVPL!VkwI6plhD9BEKEzM$TT-@EX`@ddR5KO9|9@4+vD-v{vfAbvym zeHgzR@w*AX-T2{HgZe0bd+@s%zgzIb@dkApejmpVM;g?B;rA*0ZpZJ__A%-w1v<(xCnuzc1r=7k>Nj!*K?64}Sac`wD(v#qWRc`x<_u z_}z=&*YO*}?>_wQ$L|6B9>nh(_#MD+9KVD3kq+<>e&53H+xUG4zwhGrFn$yGeGfnU zt0O*d)41tDEwGk`2T)eC{+>M8H1Z*JeR(Rf9hfw z@$g>#A_1;DVtg)N@rx#xwNMZx|I1@^nA~xbx-*8n&5Lj7 z*>g9}JY7KTB4gh;rZ39HU)((Be|x&$UDkf2W_gtgk#erPnf)y=E;4g3oRcFVHOs=C z%~ww8tMloWDBRTJ)JOKDGw^eom;CuT%}f6L%>L4JS47X0RiGC$ zD>bEYqjoadvvEwH8Oi1NrmwZLS&*>}oXz}IG%m-u*(}~R?3vB#?UXIEnZNF`V>a{G z`6}<3zs6Tao3CZKygN&j)UDlFBJp+IS;Eu$v)cw+>OJ#*@072jkmq)>x6g~tjovSY;3GQ6Cq zXJc+~$$lF-FxfV}bu`2UOdungco1; zRq!rP`wn>VbXk}aKl?&>dDJ(-<3V2m58z{Y4!&tO!n=I5^*Q#^mgfNNi{csT8{z@& ztKkXCo$zuQyxanBU;hqQ-{lU#7rw)#o8Ij!-Xojbce^{6x&ydwbB}F75>Pw(^zh5fo{Y%6Q4T ze*oRCu0!l=)$RM#Jr}7*y6hX&BVBTJdZbI=nNIbSx-6Y;EVnN?XN>F7*`>@Qj4nhc z*SQH@Ki~><4I~<0dQLw2wsW6r&OHVO(RWq_w{-?9u!`Hz-n-Z z$RuXlW*9+eZH+j#7^vT^lGUO>%a-QONOxy*tQ!_BLsi=B85^)d(}7XW$mZ7e4b82Q zZHPu@C-Cxx4VPT7v;i#@<__y4)I7FzMw&Zfu(P)w+BgZl&a0dj+z@}JB_saH-Q8Pl-YP7y+r;~~WkjjSz04X>%? zoTo8pO;uz~b!2UTB2+~@1+OLHrYm1hRLyD)RCiq+>sSUmf-rQ%b_8Hd+CsSfmp%cBBv#C?9j&&{V>}=jHy~YfxiFIAF;VRff^yyJG zuoA*OW*%~CGKI{gIZ`4}&BLQ?PfeR#nO_?y^E84KeQCadAgnOMh(>qDnk=Jw7G9XS zO_7o+tUwiBvI)ancSCF|OdaaQKC@MDlhGXar{rX6W3&a*Y*o+J4bjdF4JR$`8n!@@ zA+F9LWQNgyCD(zjYnwY7o42=O#DF!fGNYk;%C)AunauB{m)wz$M$eo%gG{m*W#nG;RL z)tScom`0>jRC|`)#WD|nGp_BD403BT8HCl`wWL(0rGP;x;JUUL3G-$6HMYkv4!ihE z{j?&o`l{6H+~Fne+V*v8SJc30TRQiG)w)Lt@ermW9nm$U+P1;;=rk!v22*M;7_4QR z?#r{#k&VqH*wifd3a35wP!0^ zqFo)cvo?d5yom&Aj6~M7#bAVuEgO4d1}Qr*3x#1Ks&%H7(XK8Wvap9TcRnhe*cqa0 zmUXn|to70W;MV(D=Vh(7@nYz;sI6LETdu4GYLOKP$DS6Ns_CrTd3FtQm1&Wjrj#{S zS{ta+*0a36 zOdnHZ{ij^1@Z4uzsdt=VejWx}Q|v;nr-XJYxy zeomEmQ~F~eWo1-P0Exj^r$7~R`621@#=Whv_Pg6xeIz?t>(@Mb0$!h zicr0xxdn!bw>x_$I);}-Ab{o0<B&-k~tthu41dPtWudwJVG!;(p0w>QG>6MupC2+s$tqFeTUg z`ii*;>)Q%-vov}PXI1;6c8pcYfSwf6@-GxqtnJBU(nmm%%9?36(Pv5@GCK%zi707} z9xa%>(-sYNJC>B@@==akD$#M(%=!1}eXiY5vp#sAr5^kF%@ErcGL|bwCCb}HP$eVcyI8EC5kjM6K=$fA9RzosoY77-E?H${Vco{QN zes$E|PB!|tQ~6p9%ifhKhMgD{7{{7@MouR}pdyA{8?5iPNP9AQ7&JqWm_0fhdEqS3 z+LSAv`@eo={Qo0R_}x6@~IAS-mQ$aZH)Gs?ZJ7~Skq5?$q^D6x$GjFF;)eA z^ygxwPa_DF;UE=unQ1f*HQM~jNYfSF;7Fi`oB6W#wythl4yDN;zZh;IKEK=v zlr^+(j zm{+l!s9r7!Ls~VqBMaLN37eiGE2gt}k7cZR@++NiFm#FQWLSE5AbYsG1*E-PK_>-q zL@-PGbR;O7a^H%>FBfNx5xvHUVbm5X32npoJfY4eCRMR+%zPnU+!2k9Ivo?FjKv1W z&r{8a=RL_3G*2=)@9NV@?(C*D%vz^mVk@cV2jn1BRxYL}^G14iV zUXIK-TXN5%DqHBI1)m8|(0le23{KMssQ==q-NvY9P;{eaQD_60*?3i>-E!Q8zQmDL)EP4h>u8R3*3&5{ z#HH1Y)E5Nil(&KwNLX{mZ(EITU!wIftTAoa$OoZVbu-_?+WorJ61^)VW`=O)4U$)7CRxpk{#6xzbySYsB87NIIMM~4*i;?tc`WyL_idu{`h3GGP<>++g^z> z->RawoG*#Y5U04zF5MU9OIu^1L;Kr1xE`5}^=<8^<%oy^^HU+0B=MIF4iPhZ@bnB@ z0m?^v>$d3X=q4;Y(z>5(*wLBwk7bV_W*X%sehtT6s<~$)HBpw9i9=V!Hfd5$E|1C}Ol@#Yjn87Ob3(^xyJo{q9pSNg zr1Lkg8->;Gi+#-WA+n6^WNvj0fwFoU-=dp4v3~Cz{Q_k?u;^f~7)FUQifDwn26D5N zn_sDc7h9q1Wcto5%WGNQGK(E3+XAIRe?mt}R;HBP??8gh^qq=sC?EJp$JRCtX-~>6 zgxRbdDu632t#Ga|*AzL8rfY_r7RGaxRIg79O`G4Oh0gDiUmEfGT_UO= zX7O~!-p-xvQlgBKCi6pUmPMTZDPD4#HCvmnj#6Z9czQ>4E=dO>woq&2^V_c0gHA{% zJC^gDhBM-pgLs8oqMOxe^CN7on-d~8g!@)ox)`rPgj7u~Rh0*G&7IIug zG{%v(>XnkyMY5-iM!X7Y`gDH6@4!>ACr000%Rsh$wYhAWK6f;<>hvH(y-yF?xWNc) z2vlJ`M`j~*bQ4qV#uk_Qm;S!7EETAgDKH;Tw?`pc*Wec35X26={sLBx(} zZ*6eQK-r4su5KAnUE`5NPaCAn=q~Cep&-V+X3QF|Sh}(S!+!^k2W*J7#+(_TCuJ-& zb+&iVOpw2i-_lM8BJI;?p4fq!cKV{bZ6lU2=%ca~QG60*j-*B=vnv8d#6TIV3_Qd2 z_6W`c*28?7#wuQQHaoUUNpbPit$75?IZ08FE{JYw?~GA9CS;Ai&iq1z4psNpLh1uzS9pid;6*-X%L$zWd3c3|&9qQ-T?HUmqHoE7LFX z^dibHpR@1xK6yA=z27IPoMk}fcaN4N@JZ269{5D_mkK@+r|52+c?+qa4lr#`MB8WIBA-)z8FhMN_Mg@X%@DgSI9)fj1L5wT8AXGec;;wnDVgU=-6@$TH=Pj8 z64xito|}bGjppeXtmDz@uf0SeOvNWdd@E-Js^AQ-=A1W5uAP3#7ruJx!fC?p2(G5b z{IdX%Z6M zbH}Q2&`O$;En9V2a(~aA?X=p-A>BE?pHp+onvEP9S=RTtCr;nArl*lZgUU)o7bK0J zbGqV9Xrf%_~#uXz!viuVNEGJ$>N1bpu2q?xgPy%}*+| zFyR;N+|=5Bt>}Mqtf|_L4UpKInq#e*Y_rU)1=Y~iot!KQH%*Z1@J=x3hHW~ay{NZnFm zT;<~`qhAcCd}%a1IdJnlMamP=q3Fl4EbnD6qBK%prp=ltm)Z9w6?Kgvd&93)35pm}vO$nZ9 zj^>kCPU>;)8O%Xf&Yf6}it`K!=AcFAPSH=Lh8b46t%EO=8>%s|`?R=L@+7%-B9uQZEaQ7CWe)LKm#Qi7u%7Dx(z&uL~S1(6!`9%aD zPv9b?s>nt90w7`)IL3ZPY>#MW-&JOUSJZ)L;cgU$jIeqJLBy&tb8&om`zKd^p2Z;bC`{ z3PLrkSrNg1t_iWYeH6QApez#UY=@o=Zo6kFX;T2_J2x8N%OmEOz`<&%3D_B;+iW7u zban_zK5XB1V{r*R#=kX&Lfh6xFyI@lE>I)1TBDn~ku#c%O-sUjzgFJwjBVaB8v>3d zPW!yB&F);c(anp#(ni^IHS;K>an$ZCa~I_(Hc3YlJL+SCqYLVk>}4W40)$yK{$lSw z*V7X=tqjXVv!m%&8|RikQHtj^e{Mw^`+cd4o-qAz9d&hIRbg{WD@m^X3U@o3?@xQ( z)LpIEeG?i_fAosD@eQDSK^%aTp&Qn=@zrT9bcD4NSE5yrFoU=gy^Hj^h7AD>Lhv&t zHHbt5le=>Ntyy{ga3!0%SedRaPXE28T`)bFMFTZ9=j<>MGh) zV~}Lq^?gZNThbp`WY3B8vh>eGTy4@#$0uQTmu;wlcx)rPhx`p`KokOguOaBzKuSN` zUY33s+T2OC3&BJ(Z-d&=L};h!DflA1E4H~Uw7O-r-0835<-FHa)6w1mg}LQwmpYX5 z>wHp2zkdnzBttdHnFL7}e5t}jVEPfZv{FaorO=+e&gu7TTp6n{GZvTywLn=1>~X?a zD86sN6%8|@N9XuVame#u9NyTv6^988hE10*UplidrY|{HIq@;^+zXl}_h(f|(vnjX zsAjB^w{7IPQaOE}o4Vq&QGdV1)l#OfQ9Il<8^Z(Tu1)&m_}~@}857nh`}uTCqyw=}BmTs7&*QE^id` z5;2!1lPM!R`&hq-Pu8!-Y^0oPV{VS~J#1|5<$w78=WggF;ZL-E0qEA z!2zH)5^IPBDylH+IT}(-mr2&je78kBZ1t6quH!XxC+FECaI5u_C(k~oZ`Oj~`|73j z^^tnIj2ir3+J?<>x;|XDp(@vc+)+u0YPr45z5+`(#knK|4TM!lQne#pI3N+hcc5G9 z(IKeGZcAIWoxRDqEUe?cWwXxgqMl00*i*eRy&cx0;<>u6hXQ}+V(Q1-h4pA9maXT` zebgph5EyCi>5jC-I$L^LVIN)}oYddhq|XVsH`Bs}(SzruV9xksFLuwqs&T(UZ^UCE zVqS8o#|B~l+;bYhl6kZ4!chp%)~I9XY#wN%>KxiQgf1qa=T5jBUDhFt=|^{Lb5DCu z7tKV-;4y#Pz6}yz|L1lxU8i#2f0;=ng85EF(fiYz=WM!^GdlZ>t2uA&&t9?4C5c(; z);W`QDV8~^*S^Gk)mAODrkT_0n#-N&%$4liX}j2wtDc=Zc}LV`XvDIJlRLrZrM8`W z_O(!*=l0?BYL-2Ineh(hzOlRmxl3X8d&gII%R%|hnHG&@M@9e6JqNyvlhdo@oZh$ zQ=1Sssp)nG5u836d5FwXJI_)EU!f5^nhJWh%%l(GJo#`2E?*@w8#%uYG$S=V8*$&f zPOqtFBk7ml87k{DCO-pxeWtW$tFmWF2VKrl#?yvaPiM(lanF*Te}{8Md6BaE)X&j4 zE~!O~+(dfxQ)3zRT&2dB0P9nOw2)^XR7c zsE={l#dVHBW;m*b?Julc>V*#xfV2MUi1&H)H6Stq&20y3t{YfY$bI?~?$2=tOFsfnOJ>=Qz-KR{FMDttn=PGYIz1mIX;dG{ zHXJ_JOo7Nt9T4F&{@EHz_9OSYeGuO=AGu$OtAs7UW6zcptG#GII=bnSn zz({*K1mK?YK$|%?zJxa@W-qZFzC->4ZR9S z)<{1vWZO|HytAY(%RpFnaot`<{G10C^Ra8&jFJqW^U34f*T!dE9-~I7E}Ro6nUA*2 zM^d@1ob&nbv?Jh0rzX=EyyvqLr`yr2ajoDvhyLb+&6$&il+1kIa9)zmu;0nTDbxAG zc}W;8B-`ev&2D>2HlJ1PzxQTW=?p$u%Up4K#k1PC&CE*z*;>X-63A5lq(Ek<|Cx}V zrk33d@{BSWQljauF{WyDNe`s1b2PK5QSfz!XF@A5T+&dUZMd9CL7YJ`t?6f=;l~UA z20l0Tn%^$XK4&=(l`|-9ZUf>B29iZKUT|<*!b(#r@pTk5$?1eq zrLQoW2lClOQSRh32_h<620@fN@oB`6%^Kdyce5H|#cg~$EtpQ_x-Po$^fKREri(DH zK`p{uSAopD70g_K1tGvl+-GaZxfddn`0}NYCcKynISMaddj4!>(Isq66J5Sk{Bo7E z;L4pM8f6Z8yic3-?f$t5t!lDWGR+spz9sPGY$km?*F4jrTZZpnT;1M>o>s7==lO;6 z9zpF?`HUc2_TJ?u?OnIwyEdreG0&LB3fbLR5N@Xg9x%kD2(K zN05yvQsCw7omb;t87G5gFp@|Q&SI-3r==E>X@MHLJ0h|M7us~Jh_&K7=dIDX(&fum z1LaH@rCQV4+@(tzs7)p26mou2Gbo38yQ6JgvG%sPQfB^C+r^k)vXxA>zH8|Qn9%I$ zo-@ylysm^H&G{k=X{c*cH(;1G!etZPb7d@()HQZddu-12S ztMgiT5Iu@?ZPFs9Rw-z#Wo0^))>kj$#I6h*%wM-grT*t+{hM4N7w@TqED zGOlzsyEBjZ*2DvP3?iPa#jf9caD?hQsGC3Mna2ON&1>7|i@s<^<$BogO=4*`jPT+P zCfgLx?DjGwAtBPy>VH<$J!#>6CU~W7pYWMf9KWC=Y`BpC2UGReyrLoz+o_V*wy*1K zoolwGyYU@ass6^tU?n*uvbNn$bFRs8b(cXGTZbDrm$$d{kQUoTrJ28z#>7xeSxnpI zHlt^Mea^DT8hzL@P_YI#^hY-~#5P14+M74ps&^pejpD87X=~|*=GVAQ!UI*Q@O5pi z^rBX(s}VcYwz)OdwMDmmn79pZ-5BcZZ0}qZ+}0TghAvxOk2`?aho}F6TD()goNVEy zLNdf%6$~!BY&9`>b#yZZg3j%c#-0tWu@-#rpjn{>rU;ykOFE)$m#tpb-nJ>W znNrb28v-@RB1SVz7GM*2vr)sDs0AzWhC8R!=x7=+O-2L3we1&mwYO>Z(JAi?#&~@! zYOTWHVk}Z~JE1n3k!^wU3#istbhdA$>`8Hhm}7KyMRg7uz-9`kJmE|QXU16}@^toD z+|>%PplAQKIZL@djwjgiWqN9XClkX1feY3&Z;R@_ZC6`WstB5?PKTf868IM2;*5E% zK;sZAVyRZPDs%jD#7}ROS)!9fYG^kaaK`$lc1=0xqLXxUYiAI>_z(F&GM*Zu&0>gq zV<%a!_+{dZQ_rr-pRR9bS`wO%)+yH-);IEg3k`V2on_6~me|v8g>yvr(ddi5-?jS|J(q%~uCn7y zn_r{Yjl-)h%tC?$$~H!uTU*;(unHy8^(e@x8Yc;@PgH8*5^nBlM19429odqm|KwUA z(OrVD;!H}TLw8v-L@}+rbYn?vo)X~?26ZB9V6^XOWM0!f8kw(Iw{}IKs=K|W@#1S~ zbff2*?siOO^~eD;rrn(_9or*a&6}c)En98xa?MyMnjIa{&be}uQm*c9?;%=x9^}w( zpbzHei9VmO)buM?N4tAE+tze%)CHMq3XLs1#|l(mz;+wgwx=j(91L<=00qM}<%)Iq zc&4g?C{vT(PCSFgDU%`{IM-5Wnl1Hh-D}&!(ca~;&FCoXSsuglGN`v}+YzeQ+iEY1 ztXtg>YHNXY26#q0+nQS&TVlv@Yy-cfBP@?*j1Vv=$eaA4_SY|({#BRhRp8V*=iHd9 zE?l-O676k?cEBnaEqDh#KII;tN{>&K$EVukQ{(Ze_4owJyj}sXmp79Y-bgvU7x0!Y z;6uxs)1Wt}L2tH#URpsf_kv#bRd{Jtc(YpJC12sCRq4%YrI$IC-h5Shi(TcVRpq5s z<*n;#?~B#m7puL+uJ#tF+MBN$FDGie1*-9Bm0nu4-mKPovs&xTYM{(pMS(JJ&H`oL zG6l-K8437y2X9sa0iV1CeCYW!+JH|J4fwRtK+wy(K+q?RaxdEh<=*xXsPJ+*P~lTH zpPmq?@JYAQhX<8Dysz@fpHCYL_*8kI)?07EGB00(0dF~i0dKm&fX}-=ybt>DFIeG2 z&!?vceR^!L$|qf)4jQcXw&$Qvw+hzy@WrRE1#7(Z7WC#f|U|Camo-*TV6S|0H7rQD|vmY4g)EBEHPywY3Vavxb+UghO;xsS9h z_Yt?{K6PGR?d55CwNL(h1ao6=mMMRQSl<3Lm*!5%jjJ3g1EB%hQUWPrBt^*;!HUlSY-dT~+w-xx%M!Rr-{- z(r1jStnlW!vcj9^N*|eB>8pl#+e@X746F1}J1VRE-u1SPN}n;Hvf3w}PkXNPX={}} zGN;mKtf=&9la;mJzFOtO`zjwzwaTX*RQa@ns&a4Hs(i-jDxWdA%4hto@)=jFeDudE zpY~VfBZsPdw6`iBnO*H8pS?Z7+Yh`P_7T=TW3~^={U!%q0pcU~1Kuv-GZOd+ilA5K z`>0($Ey1TDc)N#}xVNcz%jXp#xe2ORtX)CC{8Nr(6bT0&XtB2VlLb zw*e+5VFDAge7)w(OUinWAyAPDU*{X4d~2*N3xO)U?|!eL^6FJRt*xGxWf%|!qqEqCJN^XT@f;xCvwH29N|cpYL#W4D5_H1OxThdTfnh3wc?4XEbtI z6o)A7`ngPMGz0r|Xbm^P)zM9wsL|jn+WgvPHTl}n*GdxUEu&u3PWQGmWZ03?T(ARt z+JFR2Q-ubBR6V(AXRaT~t*cdvU%-=9JHRKac2EX>+syJ!$EWQHx!IK5-9qhrxzg~D zl9@>khrQy#4l2X`VXVcF8&1OBckG~y?-(7zoz=_irO;aaO*8H2)BZa5-JFk{kn~@> zcK%2$n-@}LyuT;+vr)m=rX_zi!x?tUK3mI0?k*D1Je*F-yGSBgUr2aws&<$w{rF9fU?aIoK;!desxrj;o3L2Insdx zH=fu5_+PeKpZ{bc*oe7obwo1Erw{_cF5{6he&J=g#A?8c-7qGy99t4wBAe;Ow*_Z- z5GYiRn+EyKT#p0kH`K9z$2f3|1IIXUj049wkeLGy|LynxTBuas0z@go?9D4k>o@4RAQhb+ z`pidM4A9-Pq08|~r>D->bUuc>^FKW2IkAy1p+{w=f0|xoOSBcIR`}Un-dmSydT*6X z(X&mO33&3ixuwN8jgX$dM?;$4gBS4Iik@Bcw72sY7c^<5QGC+r4G(I1uYZG%U_aXg z(rL?uPj;}UekbnK^gcrk1OMpRRUg{h`5TF}Z@8)@vNhVhg^u!i=w16|P48}b!+y32 zc=OlOb}c>ufmzf|?TD0K-m<$iy@M~%6zDmfhE1DXYRCIgmPlmz(zQ#C5WD@Bh+o<> zwPRv|B!lAUMgjq8$**hKK0y*@T{rKGaAydw{3dVPj4Ht8AOoGI$J#G6Q@p?=lH zq2=}V7&M{js1A8Uo*!-1&(w}hS|3aSt?<8hyI<0?ombn>1~0t1@2)a*7V3CwH^&&|4$aFVQ_f;6N}Uoo~dn6nv;KC zq$W_%TbCcF>JDpp(g=V0_a^w$??u2gzI>Q{{r^nX9jE^26LbpvD4pV!-#SomdhKuS zz30$Rdrx^;_37~A3P0g^rSN;B{S24>oq%5xe)KNoRlPlgCikYibM!p<9DM%LiI3vW zSz&Xg>zoy2@1U8!dhz4eG9w)1h(7Vlp$--!TpxmVEkek;v2c9HLBx0j zcmf#i%fi-=lh5FMRq_qkg0%*&J96a6A>v@1p%uERf5%O#c;FpGJ6`w`A{1W~jvp6C zB5@>QjUV}*HPD-SjUZk-M4QUt#L7L^kHS`H(CXP4wpLDtig(h7Q#QXlaQq?g%zoNkw(bun5|jTtawKde)W6`wwPPg~=_huq zL(JgmfGkWIb^i~>=@@T%jeyV_rb8fja_sKivIrhsQ&= za`t!JioBmnRS~+CGLBwm*G=eF%5vz|LqDck8AE7dl$%{*AJbbvQaR1wl$LR@-UO5rA9!5r|kO5Rd5>B%IB?z$w zChhE@;y5_IkAl$!C?t9Q$q+|GL<^b3Xdh)Ov2T){-IU3|H{z2?`iUKD^dLVCuwxBO=qGlpfk*TcImLG`>i=b4|6jqg(f!C~@y?~Fm~ec6 z9>B6i#1C{`=1!tSKd}SBte><~UjlZF;H5+BT?8gMtpq!0i~5NjD>0>?*y+D74+IWt zA9gU3=mgl&#E~&d0~ssj9E~T{x`kBVdnsikOj#!kuQK9q|0p>az^_1RNzo~M)F`wKOS2TQJeAYGs7f3hi@DE!jLD4CTQk4X5E5Qa>S zuN(u00ET2GLCg|%5ot?bqtyG)yB}{sdm|ASju-AD8l)uFFJkpjx6ARun<*Cl*{b1w zRt>ef>QxOlgY==d6UF}XuF~{hNl)?fuEbMv{pyq|7#70eL}-8f#Ix~)-ejHlIsoL` zqvD;&nSQW|mAjGTD_%&-9sZ^3cYTyxqVPX&W|jQ+h})Z za6xwL1(%NJQiS%7tF45_L;K-CX}uL4Ngdiie(}OeuM5H8K{A!XfMxG9FRuUnU$IF_hPNZZ*`_cURkP+t4 zQ1b8z%po^_`k(9obFSaR%t7XeIXN+AkkaTs?*n)fjG-a?KJQGYOmGvDZc`iA%#Ok&kuf9Qk%2blcfs#G6*P{MYFZZR_rHiI`_ zHd|n)m(6>ViQ^ZkA(_uk(Z~XQkTRA??4_a6O6cKzU_TF(1N;ZOxK~yP-5=MjVgD8XGS~m!H5bhA%p|G{P7jKLYbmOls6CtNe z^uT4JSk7dKV{@4(+*79YI>EgduF%t0LWbgJVQ7o*!0@(X4DJ}*gK!V(3EKp+yo9oR zlFl+=ypco}lgR26+$p$+;U0!NIUahHGrQwaXTtURL^=T2{ z*FQ*7gk<{z42`iUIfP4<$9w7J`;lyPo<@EYT&yVoqSyF)A@A)8j%qu+mnuvNruk+~@ zMM#Q8@NB@$6i)J6|3#8wA)s_cf+Q&}g!>HtMZa8u_7NT*=!G9OmGOZxARhEc5kM~_ zMzOT0A&{uR-{kuiQ00$O7LxA-K16CNvN!nwbd&{uBoR=AFiDpniGWi+p&<1q|ooaOz9lIcJ1QM?GDcqNgE7d}j6SZghd_kfa~oM;Ul z^f0E=iNaOz!T|HpuTy_J zko*M#th^8s=Udc|qy$1Q z%=tlHA4VAM_2@+qCp{mu3dwTx4r0i z=5R=Ip&`N2sv*Hcc|(GCEE*EG)e&{z$c;tyi7W8J=AKe1!oKE_X9V8{9bEgv<+*{L57p|2?g7tNSmUQVy? z|Hk45>kE${CWQ9{916ut>=S1ngeNH+(wdz306jHWqa?-}u(A$kW&C^uD=H>tK{^&a z)m!86Sj7JOXxMCsv$HZ@)nJv?k1s#Hl+vs3e{e~Ib$clyAQy|_kS|gqAG|_7pid)M zgSC&ii7p9bK5XQ#Bw4W zT|o9h0m%p9BXCf_z4R29Csz3y;_R%9zX-7oaxB&s;jf>50RIX0=UFRMg-7tTGJf1j z>-hTdWu=r{eg6aC@@+|?KF&if`64R$fYPLX|1dkdr`VI%sIfb#sF7ob3C_y6YS6yw)?dT@_cbAi#zK%{M~}{UqR|=TXjn#u*wLdi zp6WP^XQp@x<7uV!Py_Zpfx^(=xHUeEx0|TpLD^$xpb<{8@*gCOBxGO)sv9f(gn>K`TK=-KqZdUg}hb0*#7&3ZP0v_{3Pk`vJ|KWY0@$7$58Xux_wTsN(OvIi-F3fH(9m71yWXXB*SOxz zE2MQz^r0F`Yy028pn(cN8PVB0o**AuoZ-E-1MlVid#ExbQQyAw9ZRoV`X5UpS3bZ> zX)i@hbmK23b6kMm;Ujxss@>$zHRdYT>%`m)l4X<$?9x)4GQ=_0$DQ%(mg5RApwsx} z9uMsC?WZrw9{$8%ktz54=J?P{1^@d_;APFF}(oMSyF7;H48(_+kpsD^Q3=Oa=KeIFP0_{4}ba^ARh| zkw@!vEd7KXC5#EV@6^rg}x9&k7|{@`SNl_g zqs{=Q-uiokb!A@zCZ`QpiNiS3fWtuJOG`PG{`GlhnQc}LGw@DdHZt zmT>?5XwJKJ7uOCBTWN~ySi9@=6FWGh#ZUX#vGz6UCw8oT>-7^k#dp8ZK98W+J}g$k zig%s^PJwN@*<(5!Upa_wHw2e@C3+|Qc)j8gVz=IkwO3J^I03!Ng|4EX*l{0f((4ty zI-DKWF`#GIJ0SY(guN_mpO3JQNf4K`P6s*RS$5}BPGhE;QG9o>|F?Pl|58vBCg@$g zdE=D!Ap6ns02bk`m8f|9td*#I`qeK&{4px6Fh`<8=+F@$oE(bN=^5re^W;b z#}UWcMJi@^{Jkml^1XZDL;u3p-#<)_-e*G1Xnu^Aq_~rO^B-A`aGH7`T+E@O?9=J1 zUL>1bod?A!KA`ia&#c7tOdx$BO!p)`Sn}wTWnHen7Q4Uq_dRvwnftNUScuFXI+b$l zBoyY%jFOXV?<`P4>xk#+_#iqS&2BqPr!EwQ?9~44a*Y-T|lC z;Z2g)Ap2j1OijV!eR2m3eWFfL}Ad(_GB#P_50-IDAC}+B?!!00W*fNcMR@9xY#*;3Q@r<-DRw2t?xo|P%mn*9!efW z=`dn)r?Rk#8s7mqz5{X`Kbc&?o$*F0-rs}XMt$U~_#H{^qB_&-=Q6)sH&lFg=!5-} zc@hr|i+Z?qU-IYA9yx-Y5j@xxL3EP0{cfS!#oi7lK@^~)X>)k;70YKQxxBjpA;ihHw?_bg2@Qi@2$J8vSM zCib=S8@%p@B=+m~+40xkMUCHHa$ta7RmtzR@)$rwL4e2D@qxn>LLu)rIGVC!@22Vb%abSSRs^qI(`5h+W<^r8) z&3b|EJ{ne^f_&Jk^S};{YU(F)22UCvsDaCc)w?+arIik>=a`EikCWj%NUDLw%nj|x zDNihVvS-~A3g;KJ;~eu{!r_-L4!`BnQe>tCaf$~-DWV6xFVV=GG}gcg@Zt3146!VO z*AJaeti`$=M-ML!TMt3Uh3e6`xcJ`Me`-P%j8$4uTiTKuu>c`A_6$aNtaM?Bc)0_Z}|3 zcOOaSv&+%KNb%0M z=sKVWWSPVc`Ug9fd~V=Y0rV(NYb%GAx?UwwhgaFLcej1ie{)#G{nZDWp z{4q4pN&qby($s$?h64OZSBwTy2cmN}xQ|ARz=giz^{(+b{qKw3F z1f$p+4HURoPV zcDUl%P44)|uptF$KW-%+!%NA3J$B@X@A*)=LlxuRA}%gF*Pr*BcG?za|4F=De8b~Z zFM2NsRmvSXapFB^k#?e$W#^1n8PRdnVtL|*Wgp<@m2O07q?nl$7da$Gy2~R}r4}#9 zVN5zvf;>@ssVios(IHfp3bM`%VNND&=CZ2Xm36DELF+ z8!7y4(4H_@9E3-_@Ub@ev^nu0_*A~X8#&P797o(9-t@gK_i9Iqg7nEx>4&swI5Mz%~+!M zA$lL84RYI-zG3ztdIt@b9oCFns3=nW!53f+`1|q{zJ6R6lh1aesevOScsqGNW_aO5 z;o38aZ~C*7>ksItq$_a;rTTUJf=iPtgS5jSe1~(&vq)}20*?vDbo?g@Wh~GQN#aY!GK7-aq zhd^KFoKQ0Pax|M?b86fQY!XxOPbYg_7P5m5SwhJV5!oBOWRJsFMK;+(t={l6Fd=lp z8#tWLWZjFVrjl2`hRUVe8}*-zxOGy?C|1Ud`?kN6Rw2t?om*f)@zaS@Vd5yjpDWIMqg=^gS!3jd}K zZvy4OGs$Z<5OPWlObzzE7Lypr!hR9At&tK&C0@iP>dB2a$Y(m9sU1lAh_ zd<#qwh`?^z6xps}%31PaqWF<~E--nd z7x+vHf1JXxA_yYS^nF$FwEBcR$1fZo9E4~1$T!25Mu}0SnR5bOx0y3Vl0k3MNf!1| zECknpaPk`TGZ%Blbo?@-Y?Om=JdBm6Ax`m(hr&l50s)E>wtkenGM&NKX&Oti(}<5! z1R`()KHjtWLzzpSNfftHS#_Dx`SSt_A4j+=>xC=?Wn;nUtr#jtOF1c$!-SHbL$PfR zeV3$%-aW@uRu{Gto%~NE{ct?;4^VF~!Y7#mFFyR^bu_$_a>P5Sj{rj=%wq9jG1HXq zVRtX0ob^4*l~Y0?@qOeKw(d{9@2AG%0}aBGc|;)^$)BKeV6gzu<|Abn3kUd1Vv<%j zled7#p&is_5~CEH&eeBOIN23&TAhsFXQuq@R%Z>;$|5+F{2&P;oRtT`uys8xGR6xZ z*hC7#5v%a40J{=2wuH6S~_bW+tL(67Ib|m(( zt{2x1b|-b1*8KL>=_huq|3}{2fZ179ci$5rFhRo^Y?WBGj1)D9%0xkfsWQw0r#&bs&BYp=cc+TUxhy|y18R8s{(TL-cS5lYjF zDfg9*Q~}b(wiOdjbP2O#j@$(kxmgr zmgZx?P7$^a;q0^$NK|Q>eXMfq)(9(|9#%cgyNrfaT|AsIfqYiBIkkTF2gD7;rLqn= zGf-Pf7k3d|{S#3QeKhT-EoTObLrw*%Nvy>VD@@GAzOdoCBM_e7rfRnq(JT*&;;xIU zXSZMcG`2f8P8EN3w8Yr=a$vCU(EE4`;UDt|_&e_JRr6FdHE~JX{ODu8kZjjptv|f) zZEC-;rFu>W2(b5f7X<5K1fsq~mm)Y;8@yX<%ewOAEDjihPN%e@lC4mi3}-_u4kp`o zhsxWf;!xI=EZv*hahozD;o0`x8b(n1?71eq1tj{;P`Lhk5|}mfr+9y-GC$f$M9A;6 zJTM?{r99io!DRUH^^4LJ7k^fl#FM4(*}X^<3FZv=_Ao{yOKz^xbHDt7ke^<<#Q%a=u{~f2qD{wXJaE*`0-AK&ZeGx7Cs?M|8Ind%Cdq z!6k+2QMmcuai6rS<@5ofxxCaD6H9|yNU6-Q#dx9H(nt&K0&;akE)<#kLbczk<}_R= zRR@)^S)s5HaLnK?1AYgdusJ+k8*82~64}TwX{taY>-l00^2f%g0r~6XN24`r7dB{* z*))Vog}ZF3)uNAXL&adfV)>||IDI~lflDmxjLx19{@!%v2}szS#0uyAS% z@66VJtkB3$SZ7_jRNy{mEsS*rd}+u8zEYm9Ifkp-T?NB56|#nLxzweSr#I>4i2Ds9 zZuW>wh41u>uXS^aI>c6Ta!MD_8=nYuVvdVfP@CIi-= zW0O4p>8jHc(`bG6sYdYPl*k^I^9&Z=;$M#Nmb+DTbbYD`DC-S5e-b&b4YI=WEF7IH z?XcxmNzHbD?>|D4!?t(&Ua*6>Y>kd%z1q~slL3XKNndG6Kc$|uK9$oqESS@w=P0L7 zuA}R7ft-HLw`WSJrKN@oIUucVU!pn~ny zmv&nxxY-|<#FMoS8<6~xQ@ra`)d7j3wuR5V+73t}f%U>g;R^u6X%Q}qt&Yftv|S#$ zpy8eR0m+`GJasB2=k88mxw{NR1-W=T(-&?lJ=_5O-CQP&pD2lJTllYY8}mD-q$X|q z6Z3067*^8LGR&zlXdldW)??HRN zj=sfnYJfq+T@D7U{wuB(QH{zG17$;r;JJm$ibC~0j5e1tcc06Oh*eS58&0J(B-GRf zQK~65=$^v{q75QH?0KZKFeI>+ZhD1z)?Ef3$s|a2mgQx6q@%GYN{;FmcBF=}57JSU z6vyrSV+pFImg@ zfXGK%?SqUs=@>JsjuFSTeMBmkj>N}8`|LBD3w6X_925Ryayw7;32I8Q<3U%l_@yV< zpltgE?n>IWA>Q0dFNXTQ=@E?F9M-x`myxs6CFzxMISUYS->?h>zP&`;=2mcZM8QY| z6cQHSL2DIz(o$Q#lK~axtBoUj2X;WprTa2!$(S(v%qJZ-!|_mS80F9K@mq+kW9NPU zM7pbO%=ek2QwBZ|{nry1iSv-W!p|5}37*b^k!|sf*SIr!RDdzZTrOfy2F$ZEu*vp2 z@m{29FH1VJhvA^1=&`0}exk$fJJWQ~Sm09yys;^PZO-%X^;b3$*>70PIcLJrripRI zaQ(I_!Cw+*jSa>WexJ(&yGQGh`-(ZvAg0{+Tq%r6!_HW#>ozi zZWIvy`gW_6;WV@K9}BLID40g4kkJ42mPTjUN(NMlrbhSiE*1R?88vKGfzoF_Df7ZL zP;20z^hlVHh1lBY-lKHyAbg^98NqSYt5jL_ex6j)Rj)$JCHeH(Z^rEvaGPnqv3jm& z6c_H`3}~_6R6oDAMbwoUHN@N$psysKtbYCzY7O<% zX)H9v*82Ij(tVbPYoio?y~OHL13?%eklx5=Dr3_=)bv~o_s#~~3b-1&74H`l+CcY0 z)$iM-f(C8SO`Ye@mb1;R-=AQAs}{ti6yyQN*zLk7!b4MSYpl<3tiy zxMsdC!E+3^C1vkSLqVr^TDdU&mJBS>%$^w$)ZL?s#?J!|sgV+G_kJ z?RJxuDbo4CgI3nzH1B@@sj~Or-t-LE%$$+w9(pg0ZFh>v0!ZI@x!f%3j6?+(jxm#H zM1;HNRf&FNX7GFA2|bNNY|8SkAF7L9pVIELPqjJ8VwnhxkFuIkxig%+wvobqLt&79 zKE>L@6qHrt6(@;Be_N-iPiW?^Yv9yzI=4Bso<7sO_|{tJ3^Jbv zq=SqyS~klUefHZr$TX(#5=-Gz^%V4(reK3iJ(*+6$tRVJ8O$k~&hAmUf$?%lzJ2zq zmR^gd!(EiFH+RiZC}Cn@_} zYt5F3zhqEp?mTgP2t9=N<*&2#+$%+GgnBq zkFFSJ1RBC;kdE|+7FU6&4^}q}g->--*8IneZGHKVspV+cj2-(RMyZf5;?_}tsHuGU z;Y!a9;j^%;rtP(8g}?tdRY58+O*pET)z~xW_pwI6+2uIB(MMuM$qXfQkE4{X@=b)( zL>a{#9=_utsmL@+CIt!!%_Ulf#bj_;FMoDoJPv1 zanq%YTB=jHQEH6Y(Z+lYKKREZy9c2!nAp3oO+*8P?V->NN%CpcsB3Nm#OtJCo>bNr4B zUvhPyvy}0yHN=A(B(n^ZO%z__6xv%T&?cgBiFDQzhMLs6`7Cc%mWllJ%vov4!#^vF zooaDj)D|v;F@sRK`n3tfmDLH7;ZtJ+i*X>yG-BQKCe-P zt2Nu_`|<}wV=jFB2E_Qy_a_U9N!O=neB(5}sf(+xY`=KN4|Qhxg;+ZC$jN{u}AH6aNGL?qC7( zX!4=skfURMYsAs_qxswYKcI}Ck7XQt6lK+Yg-7Ct#@mI$|M)Qe!qxIo@H*fj`U`fl zss61|P>T*%B3f1MrRn5$zRem?=HGXGdBcI+o~;Lp4|lpgMQ%_2KyiLaZs#8f-yBPG zwm^2rv2G}?k+#X7Et#4+t^Zs`1{XR%O|OwucUfCrwX0V-BDcAcdJrq1IH@&cKGkVA zJ*Dox72V~nXm#foq#w_t89C-B@&}A^V_s7}yiBP|ALJ79$-KtMcA)sH3vwlyy0d^+ zTEKlZ&JZIXPKpO|)|v5bt9=q2XUj=$*VK)VGJ7UZrzXj#HGRk*F%6A#%rXqdk z&?0@OFaMq2t4Mcb3EvSDzN20w^KlNoHS6LOGM_6wH_pnx4g03Dw5DQOQl_7G551yklc)*B-Rw z+S6+V|A>u#r%V>otC?5JYCpm zA$-XE_9*hRCCyJ2s#$)RxGZ5^v8PEg$t}&5x(zkUVIiF!{-oL8at?vG>xPLF9RyAup?cs+k?JpZxdH`_K8t8^iEos|^SMsn*au>hh zFNew7xnM@Fd0JIVi*rBaraGY9gvWg^?yPGj&a67-;vuE)SNM_AE*G;>16b+H98q+; z(!;t0P`NhXCzza3sR-iUEU zP!mwEvjX|;&qsa#CeDey5buR}8CZr7B8UjvfJv0lCvL6H@{&#KC4ySelt1*>ejrE#fnGf!cy&l{LNAw$lshA0NZ8_nQA`;sxb=_ z;Uo&34n&lz>5kVblX2#D{+pPE7J7zZY-#|{aswFE0LTQoO1suy9!(Gv>2f~FyAUytb z@zqySzUcNIp(mLBIQx-3Tki|cZpOEmi$M2kU9{h7m*LAN2De=C7~+t=s*3ib)?w{O zxeagq`$OALCsGM2yv=%nnUi17IYb){=tcSfXrRe9UhXR^QbSMiTA1k?XF9^mmCt7-ymD58aOssS`>BEHMDj&(O8Vs6+zqZ^w`I zI1 zXLE+8j;~6#sXc@?40+5+L0>Z+UKo_%qi|q9f$RW*B|m-qOji^856 zR)iaFq{G};e7Gx)Zv3j=n_QE1sL4LG$B-QLJwmY>l#J?&(l`Fm5GQ=5k^^7BV zK(UaZI~w1ztRTO$jd6I}6IJr~!ljv&3s09mPNES26 z{Dz|x_(=ji8z0INCMySK3Q3%3{aqUApvsWyAO#OUU1rG-i3x6tJX|lYhK(-cW498y z4h6E>pI8peqcszkDf}r47Y8m{dV=0N#460Ltyy-^mr2ZEID9B8N#jGWGV&(Ri1}jp zSYChZ8QI2nI*v;=6`r7k21FDMbuj^D9otk!ZtR~W{Ho?eXDzj8NL9?=tQ4N?iEdFK zYj$~kmTp4uCce`|6*v5ih<19S@@P$zqy2+soX{r%5Sx!JcHE|3ZBu|ME+p61?X~F) z#I7SoVZ+aIUwJLs0+s32xf`b|-z)xfajXw&&DrJ#=dcs4oD95=-`uWITPiO8u&rbL zl0>@7Z+Np{=?^h#M1$)kPSzSzJ65B3a*1%*!py!GHxkF?s>bKlOid6J4G@IQcmxCN z58Wl;cMyYN!EUo>8$R_3B|YK9Ci<(fuTcAI6{}jZau-)J zzK+A%#sYOT6=is-T5eb> z&_+mxZ&QgB$O(=aaO-bj-!)bsVS%vT(%%=RK2CwY&PWmq)S@uLLpI&HfeGHXGBcjJ zuY8aFf;1rM!GlJ^U+%dZk_FuB;L(zSMR4O58gg6ZA;=1^I;KdKUy=1*LrX=AE6F~2 z_vNsAMvMEY_39{(vDG&w{R@ha3Tb=+T>Xvr!q-;5PE@sW*LUwG58-<1Qk*b?(MYaa z{`%5i!;~-61sW^$X*JN37rh5SDOCCSzV_7!ehaz$omumhEqs>4h#N6&-OD$sYa6sA zwiPvgX5A2o5$g@Zz~P?Ccd&+yCL23_dyg+1XBm^?n-rMMU`ROX<0^Kv8}2qlVD+)e z=wobv^X6FXia80NBLB5H>L6{Y^`OF62>Nb4=;yf(u-usFhi@e8tM#x#aoaMESN+s9 zrmY*ix3?FHycA5rtES^3rbNp+RAqL=>@=1~Ha0{aTm(D;N*+_e5&@ zH7vSc$all~tb4`y>I&Jb-(auwaMrY8o^vY=uPXT= z)+zkOH$~&dyXpBz3@0EJr(x1ok(eVjZ@ePfYvr(sHY?jUFB|LF!yZg*QQ6|AKBB9K z($@}uFrhe9oCAN35IffKdGz!NncKsEon&??)cl+J!<=Ruf0eK@a*fflrC@PP4h3yu zSDH({t))X0Ci%QSS-Kev7UJsYy;=W~t3ex1g-G*nh+Gz{3h3eynEXqEdnGs*S`L6o?&2!t?{xCB9A$K{sNqR13 zG`~f-_%=rzu^hda_r<-MB9w#W4@f^vJoExcs1UuSHjq1LvTUH8qzs1$Ck(iZ}3ULMcn70Z&=4mK24e%Abb(O55qHN7?$mQc`S!y-BO5gvr0KDcpRD<69)u z_)qszdYZkIiGPK7T8=j=I5}gFtP)1S;ZOb->ccMGj9Vs`M@y{2)jwq>ag%d5a|5lu zKT3VS^5)Fki=+LzAH9Kj5;9yXY8fh(WT$fTB+t!e`Do`?4+{H;nC5EJI;aY_nhtpy z$C5;e@^2f?}J*P9qrJaMU4tI&q*6_NQ)}A z2afEzxvrWgCG|NH==aFVERlOH@`!ozqO6DQHV|zd3>e?4@s@fr>|vu0#vM!vOdiIr z`N)t$t4@b^f>@UMa=f3faPLO0_9vw-7H4E`&QMDV!4+^#mVU% zGS947V|x4&?edHJ7z??KP<{Ln&Cc)VH1PXa$|ZaoM8Pv!M2Y*(Gp-R@ae|f_cfkHs z3AbM@5%;XVxKMeaiNLCtF%O*n!ouWBltFm@T$>tDPpXdi;wHYQ>#MzLbZN<7wjvJb zvTHb+N=_#Rc{EN8kNdh!4D!w7-}>k~Lz_ouh~N6? z+kmGMRZEHjXXH;$n0l;r42`}PyQJ6zd%LmGcZH{JKE-jm#bo$1_fm|irAL2UZy8#r z3|)yZB#yCT)_1u#3u^fHDrI8c7mhLmoAmAGz@x$ODdT}FE;R{yi8$k70@d}M#d{Y= zQABrn4mJyQb{k>vBan+_m~BelguKvGADJG+tgUB#W>7t}#bTB!)cCW;7yUFZrZ~NM6%t zcwHG2lhT|qF_9N#(t3&pZ6H1%lD_v7pA&Jx25rbosD%<$VXn9!YF=4sZQJFxNw&a8 zCXC8@hLI?RL0(*y%vgIR{@mU`KU~#9XtMM^epT7UF@0ryNe=5vwp_~klDw@i>BIU` zY)D>6?T3=Z7vCio=ulF3DJQ}y6=TWr29~sI%3zIQEYYrM!){_|Ni|F^wY(a}J%xK5 z_Z04NzNdlwEnHlQD&nzBddn(3l3{N!nZL(Mx&5AOVRnx#%x1HJB7cu9%o>sV3^D3^;t(UO=!f)Nn;V8JTGH7&PGKj8(VE5g5+OBApm8cl$r9XdG55*jv(Kodr=wb6u^LNkObbtMz@7UD zWkvEN8n5HqE~vHY8`EnLCFu?Thi2jWURHQI*7Jvd7tjZG{Kogip7%E5{1*5xeFXeR zaXaPB96cxSwy9PcOo zJa@b=eMFv4{_&-yrxuF2fB<%ZM6r~H9YE$m2EQ|i(Y#RG&WGD;Aai#W4x99S zw)f}G!dHu8guN%g8qHS)`@$`kt6N7QL!2MmL2ENc*~U8L{@%1WAeoLuD+xu510Nfx zafN9J)n-&54Og1G2&p78)e(jjE(>=yx|!S??h0RT^KptiK>>X?c79W&9wK2$L`pRp}w}Nz1^_mUU^E2Wo@C- zUUSW_%ZSoeJCaP-VqJCMW0PvK^!#sFU5zuJYL1*&_X_QL8`X)OT8<9o139~?^ zZrhHF?q|T~I$WCa=(d^#d1%@I!g_ZZa7&ehY2o9KPtKxPII zMvQOvO-Mn=)d2%Mo8>M8$kW_qfDIw8$DV3AEEq^0Zfb0ZC z4)Q!`#G=_p7mvgjE>i1{(FmlS9gGtxJwb^Cwm1O;%{EARZ_&dH_z6nceGF8Res>wb z_MdWuBwXOgRJ7xkx=I3lR*rIe?PR*LweNX+E6Fb{o;8*5ls|*TrxU)zs^}mJ)VW<3 z`;hHi_TA53iytfjpmH`dm2Vo_V20I%&4^Wl_J0WF5e z7kaTc-YRg-{)XDRQRP8c1IX>P8)ns#9Msk}BYlXhmNBXvPj`kuOlv4cTJMnzaJKF) z1F2lvr!lV~pH344%@)Zy<5Dg-;}SSBwVO2Po&tS|@?LJ|UJp%s?@x~|-h1MX+s9#C zclmoT+G~Ji*`&XSjEtE>Wq)8DxSKOc4wHL0Oy-X{5jeU!JMv<`{4vNg1e5{Uv5*|T z#aZxJi1ldF3rfxJ#aUd?8RL7#8PBJHjP*9oPb2a{r>ps>C`PB)qEa|A&vabcrcb0L zfWAbTqE%LwWUY?wo7;7q>57!R%)b7ZH1!DPCAGSCD&nj9wpRDT4?Vh8H>mkz($0mw z_4*TP6_?GWBDyHlGevAhg<+d?97H9lsCQi-BR-%avETw^V}u-())p2mkG;ipNIYDK zz{ZG8L`qv=BrtC2H@{Hbe8%NRUETt1@{CVKRQ#DyUOo^B+N*NJYC_;hKON^l$~^`8 z5|yK=1)jCz_TH8j=!fm}U5KjhGDj`vla|#b;7^|6T4^p*WkBho+g%3ywR2{y0-jAx z^gPlhY5|b(Q4X~la9Ot+@W*Iz^~y7q^+l1N@v)moDIX(&^-jRRBiXQxJ=w80djebB zWq`6MN64`R=*fmsTIrqweTm9Z=i_6G_vUuoKHJL2Q4Qd{ED9h*hQyBEbkdSzun>%hjxP9mjzj09#$4AvX) zyB@fLJW+1)FayrVdG|5UWONs75r>Zkj*M25OUv9-pf6E57#%J~X*JGC9Qo#Uor9Z* zL8yKxrMZNZ7&SCHEa%fKirMJ!8?wav1frdHh1k2}0J0PnKIaC|Y9s|^dyA1F)o4XuXZL|?7t&K=v)>2FiP#f+t z5Ea%Damq8+hKEZR9saj@0tRp?N4$$6Ky4UGX`ai$cnb6-Do4FlGe0dfIusODSti;^q z!1y>zq?C`5z!pa`z)H+r1{iGIWx)AZb{_+*#N1_oF;_W4Ek}Trn8H|hyQe^3qH@&v z$mp;TA7@wuz{hDo9A)K0@n;2~@2+63!~iw!E(2)fxJ#gkk9U(kgr)!)ALUSA@}d~v zl-gYeP)c)`1LNa3ky1WJ0&R|DfZI6kGC=comjUPFGWRjSc;GGrtZ0=ZMnQoijSu8+ z)I9}Q(ehj8-)%K-W*?s8y!93oQ6$4H>xkqn>_?Jff}Z+97R zKJIoO1DsvD%K+HQ5$jHYBcoZ`(x7_^u2Zn_AoY&MWMdgk7Az_x#(+qg*uuJzHC6KfiFw&kMzej?z$t$3g<4)5lEc(2LNa zjL_k~RX{X&sTkKPAo|3XM-)2DGrfif24Sd)gN&b10@NZP`T~S%-P&C(EFij4;ioIy zr7)AKp9U+gMKk7iR4(}s#s_c?5h9s&p^;}8D@~45UAgzZqbe(Nd&cBhJjh*#XF`%I zujb~u!<91Bkh((`Em#|$BNtT`*;{96$o!jfS3J7`bN=Gom9oy4hKDy5$B%7{d^%Z7 z1Ls$_M1EOI9ZV4t+n z{@%wwix9fS-eD#`c2>vZOMAD=Z0or_NZ#a8O%x}WvpHI(PZt8<(smw~fr@DtaVbcW z{!s+r)RvCZxF8(&jd}vAx|VC-w-@$4bR-=e8Q93I_}+9;G*^wzI?5d41NKoc?La2qQ+4*J2!~J9Myp2a_|iI;6g@He7kxp%bth7pw`nc`Buxw`5rX z=|gh`Z$;e#l{pyfG8hM*BNM=+htYB5bFgY9jY#b`_mNk7Gch`u-tlH5?h+cS`=)o} znicv^T}0J;Uzi9t6*;^=#fRf2k~A1K8gEE*e3NBWIe)7b<%&P^(b>sNhFg2pPUs9t z)P0V61+I?CrqW8yiG~{@q4Usc5Vojo`+c`z`qC`lGt}X1p}2hp4w`5rw{tORjjp8F zCWvjbqP~aI3zU=2DxC7LxOsKqz^{lKT*llR*8+6P6jU<94+K6)<~yY4KUs^~IiD$AskE&GuPb%yZ;NhU zTUqbRm_p(Lwj|yt(TV@oDU$3o_C{f2Pd{8JBTwrkuOxtU%4C7Mu+i9E_|_HZDlZ$u zOnt4TGNfJ-#g(S45!*^wO>gpPKYfTVwLhDlFcUXF9^r9naNxA zE9|MU)qOTb%W|rH|k#sYI22+4Q*v>$_`ljbWd<{B($>X)I^<8Z^4T7xvOO%6y~qdtpEBK_K$k z3x|Lx{eHhtxo|f_UAIyDL8bJke1ua;kCv&pv^i@{;i;Eself(ffpMkf85aw4@oVlA z;QxlX!kN>liAOgOv*R{#@AVhn8rEF0pgsccA+$StDO?)y6* z$rL~+Hf>f^UqENL|lOgr_s z)0>g2>Yj(*8JJwH43fk8-GKp%h&ac{*b6=|+gd6QFiJ%U?|QQe zU`z|c_HFuJuINRxEQ5q*I=^*w(Ke&nW=3Y?LDq5Al%?^XSnvcAPG zDK^30ZcJVD2v6O7qPpm-+)FX4iN!#KZy9=@GIS9O>)2%Ntges@^s4(N$%h5F6bDwA z5UTQ2Z!bx*$-DWSxP)+1z(rlS=H2B&s4*8pnHC)sT?l0_hvAYCYHfwj@C&NpXJ5CDmZ$ znLe{M+k40_hon^LsaEa9`6F`48hMVW6;PB}(8IwuWOcLn4$O0r^-(3BloX6>*s?Mp z&s2H%1mY0Vo~8`)ypY)vS)63t;}~EbmJ78T^Nf%Fx(m^>hs}7HxvB%^LZ`|+BUo6Q zw&bX05HV-pbb--MeL*7>HTHyYIqxwzr?85nOr)I#d-%ylcOUcYuOqQ;~ z;hjofS*Mc2I@O?%vl|WawoavwrcPzWc99`NQ0_Cvmr+HIb^y5A@XC$mJKn&pZs(S~ z;MSDk4;Y9yWY}_;XS^@tu2fp$HjHVH9&c74N?)ojggMOhht$lR39nK$U>8`qT@o7G zGHrp~E(tElZ+`!0U(-esi#-!ZUZoUo-nclNao7bqQD=Cd%QEv@8!=9Ws~au)fPqZB zunEtG+x26kRtcqHK&D0|2NIKhWFGwpZU%vaz#$-iHsI_ArMAwynWNkDM|7;sR<1{o zL%I;B7h=5-EdvoWBq9jo4gBs#jE5}er9nVe8aXIUAfZ5lbHF*^Jdi&dH2OhFZ3RSh zmR1OSS`@$&A&A*g?IS3 zmNQ|Kf7>$YHGJ2O)-oA2GiyAhGWgX*dk?lmeAl=d?0S$2iGHV~ehn*0Wrq99qJoO8 z5lbve$;kYaU|XU#konL8ey?A^Z`A^RPr{F)s@N@L!=JsT&V~2*w{hWO|28hX&cBTd zujJc~nv9peo$#q%<-htDl!#Y8`F6?AqVN=t+>cjS#WUCYO(MkEugsOD&u=M0_{FO& zD~5SIm^C*HW8$3fJq0oqh*vvqlgPBo(*2?;S@XQBa9I0kRI6Ydhg z)Ro2Zx1QOlJB=xeFko^-bgDdiE=L?QsUo&34CP$*V(zo*y!P(gRTJI5xq1*feI@;7 zd#Q^MPg4*tmS2J61l`01Iz%bWDrvMAEC;0y%ia2R`ofg>R<%kEZ|8-(I0h~LUoxhJ zzKlpDCBtG0H-aXqOLtnITW@$X5ROrOTgJN4(n_X1jsaKXfv+>>Y5F|06LYbcl_#4j z4>K319PVjC4o+Mw>@a%=M=f<|XGDV#h>{MbYIk*dm;n~4xF$am!y2Ek z>Wxp{*7)?%w9L`?LxNpGPZlqiA*)ok$ZrR;%(>)M<~!ZMEe&CevhrerTdCMc1O!;r z8i;b2DCdacm(oTLTW=BERUI%Fv$%Oia2RemYH6FtH^55MT?P=Qxyt}6R9us#ckt`n z(pSbUIgDGvs&h-;#w~p`aVr*E!wSV7R4mLg2tlEMh%u*drK- zVgWQtJ#5^<1`MQo`?#qenD#J%#%0cwRYGYTknJzzAZu;D^)Y~sm%9u!t1$Y)XOu|k zPAd|au_O}%D9pLbK(h*?@3iJT+yEOpcNyTRa^;9(dd8MnR@|s@#+Od>OwA}S_uLwA zGb}W?E_u@6JWQZ*r#0-vwb05q;j1pc#G2YIal`Cfvv+Enotgt%Gz~!^-DyPv-Hv1c zwP<%4VB_X4fyQN&s8D1FV^&So5zphkuxy=mszIfsrWwbfF*UL9A_YcC(hC39U>2UH zZ$zRt5}v1#aL_uUkA!=F9BDE3nST^JB#YO}%o?4+@@b}ubu;_QSD0^qngyZ_8@WVY zu({Xp-O@;Eeq^9*p1wQAYJ*%%R|cZN5qG6#Lk4y`6$gju*Mm-G+)z`S{ZsBTfVj(D z2Iw`oCQGtz@BLa|S-+OU`n9m?{aW7Eul3Q?uVb-ezn)brwrc{+J_ZKN6=fF;_vSe^ z=P2f4wsn^Q`krs|45Xrkfp*`~b@=|y0LGr&CD7Qf%T@`cUO?8GREXdZqgqXp$>{E#h#=082K*bnBaJW5p1+3IfVz zg+-YG*ILcxw*(ftEYR4mw|J>H12Rs?0kt8|ngMoN?lO>ChKUAZtY2>;QrfR0fwD(2 zfMm>F2HdFQE^j-|NjHoL@ajf+{M z+OmP)T{f}Ya$f2LWTlbgH^?TIfs)E5BKmKXO(+f-b}(jatd4m4`@*ejtkHLfZe!+mphu|IatPV*daa2RemYH6j%H{f=WNU7V%#H-j2*gfGnS$Y<~&Mkdq+>*n%C9FEP z#8I)%AVcW}>X0|QgG92_%O)h>(BAZN_e0XtZC8Sr~Kuq$}< zISU&wfN3^&2{bN7=CPCu)j2>m1hi9zYFh?Aud?}cxU0fvZ>z$YZt{S?_Kza$& z?qW7BMrNJ(3?So#98l}^_y)L);w}TMEZpV579-O{N*5!Mz-C7>fQ-vs23TmhOQ3Nv zA}SQw!I)JO$2pdtec?-IS*My(N{!>8npl`oAU7KHeTRQ*Fbm^+*IttfSUYJ5mE_6% z)_$~rUnUuCz>AX6d5D>0v>p`R;_1vPosIr&8=G}XbLRr|BQ33-T4^ow_=BSLSjAs+ z`1rjG#GiSwmEY!rJNT|0wLttwD4&?vnx~yk(|Eegzm2Ew5dBY61y&8I=5I2vQoRj{ zod7yb2G9d8POL0cTJ(XD*{N1dleaj(HhmGhWWFds6!#)BL-xjh)L#qnme5`QmdaPT zAS5ws{esXkG44Arf(ZXmBzZz zFl1Di$3&zBT;;EVDyP&r(E^^#-(^Gn_PZG8PvoSjt`NOCu0CT1$PNF4Cl6K&lnZA?sJZ6 zfQ5&<4EX&v<<5$0Gn#||>5LW$OnDRooVdHo01683GT<}Xtos;X4s(}*^qzM5z+Sth zIvdOIU=q6}RPE&1 zu2;+B6J`b0&3(G{2SdmVfbOUYtAtPOFv9ar*xOgUzu}~?6R9wCKP+SMbU(e`ADc#pwUBrhCZ4&+ zyI=0Ap34N`KF#MdcSE(Wq~Gj(=5keP5{uPz-N-Jvl%|vsR-B%nH zg2EZpRyr`rgD9Isqc{$6-;*QiGOAHu>Kw9Suk&(nwbHVhA7UyQWNzv&RQayj_ipyg zX)|o<850%*czwkWT8IOL= zZe&D#)at(L7kYMa_+t<{3bn{DQT-5}7rXbXh8(V+6lel#@T=zWdkLo$rfa-6! zd1}RRgeY2uO@;#W90%$$=NLXRiI1)@D?QbGzPFNmSXp|9LXIb-!NjAOse0uNv#X!$ z7iOCE3sT#i)w4Sny01h<&~Wv4_VNY8cica&yfoIAtH-e5`-@%$RWGH^eoil#Zshf4 znWL~ivXTk?luX;895tYrGcd;5b3!$1-qgBnx=I17>tZJx*DC^4* z#ryCiN3;YDGi)q z&;|e-Qd2Y^P<_l@q(m62JbPa6y{h;1kqy4qYID4$u25!mhV|0t9JhE`ZEt9R`nQSYzM`&+HwQqr@Ku+ zYY|QDX)-@gvMfyUbAsFnb{#7S=mK(nmfZlcvhif~d8=Q$dc*41XkWCAF=)kjyqLBw z$&ao}dWO~|*2mW+*IG3t*J^FBE*a7Mwl1-i#=7J)z8Vd@|vhTL_qUG`ZGR?!ZHn{<_MT zCjE5?WdS|av({D4WM$Z?^x_rvP6EiqGJyH=s)>A9%?QMUt4e%g%8s$tRotX|`VQAw zYSD&l?}m|AccCFP=Cj&$0dad;~j36q!;%x|9h`82OuH7t9HPBOi5>(Vv@b|@sxz<*Gt$UB` ze)Y&%xu^QLb(Isi@z-go_LLLC&0!N7`J^2 zn|9NL@>l2ACipdKtc;H%HSWI%n{qZAs6=z2@qKB3d)i;{^ou{UR%IhwXg6BTC7byO zS3gIa6#K?&-snXG?gMRN6!Kt!%0Roj47fJ!WJ&L;sPx4#ePzO0IZRkPCwl2t-mpzr zt8f$6*6%rSl&SVSxq6#%b8<(oApZ)JJIem0&;I)7VEVaZ?+~Blev?u|A3=cPxyt}j zKyx+iqWlH)bTj2Iw>hWEPGOT6wC&l(Abmr0$jJDk80fRP%K+jhcNy?E7k+;|YNiA6 zWwLiPEiI?K$_kgAD*ZR(S-rHqGJG2!6TMTyVXLXZ^YyDQSbgE@H>`eR!~0X|daTjj zc2V-s!`R#2aeo(-)|6?f{wyljXpJ*oaOZ}M%3fzBwD^>+=#t=8+GO^?CS-)yKhAF?BT`o7geT06`V?+nn7Xm@_G}vyxs)%4Jj~c zg`>J=8EUkj8y-5vlD0H`Ae!-98<2LR?bO5L-p4{V6+ zkN2Wx8AtKVw%k?wdVhX!|2{+si^;4#QCd&PdzbAv!)c#8vaP1^r@*Z@PsG|?cCc=R z;O4J&%(#P%+tX-XA)d^Rbb=DD9L|c=(2!VJd=I;Cg~S9&s>UlVEgSj6+Zj=*7p1gc zrjpxuxA++>w~E$P~=Hy}C)Nu<0X6kyGB^pionQBP*CTTLEby#`)B1&anxa%3mwB=WfuVG|j zAz@+ZLyDpiLJpg)rDOPvtF1AWCmbN!gqgW%tNB*m{B7B_9t19_3T+y++WYA*>Dta% zXMGaZ{kxiHY*mYg9eLB425GD6{tCe zKRYbZVj?{%j_CaaYnB=W4g!aOLyfXW#UbkkWFuzhQ%UY73QB?e9pmP5O@w!^vlz~R zF%V&ZJy-Ae;f=3!>Bv*nYNFqVqTf>dChZQ4rgYLBhPg0nn?SX++g-f^Jep)Kp0-Gq z4!m29jY;+QwZ`4J2t!$w!iUSAuC&K|T{a>wJ-S(X+F_fMXoRcTmXu8rlr|@2H|!=_ z+MJ%JA|i6YzqL8-0Il{6!Yy*2^-c9rnOjOtEa}C~9k*$Wwzd6wk-z2S#`m&j)xo1> zdpGS;-KCji)h^8#gsdm0xhw9oe8k6jqa~50B`h=1eQl7*D)qGwC)kuu`1MJ;c_N&Deu~Izgz9ti%F=~avF6d*CubBs;^A7euh<{* zZ>ksgiJtyUmVOcyBFE$vUJh!^moum)?)iQ0G{4ivpqBhj#{!?(%CX%}U@A+HGlGQ( z2tgd%OyBpExK^YBA0vwIkOq`{v=;b2W%)J_@A3lwvZ27sJ^k@4{lp)<=B6ZG;d~ZE zO$DA8>yWW$_=l-sAt=9vR*v211cn<3ELdP6h`h4#T zzvJO;6qpBO7XSRuc~bJ)tLycQ@Jz+no#i4K5iTuDUg6DeOcRX_dy(T0W%!3Fwh)x- zb6WW}t{QL?x@kjMu-Jo#7I8=JANd?u`U08`2yk zW6D`rE{cg(6z~@9!*u#fnv4435#s0#_>cxJk=VDt{4Box+V#_PM@4__ESnNM= z{4E*&VTvsT75k!AzS&dC%*71^7OZU{h`?XICd~m4YN^;OMA1&-+@rPF$16O24u}Z* zd-pJQv*dkj!*ZcoF5_7^`1L}?zY=?|lp*iul$c6iucV%?Hp40+%PV^`{0Wv#ZzuC97GRbOgMUH_N64(G>UxDX{>)_8YCDAyyw*^0WU&0 zUKHQ2vbskre|~lW;ol^@DcMy@HhtlyVT9&9cdTGZX>Qe5=!Zbcp`$EXJpCUK(>O|F zBKn!8_{ulKUFYJ%MpOYZADAq?_aZGo{u?$1-IgoArG*6yrtvY3Z{QC!cz_$Jh+6vwfwzk{@}sqp#5~>LkAB&0X5B~lw7zAya(55 zXA35u+B(1gBTu{dO-k*$TDEa00|)m2cl2&OgWP9`*ikQSK{y*~lp~@Rg)h+4-SL&o$w6 zkSOg?xbF!%vuQeCfmbBXAHrkc6mSMOBYT4OlDo`h>fl;8+xg3kv9=YCJiF7)#p-lY zr#UHrmG{E-B9 zs5c@565tB6y9{8r*IfqK9pn1_uYwlnr(|po9BB(r$(Dxfy2($Fh=`H8jqlh3MubfU zSJ*6E)}@Na^+2 zXQrYuiRf#h^a}77$p&Z9o|4R!ll|c5%wA@ng_cY5>9gM~^7)jQ-Be?0|GrGA{YO1D zeQIn|61A)8sWzUi$K^KOYP;yUt$vr_x8HM>%1p_pXYL5HrKXw0HWw}VJBT-NxsYMC zU-AJu4&8|jInV%M?;@m{ zf04j?M>2q%(_ID-ce+cUakD;4J{Y47n1$vi!0n0BovNzI(i#CgY8^19&Wo~WC5wCA zwo|WB9y3px$HQ6rnGBSnPaCxs^u*<=Q@uf8F;H^iQ;i_A z-n}OZ1r7b!6+-`B9bKPl0?K+r&R=^R*&k%#<5@U5S3)OUr(@kB<>0NbneJ+sGuW9Y!d1z^= zVW~1CJp{t%)j5+9Wi@=}y^&kgjr+$}r~Sze--J-sA+P*F0rc+-#CJT>mr2GQ#Q+C? zjxueYex(^wQ(4f*975MG7iQLYs;01ZT#Zdj}2`+`$s><&P*M>b$dz$jp>FFBa zNWonOIIwn?fq2u>eO3w}mo%5Xcso%N*|zYxziQ0yoRXR}QAy0N`S3`l0`~r7QFj@g zm6n^>ZJvfenKeOrF=8|B^y<=Qa;(u9!)#!itRy$Xo^VnJG&A%qPQ?J16WrxsV7F4| zx{`Uu>%;Nha0J}ES>ZOHE@fIcmlX=D6b{oYV!Tc4ul2=e`qJCP(FR$(RGeBQ8~5Z5 z(8SzjATtlPTb`MU!mPW3V;V?xZT)Ga%#fI8DQVZV#{6Zon;+RA?Q_>M4>RCO4j5K~ zvZ|ywrmyULSq@HdIGR?R?0i|?cD}5S+7z=)?2h4i$LY0bjh0ry-igC`>yZGPZ)rSN z`o@wtIMmp3w$;Ae9-Z`$S(|Tt7<}C0G+O*)eYDVLHWx}2sW>M5<8nJs^$BW9vAN)* zye5l(ah?soonBh=j3&pJwan9A5+g#lT=AANoyuJs1rGNByI(rCvrM}L!Bt*0xm%VR zp`kR-jOczxVno5PQ6XXEv9wmP$9^ca9860 zLakwx-vT$O3?a6TogY)WAGYvxF5l#QFu>N`T?T%ai_c~`G@Hx&Rpd(4fA{nJ-+be_ ztirB_H}u>{plrGFH`ua+*?xH*_QtcQK)}F@Al99`{2|fAV1PG~aYauSKi3VSjd}{^ z8P(s@lkNBxgv%#UfVO1a-WdyKxenVzrVLld-Mz*Mv-%URd5kh%+M;rjCCWKw!5B`p zOb;j|{N=IDO=L{@4#Uq&BPH(fHKBD{$;_j*#y_L*KFPDvS$-eL%<^ZjfJj@}AIV-5 zm7nD(8HuYAd4*G-twwlB8ro-{SvS1jdfpkoel2}18S52yeK8Y?cVwCMi)Jj!ZJ=2E zbD1%Uw*KS$$E=qAVTt)}OcSEA21SnP3oq)rU9qdK9m6??Tx>qfGun!C7XyHYb$Xb& zn$OiRy=!5Ixlm~l84oL!f$Yx#w}3`_dT#!xwI3>8*=43)Qyq57~f zG!6&G#qiU1adgC3kPK+a-!wFwf%KtVInnGL7grmJ z>^Cfyt7k&CX{Gv=r-{8Uu9Ma0p?s|!VJp><^_G}(=Jgz#l}j(GN7ZN6UnE^AjtT#W z+|HBfJnmSU+j&CfK*Vyabt`}R(Uh1Mzx*6^552--XN`k=_ZR%Fl_9=&^M{}Wz1hQ! zN76meVAMr+=uOK3A$N>bMrWE?h6D@dhPtrmG{RbZG?icHd@{09#YN8^(9|f0maFI| zX4JT>2}+;&q|6J)L#^I2YvWc@Lu_qy_bnz}J!C#n(sPY*!>m-Bq#I^?%&{b& zKKsqM&Gtl{sIhu(UZOlcCCy`>eJXPzVjJePdP)m#0CQxh)~@EC_>+<*{apN=S6Tgx zQ$JG(t&j~#$<-vZm1v5Z=95-=(%Rx73dXS4R}AWtp(v zdQ?mOETbsY&mn_G8?CQgI*63e`%p3_%s%tU>gQ6ZHPlb1vCt4(>*s8x`z#Naj3sP& znbIB8>=B+xV4rP4Q)#9|SdzM#^d_unzT2k8yJwbl4d+5`uNn5L44^SCujS%*_X=o~1@-h+EntuT9K z7!LjOI}CGoipj!2-$ag+p3SQ$N}DIz4~f4YRM{|8s7h43fl=mr;cqLA<7k?VxqCDi zU!T(Mvrjdw6UYsteIz=nk@(A{Mhg24g^~FAlxh$2OjfjKb&5rQTc@c{Xy&hL;M8$i z&LkuA%5-GOUFCGe(wM?~EQL>jYn9$t z(r222jU@GCmX?!GDw&;byXp=R0?<0oQ((=RqqeNfQz&=;*q!QX{GRWTCdE)pG z{&_Y0&0m*}K^jJU45FgLIDuqUOS&-k@X=ft@3#BmT#M+3EaS}_<4s_^nJXmQM^}vF zGlb6|9qH2+SAn{lvSBE^6up*m{$t)2@*h*n(b#BiU4@#=@3vkoJt$FA`SQb+o*TlM zkgENoyrC7U_o)if1C9hOAD;gSUpp(S5pXVXoZeVRI(Cq_TB?O{l+vp|6X6z?oDqju zD=e02JT^u|kkJs)6z~=I7tfDzbrB|JUil7v5N){ZBu?p&YWr}w;lGYf`PW8S8_z3z z0S2q=_TX0DFJj4J1B$ft`9npYcjvkBo*xH}1E+vfb`T-!zjm9^Pa$k@crZoenH`hJg=V?CSeH@#?!~mw5BhUcwAz zlSDj&gp6-}_Nrw|1z%4y-VBD-@rnFe``v<1C1K3vr4;-M{vanqmG}|1@EdEw6T0%p zDvRxA+@G};h_umV!XJN83;r7&zeDs@NERIZan2Hxvew`aD^jVSe{qKCDL%z1w6{>8 zO+?khbk-Awn#Db*rxd&_6Zz|zv(l1>cPfESWyOPAxDa|2?iZ@8rG+E@^JuQlU7vPP zwHxc8#-JbnT2*XMV})1ooxXQgyuXX8o~JQU-CKd&dgglAoNZ9H&K6SDG|c-}wzU%+ zwra4>KRA(pU{P*Q&x4h37HivyGgIlgE4S-|HhnDqoIsVOTc!}liRYwp)K+_)g~`cB zTkRE@lli!<_NSRsQ&;WTnNy<^4RSVY;7cRk1GNqhoZa6$P9Q_Oal=x|uy4$;?Ge6bT-WHzx-BZvfT6S+)hrKsMRxm@v>vuZi0~KOx)zwNnsE(wCPcnwHm zjpr*v|0d{;xWo}>F{5;o&-cm-!YQZwnGA7OUdb6Z3$ad-U`PCLhIpfSq5E2LTknln%m+bJIgkAvi;$$Rj%VCwF`MY+K zQzR0nFKsoyV<{T?S4(5x zwf_Ns*B}LM&Bs?4@EatrPiHY8-1`Y%!uO;3yZ-kmBf3?G=)YpZ<{ zoHXpJy-}&eG+(my<8PavyQ%mE^RveS8uRmvN661Ja)-^2=1X51#X2aCYn7=L(@fat zsZ8X5LZN%^EB@-4=}VjhexE@~W86<_os^z}-&dSJEmzWT#-uV6UJ>W2pBQ)c=YPUT zmR0K2hLxYmH2ZhrF`1v`SC!2T=uxd7X`|<)K2`H!zzboPg|X(VGlXFYlQC3{lrRmE z=+$90sBmLM)DR7Irj~Tl)B;_2){5*Y=E<;@9BWaVEn?$%+DkNBzjl{dH*B9%sUIXM z_;#hWTW(YD&p$|;+&-P#nFkr#vy9Ty>5Hj5yP~H(fQrql&J>9SChT_Pirur+o}l)3 z%u5sbA9QKvrG!5y&Ucl2?#x{gyB_W{bD!9YS6}|lZ07DsiQ2OmMl8)h(QFi$R#f^# z>uhdM2WF&dYQVgfo1e0JVrgB5?hk60dut}8=j2NN^gB?#Eu(x}q}>=HncFYc`Tm$b7D3OO&+Yye@tt`$n_0Mq^r|mX@b*YGVq| z&Xo$k0~^1brSRpL!k4`?(4yWNn#Y$8<>i<9@?ZMBczHvX`VBGl8(MhT*kKsroAuK) zwy;sIZ1|BaRH}P=jRPOCUUSN1;iCMH3TL7=x^*U(EFs9+{=4|7=6^)5pfb3sviBhU z%dW|&zY|Bjg|2H0pxmC*k8rOIA-CsGk2v$;+|G>B$>7&+q#;ADAx`0ua z=D%UQrgLk^$mY3p?s%c{ByGr35xHh#bv7Pl5lq_0_-ON?{d}H`Sc zRpaSOu5+RJ@=@exOPZgLLp96Ku`yxUlA&$dJYMQH)GUXEv`Bx_>~A@TfUo^2>1v~V zpU>~xD8=xihFmwk$G+qKEn3c_{im|>dWiu$s;eYNS@}(j*mwC9X`arY&e7czvrf$J ziONaxqI+JTGp{pd0XH4bUZ#*NUAhvr_A4HU@}>ed=81)>qov@7f#K@2@Z$JfAs7S& z6vvb(Gsj1*h<;1CI4U(<3~B7`{n^3&dkMAbS>tJM^0eP#VCnVB!XJ`_(9x2%ZD=L$ zsw8*u8(#A7P?cVnIJT5z!T#wS~~gq z1o>nqTVeWJo0Vc@o=pKwe@-Ck>Tp}lTpm_^e+RiTG)W3inJ5$=ID!~bhYFV{(S}f4 ztGF@z%(nvtXSGjLM2eR3SD7of6O|vucdewj>`3J5>nIQW0GQh|B2audT}C!6FabgOw!$(MG+BBFcCly{9mZvUh@djC+?eoxn0puSIIrs7TTbFc zp%{rvz~vTkcYsm{$iZn^P^d-5V1c<9+ybX=f#9Cd)?7?YgBv;WkQomz2*?ysE>#Ph zx^3F31tsDlkWFeSh9*kOMHCJQN@1%FAW{f|a^mmz|F8YdjAS_l`t^B^A8XdTZ)@Mz zUVH7e*DfD7%&yJhxg|h-5(w7we35B;?`Q%XwST^zph(#j{3?KheeQEex&!rX>VVKyeuxp-imawlsY$Wj< zNL$JkSI$vtpfJa)FW~o~R6{P1%9)<765Jsi`F?sR3x%n(pC|I3i2QOzevl&Hv?B6; z{COgn-xm>CE-=fPmcBvccddwAb7Y+wbQ4)FBFmXRp~%0pBJ!vszn$N^6Im`I%bET_ zk)OIE@)1Y=Q+|1=cuFoJ%b9*tkq1+v z5lorXb}HNkCW?3=SPCb_hUasRO+i?X zW%^Mji&=+541%0?epRJz;9`s((H` z-4&8l{iNvbH~1_oxS#qQwoi-hz5y(YFQ5^qu7X!r_i}|lLyhzhMGDe)xX`jiw=LHO zzh6P(BuQGjKv9X*wfLoFkvh@!b%zbgqYW+DUeqT^pN77AcGnxwzW6W^f0Dls{1j<^ z68!%iaiyiZ7Tygge02K%!YX%Xn7&`WD*W2)J_`I6e;x9-9TIHS_kEfUf=^rae*;?XzN!0#^(9-0UN$`9~RYDLe6(=M{7jmiA`zyR+Yg76D9RyCdZD~r@#zep5 z(%zooe=EyCh9<&;^KgVaZ(zdQFns6cmKfs(Nx9y{@i|jWHB@cGK9hJNN#RZ|K9n66 z8`>L&(`FmJfZ@MnaJuK}S4JMV2Bv$i=`V9E%isq_CtZu9^gZ|lEs`qDb9PWwh`eGu8v zPAGuRl&wkt;rQHk@AG!fVRC(PQies zD?bsnEw_WwBH1WPfY4xLQn@p-N$b#hQJD5JRfvnZoRltqcrC~ZU!<}YL= z)I=%|w28q=n?u2HYTOZSP=^SZX^UG7jjFIyfHCGRf7#?@X8cwd6f;9L&A?==!dPK* ztMiK4kkR;2x>nux2Wsf(X$2d5Rkxpyy5;C|M2D0~-nzD6LuqJ=0EIKgdN21|>^~8$ zd?GyvB3Uv#ngb!-Tz#MV;B8%OwR&Da#nyk}SD{%AMlh>ywhddK5c3Ikm z&*~6xruuq*`&{^@qv<*p`e}~J;&{RB^;@AzIESb73ufQ!>nVb<%_a+~<4RC$c+Mj& zQ8?n{O?zUAUoH%S+Ox>6+3=hTFdtw+;B;(l(+JGj=4)AFW^kLMVo~4vd2_b*YD~yW z#?D6P&Dp9t*@PZ#tT4n#N_E||7~8k=S<=c~L_KUDF}8n-EBz%%7O_1na;;!f&K>$F zwky0)_+^AQ*8k2U&glwKK{QuiPn>lXaSyJDtAvG=nF|%lm-1iYmZiIDE;TF4#E`#k zCRX@0_uB*B!Ef58H+`OZy`-uhIlguM99=%OS23^{Y~c9gUFolg$1MS(ExwpFziqd) z$kz|^M)<03uCc2?gN^=P`f6Eat6S*B75F3>;x0?MC0;%*BIh%E`6L#`O(24pULzJJEXGm`d4<_6i)Z)xJU ze1~C&W5yc|jQ~77>~sb_*Pk)Gu#RIBO0t`hv}nH^H2z3rVX)%96!FI*EP$!rE)tcr zKO@)^kqk=fu4}!98B}j5VjJ+JRJaVvYuNcsWvd;F3$BzyEE|%}_D?WMQr$smYRzZ4 zBF7F_^^xB6IgO8s$_Wk70N+d}H|!JRCjIqi7~Q525x9EvzggkiAV9<3^}!ck9kQGl z-<57u=z1$iYn-v4<)E=9RhQ7QW@JsfX0fp6H&XH%-nuz99|;x$qyS3+mIY3C6Cjv? zM%Ww{yOv+0K9SCUkH*sazd2ttt13>PR_b>#Guv+V--H8Bb0)p!)86fGX*XB-#wjmVdw#zsT=9$#<%=adgVS89+7wyrh(a5bvX-@t`c;U@ zMFf7;(Zf^vYF(<5gKb5lsaP#VPREumr$0I`RYkR-MT%amf8~SSf_vl&{X*$BKJFjg zTAMpsYhw@+dC^+2riX5**oQjLH~E@?o^e8sQ{Op)8x{g+jd^L!uiYM;qeyrnzFiwA zy;_iWS-|m`f$Lo91J|{bRfnn#PRx5jpmBvzJ1s|j(hL_R1u z`-Xa6bT)S2zk3J%F5&+$_~{8P_!#l>N?$4RBjaI3#QT31d{fbtOfR|LUUMK(xgtQ3S3m5Vz9UFz_64CCGBw5nOyLa(YsQ zItM}>zDpiQe2ljlYJ>C_b7yy@KI*gTeEi4ICx0GAi0yCIC;vwb{QPwKPA zt?x@dq^4P|PrmP-B>|Pr`TZi!P##8-kF2Rr{yXInCL5s9^p#0Bx+Xv^?4C zu_Y}9QGk8u_p`shbhD+}+0;FxhPLUBvhvm3}WBeWA zZ=64_^PR>nvnY&3re07&gc0vMrHgL~k*Pv3t>6g9(o=3`dY2E;<-H6m-IVJd(wy`x zG)j@0lA@eNDl$@2e8gN{g)8j<(c--NqeI1eGa>at_c+pKh3ncLO%x4*#40QE_4a)1 z!r?nP@%uv$&(nnO>#6=8;hdCg0wHx+(V6b=T<~;&d|H|>PYk5$mqz!&ubiYekACHD zGOE3?`3(@BN_qN=Hm( zU#ZBY#p2vo?*mbJMNh#de4F(VeRW9TeKebK9CrsJw!VrOC56+>Glf&KbkipxZl~y< z9=z=*ouAE^De)j;wx|ScWYBde0kwt|R91|5 zR-U+76co4$tz$r$^ph>W3rYA?-U_B9?{S=7*DNSivw zeQF4A1!U4;Ia)dTgEK2v9NiWM_Ojwt2H9}sv->DS$h7=$gf3L%vq*`@&b+5AE8E&v z9GLh}JZ*WH9;J(8??!%-LRYi3=}TAKm-Z~;*~{`Q-KPm&0!sUSEfawG<;}c{%q&aZ z@PtZMxk~1Bt*MC!bF;@y96_|aApUq60$bm2@mETcH{>`MLY zN`wE55}li7&5z}XdBuq>tcRZL>yYa`zkBg@LRc}vzG@8&C)>|Cl1e!OS+yeKEp84{Nq9KzYtJXYKJ@xucjZ}GcVm67Prjswu5Z2V_1_cc9Bb3$025uQ%CPBWhra`2>Y(*jt z0%Q+64$pOTaKUW-nC|OHm%GN~q`R6>!%ceX_`;6b5qT^ZKL7bCTHyLFiFIp_btW5)y z;DrwoE&zXG5Ux;pBy4kpZHX|u5R->1z}jNhYDA4gK&q+~*ntmh23h-;=b|EP2VkbE zW3w21`f3e6IXw6jt3CMS?ZKyy6=G;tJI*O8#ri#A^K7pYLuv#NL;vYV-CC87*6NSe zk{7Kte8RcS3pYw4@iT5`CxCY7cXWIMK7OW`Y8D_46Ys=c68=*I}a#2WbBC_I-O7O$3< zs_$7NJ*&M3C=dMN+>gPktxLm?nK7z*!(~tp_40;6$D#XFze`iy0%#q!$w4V9PM;s? z%qMsOIQ@#S0NZ-$#?2%u58E<=zKCRi7HhZ+h#oG3IBeSzJ_cA{4VOV6r5bg z{H#maE_>`5Rv)2Vk=%eqFkA)EqtB=A$l>IG&D0En$i$U2NYOLX>z7l#DaIZqzjs(Z zbhy!cN;bS`{vETippJ>IuhvAD!xP=xiq=GzwJtm+*SK^3z>{T5$5}JfKw@IY61n zD3PH!`6VEm75!=NQ_K;i)D_Cn=Lnu7nl>lw3__;TserCD6ga??o3Sww`5#NSOnA`G z3UB8`)DTGDRUnuA^qurwPQI%)b4UDPaZM;QCYy;k>gf`U$)Egt#>jlT&l#R?N5tY_ zN7S<^+y1t-=aMmbUKD1!EDVvyjk1sz)gL#L)HGlnl&jvHv}d>);fm+52%C+txkzW% zN_*j_IS;NzR6jeWf#aM)As$IoxVmEHGhl;^=S=l${KgE_S8E2!;Tfn{?WI=Uo`L#U zF#}y~*egXZ)_)$eTnzoqaxu#UU`+1uL3iC`M{CVSYsrh&>UaFCu3+^ITBKsnaB*I5 zTz+|nuw4G*g ztafY3+pVRK6|I%4o#|C~Y!|v>^I#W3neg0bP+HBmt5KE7dYZQ{5*WbshRcAax2tJ@ zf2RZF^ioyVr6D|W5_izO;V=_jfk}=5$DiO(m`#Iq< zfU^mgK`&Wk%Yc1xxCA=sp|DWp08{QJ zcH%D2vGnnAPpTp1)JYFD#M0Lkh_PpV&&RijS^5;;i}yk1K!tfwLFXBCRHH}Wwv^wRh?Gqg*2Ze0U^#w7y28rQ=kz3KTzr9W$p^mkD{HNt9~ zbAR1#lN;mPZ8FLC;`?YqH)AOsMUPS38@qG?#FqxhN{5ecsnl1=OxcpFS1cDDUdDch ztA@nF9VihvOCtMi{+}zkV075Rw@aDIx;rdd$rt#boFWkEd=;`0R>0A3Kr-X=REM4E zuqpLS`mMh@yKBVq!-Kc&ko+0(7`hJdN|pL|;;JQnD_&NwPYpTPw>@6CnOL?>A+pFpIud|qB!Er*o+d81w5uUpQxWr&k>P04D z8@Bw#jIEU+Vux60hnSx5dq%t*ILwIVBOR2=!?Pj)C+&h|Za1!DmP+iQ7+0PRWF9m> z03NQ8zibp|w^IJ{Ik56{3%@OSZ9HmSJ}_V|Hy^)P=)Y=Xy~*|U74PI%@rdgJBdg)! zhzi|!7B8~R(xP2alN^rxwG8MEB)uKs!_ynJn7{ct)17JXco@^dfhDWb=9`)2DNsl$ zkp|U~@8^@70K>-_V-r5L;)PnXxD&esxF+ppxi1BrB%7W?Cm3auP=GEj;-H%ukrb5v zj$shRVDzYJ>{%5&JPq>TpR@8F+VTo-Je#6qD~(|!QR?*8q}c~|&UZsvHF^(Bhmq2w z-#3o`H2(UYGvBM5RlZH7gBD&FyYuyBF`{_s#TuU6{&kj@K>?;WRqB^@hY3TTOm-C< zoSs@%!S%>(8r}DO)q9KTtryW_SnH~Z{!UAZ#+BzOq{zMyptVWSXT-mByp_3yey=$L9C@2Y}>g9O1N!2phCD~+QMp&A1@J10KlPZVBWr!)EOvnCg)qNUzNw1r6 z-u!QiXPk20+<88D<-h*q;RkOUSHVuX5BIl2F7NL#3pn%AtvFrWvB~)Kw%5`WmvHuR zO&nri&}6Lidc(P-vk{uF^D#3pt%GOkZ7F}FvOn;6zm}e%M0xMVjR&7;=ZLi-CsUqQ z`AScTxE{HVJ69<%-nwT&D0C7g-B1m|!C4TE;6@irXS5ivJbA?PQBx+y&dk6h=v&1a zo@T>?@oQw(Tfmpc*MXYU>C$U4gYTf$&jodS%8`@1vE9QN5tH0EC=_3)*q$l@R!9BXKeaU@5yKD2V z<5mvVw8z%jdLf-l`rt}h19BrG7VWzti+Q@aqAa#3i@2IpMw36q>law3OrSMUyy&+f z_1h3-DEn>5{q`~SWSB!e^>*JMD{xiUP1CNPlKWMVOa6C0{#kYYQ@&3)JhPcjTwpja z0NLjAH$1b+9ouOpclarsE>1r&biRCIx8l66(z3U@Y;>F`C!5MF*8iVJvr#nqbHLoK ztCa`l(lzPMvH^YA*sa?C21SqB+uoW-=~8|0w#9o9&~kxnEE~RI_ zpUMV*RIDG=m2)o+L3S$jb5`8HTQdJdSaH!?ZbvEiGdmfy#lG1OY4x$aSigPjBPvt3 zCw|?Bar$QA(n^@#@?dwfh+)}lv+0fKLQ)(dt_bn#197bbv6f~d7CVx@@GnMe)&y-# zd2I>A^Bst5=?QJb|Mxo}ewYz^3Dvz@_$EJFY{av|a&;iqHzl5v*OwpU5_hcWQ=Su_ zbLCv<>x6sed1?(Gj+eM6NpIX*VA3N4x4yxxur&N2<37T7ZjG=Yd}SN=ZwdDmfm?i6 ziF=GR#yu)TC*nrGzQL`q^r#0J_Xyu5ZlzD>w{bsIxO)QkYzOWdX^eYFh<-b8>l@q( zOP_q8aqs85#I5w{6Rx7$WPS~W%Ra4RhJ2JQ;qC2plp-EG`Y6z*k~ zX1a4r2kw5-821(-dO_gUH@Fp+KKKAP%Vxey+)AIWa|^mzzW!}+zbkNeci`Sc8sqL0 zqW}1+%dKy4D=h5_+#C5WaVtHxCy09RM$JuVSaD$1vwpfh_|bF`L5pA2+$qQ766mqF*{pu$1_O3+*x^h0$F2w&x(e73y1dnM{m$l@2 zJjmwigP)?+#?xg&qos7?d(0xNUeEj0kKhweK(h;$#{kmYLWM)@>b}|Zi|S#?`*quw zAZu5hNbkoA3~?6FEL*_fMKEsbzyDB)jR%$&C4d0qf*e3b!j1hM>vQlE}XVqY7!}l zTT(OCyZ`9q$;@x}@+p1Y;iG$DaW~pk^a(UJJn%sxGDmw6ckRV_-b&{k4^)Tia>vF> z9UE~+`yJ1?phBT-(Kzo0MH@bbPg4s7nZ$CDuk?ne4n}xn^EpU2Udtf358wC1nJT)j zk<~xqiBaU?!UDT(WDHg&MRm7Y0BN);{@`~Z3#3D6nW{W0Geb2w`IjF3SvH`&Du;Ld z;0QjI#(9r(JwA)TY9s4=V0scIraCX!D>Bw_dkxRh4pTZ6saGHC_VM%dR7-~y_3BH* z&nFiWNHuq;FfV^+E=>C}b7RAG56JDx`y(n~y@zbbF5ik?>$PJ<_25UmW)R06xOCis z=uPJwxCG+$?oqzLR{^`<%_#a+n0wJOYB}e*@^~wsYvlv2=Csl`0@QtKHdB2cerm+w zDSfrhPvr3V$q}V#o%hPy=O_B``ANG4iu@jQ)PCl&T|(P%3)U~&O+U^G6_;QI5Y&gu z06{%2>S};0SGWw~Sd6fQXSBnTf<-)wEoy*!(i`B_H(uQyNKFIuKf+~z{zteB>dh`( z9C(8)8bDvI29U!Ipjhn&karw-^Wg@7O{?(DAoI|;^JTn(^f?fUdiy4Cz4%3i7gLIs zzBa1Dx)0NQd^_F!-ywe|XhZ_$8a3it55J3>N{n3~sTV(js@RT|bLohunl!3PLW{_s zsqiyDTh7(OsjEs&a7+r#wRFfOi3vA64b7NI9||v}pdx)L#L=G-(TRFIP{GAT@BF&J zl;}`;?<)yL>rGKrjy8R&s11vWB~dF3A}aE0ugP+`95sCR{${xf=4cadhhzO)@^UoS zc7f#e;*0#2cTN>jxzhO#UwJw`ajn5x(qX^qR3@%N@@XmWM0nGl zcTHUPM>=u75Umm8Ey9(FYp(_e(*=-@{z03#%A=FG{{5VZtGrvp_161ROGtDO*TA%j zxT?K^xYqcpR}ZO~P_lGu*&Ii``qA*4wx5V=mkM*YvM_DZ(%A4U<*0V$dZP;1BCfN> z5ic%7RKjHdQNbmmA^=edmjOg2TmqS>@C9*Q{(ebYmiS5&6o#pyZ#9N5xMjI{z^Z;n)0`;&NLzc!+{z>M)++L*ImZ=Jbv56 zwIiNt(x@s4Lqh({)xWxTi?}*br-zwsD z(XW0*U`li-Jq@mxsB$^miB^l40OSWHZdT9ICnfA;EC#MQp{ercPy+G7{lq@5Jy zu86B*t|qSMyL?fwsX?&5L+t3O#P!v9f1JV&eGLBisvJS=d3yVJklKHM$)+l!p3~N? zo2h=33T09|t-6`_6dyZlSAM*4!}IR7g47PKbUseb)AO-xWE$t)e$TS+T33Ma){Tz4 zVqAC5A!S~w)OWJO63p~;R^tJM0YG}?TiWzg9-Z{`z$Z;l<=vvE2UU<3Jq=8&=&2ed z=;;Dq_39VZ7UkjNe89Gpmy-%!fyEVcOKBvEd|dcV>F3NNsxBXB^o; zd44f0K-ei49U+S7h(KH>!zDSn=m;Rw5x$_O<6sY7?T8BVGFpb&p>L5B#mQItSKW_` zSArY)vEb$|VnR;%)!>Jm@YN0b$4wFbIQ#*Qy1s*46cN!JQ!THe$w{nl#>!+IQ0gL6+vpeL=O?xa!YuD7 zb$Z(iJE`H4hDC9kYE}6DW_sP5R0{V%`mOl(fcR^F`>pdvBtRvHqC!jgZBxT>W4w;v zHZ|;sr;cb;m4vFwpBXiVkTx~^*~r~KnHoMbyp&%_4WEyArL4!_ z6e5Ec{U$cX@e-*>TV75u`z4iE69GNu)$h(jGm!f#7E=ritq zTczh9MO~K8XMEBp^F%vk@I@3&%$pv|xQUB6x#y;Om47}I{2^x)*?%JZr-U&5?K+jw zN=Kc^(w}1&VG-ICGKm_P>ct^`7sZ>Ipmq5DkqXTPF~yPyqaBofLwK$tyezueca~V9 z>2tA{QZN9I@SUm@vR=KhRneGQ7fv?{`C-!b+GDlmCsgb!p5PoulpL|}d zS$Hv598%pQP;7XR?XDHO<>KC|!V5F>0Di^G4M(T093VSk`q9Bz!lt;B+05Md! zcH33h6YXAma$s>Hb$#KCu3GcWfo}*<_PoA9vxBII3x(H;T}INB7aQO)va1zGlxfkN zcHYetE(H-|L13mj4`4`9iwNglL4CnQut+l6iZ#`U{HEvgAE0%a%`{rH& zbc~`cHWKAG2YQIWQocFm~31jOV<*_F>ZRM&rhwRzR zu95H@4KNnqh``KKwOK+*^r@`&g3J*$=Y$bJU|l?x?CNfRP3$sg?f|4OLkBeE<;5Ab zLyo0?8FrB)esxy4p!?#$>a<-=d$JTqL3WA#V>p-#oXW1fb~WvZVxOZNPk%YDA@!_4 z)(2StGgl{yW ziC%%3YBwN9a{zBpMR=cphg6rpCJgEmTO8cn9G>BtsDx*Kc!ou z)Nn-@QcrR1o0|pLVntgleOGOvpjxraH$zI}C;idYokMC~Ay{rz35xUHdW(nDP?X1> z+!dD#IiNk8*)SPvb&=U59Ux|Y3F_Ri1Y1o5si32C*Zo8T_1MGWn{!?rA1hOtbIi&PW zA@>sRaG~&8u|F`#iw2n{uUhO*cy25*mZVcOD_mW2L4I)MvEpz@Mqt=vFwqy$B>T?M z9MFgW%mXOgL#o$b69%Z=%EkSU@C?_)uJGIup5fAvawaIT=n%d>wT0kSLn^7v2n7HP zsgt)G_mTh_pmtSfJ){&=E9PQIY5b(^L!CovJciV$N>H5l^uPCz8j14Q6SL%ULFet+ z%&zh9oD47>U{>I?L&^x)4!C$4QVaf?m^Wz70n)`o9#ZiH zqNX&Bro6~xjx1}%yfQADOU}Q!Q9;nGaP`Us`2m#VM?R1Y0ggfqCN>MqR5t-~GzVa~ zB*OazJf!;kHDOSn*yZ5nj_?fE#Gdfn9iHLRkP2Mokg5>8YDg`s%netBA@y4XH7IO^g~eM*!*T*cD;n(>Ki!A;;2fuXm9ne!jX}4LsE)<;isu zmmr%)2ul(S2lmZis|k>uUF9{EBlbL=K6tBnDVL!-1Sp4;zDYGgJa{P_wPG|d$cqM9 zAj?{jlyTAQ3cpPP&@7jx*(cXbbt9l8Kk|WO2ykQ1V4`1Orn&`?qd5QtvIyTH;32iy zUlRu0SaEQ3cX)%WFyR110!B2kBcfH>(Hy{DHo|uccu4j8Yr>#DvERYXz2O`@spnWy3QfBC5F_j z@D=C1<+z8`w6Ravlgm$XLFXgO>{PP4OI^f2c6}!J&z;(X}g;C%(tA8d)?#j z%}WL9ETD;VL{8tUB zO-|v8h?n|~aW4tLOW9T389iB=Fk3Y>OG83DYMi)UWSUla2N%{f5&=4*qOk{7&`Lyo0?-{&GP z*qIIVR0B`EqSwfJUe*36$fQBMxsh*Eg}{ozHy%+WlaeU)BPYyD1?p))Ii&Q>keVhQ zyc7;taiu{;DKJQ$R0~r=MHmQz?kEVF6)|=Q%=lrlUlTV5i}TKqB{D`&lqb0qs~(VDwx_icG>8z40W3Pq zMsZF%q?Vj=>WGVHUdmq+qXx|pK>EYi1TQ5ocqxY*OJlEgk;m+`x&hS;JXS@Zo42?i z`TAsO6lGeT@!}?fW5KTSZfbIZ<7v;Vd8t4>1Sp4;zDYGlJa{P_u;PJ1UR1gdPzyUe zMHcFYU>}+lF?I`d%I~wDL)hBEER&;63`Mm4fIOrefY>F%M+7{i_WEnWAf9ug9An{m zBqC25G{?g;TpCh=s~l3J1g{!W6{m1T#7nvM&AkHfQqdOk3>M^4Zi@vC9MrV{=~rLX zIi#jzNG%Irao*I&J*1YRJoXIJoRr*0EBX9`K@{TgjRE=s_#oo6L&^x?rCdDoQvRCQ zWzgIKNSD1Tcqw_oOF86N8hoXTyxY#OoChxzu6|`*9$3UxQ(N{%>)Dns(eQ5Q=$;#z z(4f zINWzvN3d8~i%=PJIhLgyH~388ZgpJ9~dFBuJrorl7KBdf;2E@$O} zi2-sYnwtesq*K?z2idbajtiNRDpyQu96V<)je77#$-^yLm(bFZ|IPX+9xH*<QRE+HAp;xQJzx6wWe<8xh*9gB^;U9@`G5V|1|CPeu8R6pER)@by z;a5humf+Rlzpd~WM!4wd>hNbO{E`UQjG)pa(_W$-8`uW`d zKbO|={eQ~_SbEu6U*33T_vP5N@9MeXRvS?c5h^;qlH}AU`T;$Mo*CLTa$Mf1bR;;Z z=TKGzpL6`GcIz|M@A8`!XuN%IDbRFzw^(!wG&bD(+Z4L3t9bX7&ToE;(9c&}MO z|4Gq85xmzMha$Fj#YVY!hsNNp^l6$-fX-U%JNld;yRvT07T2!W3`pnEyyaw-N2hMh zLylOtM&2#mnn$=ErLJONdeTZoaJ5(H)@-C@(4%qtgwzI&Z~JWzKRM!vW|Io@KYuG1 zrc<}(z2D63+L%(Lwrk;A$*iq+Pw zk+*eg^l^%A&1S{TwQuRxY{xTnYsMX17+`QETn6Y*;iBdS9A$>ffK@$Q0?`ih^03-X zuNt76-k<^WO#>_uNCOz4>>Dlv*030y23RU347*GGMg!=p)c|t10Tip<0P=PN=%dtC z+^i^3@ASPVb!z8qBBWkCT;bRu0HiPcFBR5(m~M%052<@zA%Bbg8j%2-hSaEDoW*Zj zJ4d3;dhs=W+uAuD@l=yWRY_9~_%~2{uG#`wy{gm%$E2`!&Xq1n)jnA}XFR;J zC{+h4iyL%yn(J|I1s4}x_)&qWIdV#W_{$=7RUNv-Of5phk4C%Ny_lF+d5Wnciu_x@ zvPwb6zAuLu=d=;+y5B@W=g-K?zNWvkB(E1Y@>`N-C0!MiUQNQXVE23kSf9Fq(xKo$ z+?CW6J(GW;)zBpwaxsfNF-j`Lgag=O*MtF-Ia~&a@xx`HTc%SxU;QY(8SBYG%0{l8KOkFtrg}^)Q_F8n2k8ofGBM&g(V*e82m0kl;_Figk5m0@i&&ghe z&rG`4W7m~~sJdUNi^7tbERZNBYWAGkLK-aIR0JZQ!NxtYfxOus0m4St_J&P$5w;`3 z1O^-Tf@JTOM~KCsUv}}jpFM4?i?BUT6E1WJl(gPUWM>@a!fc`<`jB+U4Hf{)(Ds}d6=0KQkUgg+BWygv0%XsrBN5Y}J~bOL zrz2*7>^U_bVRI1{AbUP}TjN6dC`FJ#ePTIW2J9{@{0K07oCB_j-taM?f5T-!H;2oB zv;J@yFj3{=$jzSN;-JHx*;ri&oU-YNX$g77Vof+Jom4u01w% zJC8knn^oX&RlhC0s6P`wTUdJ&>XQP20gFbs3{Y+iR{++o={^#4SJhSzr`-N=@=4OqCOH~-60M! zV4yg8*p!A?IV?QG!ZcLYo=~DlXHe=rX4#WXJct`{lq?Vnds2;TRw@)qAw!YF?ucm@ z8wI(_n>g9xbE&AhKVk-82e#Sjs`b6y+`*-rcJz|(9;eT5%9c8`qfS^g;M5>o2B8i( zQ}A7^fgT zhqg!V(@t(X`g4KFV0a5x#_t0EMa~2JkExsa3r3 z;(e`)?50~4lz#DlLJ;n-#K#Oxc*HPORs&Ct}Cfqit(RSI7n;96PIlH!FKQ3PQ*f~jb9thcqknMmJg!y|4^0sB7 z&*L?RunmZgduc*h)**^E=mw}}#`I<`rcKQ(> zfM-#{#1xFB{DXj29Hmsg-VrW?y544UArP1ZB7?|ibNCo=IXYYhGrDS^)!AuhE{z>Y z>5M=)<^}9c+CUW(N~AyCB9AOf+M%@o8*=C7O9iuXvqpRJ1^~tDUKk3utMzTiG?wa9 zlWM^F#JJlrT#ayXSZ~h&`R!#io+H7$!?MNnRW|@M*qA2*J=b>+e`Ve950uqdq#Tv^ zp-Wx;lBR8prZK>DLAVT7Hfw`<8Mf+6>$$>4r9J3lv=d=jo~?fA3UmfxJ-0i23`#Bk z{DxGh@I&eXZ}gyFlW9|~=*UvbzTe0~K|kKeA?u1fG2m?L_A>~pPwz0xLnw8H)tgY@=v)W z>ev8^cNaF%m4>DW5bvkUqDl-qOjSA86KU{!8uxx2o%<|D@I}sWZ#U!mcl;lgt4zmz z#ibGP!VBcnLUQm%%^ewA86sJi?a7w*doXbc`C5ivEu~+68abWD9?-$t=3@RuW7tXy zW>Nn2Y_i`$CcNmZ-)4p1o~th=8!uXos=SBO*}T84kVB7K9db@wA?`W!Al;|=ZGN!H zO;nY1@%M333uREj!e!an(dR23p$Iwjs^{fBCmJzBhA(E-{d2EZ(d0#32Q8ZO#_sDC zmBy2q_inUCev@Hp&cOldzE4CSEyy#}C{u(RV6G)x2KgC8?i0(ip5N6CP#%268*}-& z^}Dnx8#ZR^yyq4rMvKRJ1&9MCTFBJAkwJO1U z5K*^Kl%7K}jLJkN06$yE9IXuR@1_T3{E!f6iukI5(ZvO0^NWTfnYxfpCLHx3Vv8X7 zz3)t?O%3LGaAf8u%uh89l*Dg{6{^yh$)N|7h2$XaHxwGT1PMEas+VIopvHC(%l zs~Vu(1?~<{gKWYUa^VCsX@cV+Gr1c5i?UtRF%kB;%pDV9)P0{VG8ALsGKiJ@Ncb4= zW`K?-SE|(UsVR`tUgtZWbH<;!lv4K5FOLh=3JS$9tKC^sl5J z(2n#N-AG=;9$Cx&>!#|^IamYr8l$@zfg!@Ys3>80A-20NZ=A{SC~HYHkUZ>5EYglABeSE%!sFy zK0UgP`+>rJ|G=%OUgA!qG42K7eqG?!H-%PM`s^p&8uNUYxRpNL?E1MuZv7*0f6OG( z_k>H_bEGluSs{8*;MO;|6_$Q4aBDAJ;$BvLUe(5Zjd1@);GQL{!=U0M$&7wnxZa~U zTsr0(^a@K42=qtzF3}4`x_2A>6NLWEK(DFM(Vb%?Gx|~C`n9*Z)%6W}g{6<`)nD`_ z`7Y55Mf#vC>XunxY9txbM+~!PCHfl4jDASCx&pnvL9ej%;y}Nj?-IRGU^hV}G5R+P z{Xn4KLRi`Gdr4#5dxYqHZ*kG}4Q_>{b%A>~-z9FPPd`vGSoUd<)n*mHM9|`_Cw{gI zY_p0p^3KK+HRiOP8*s>9DkK|E)QD+^yiFn5c;YhIwnJX0ke4`a|1eNeFE?owhzp#uG&}Tl~#t6ORu529nO2#JVKAx3*`u zz?N-3z2e!BKdoQ3XP08@b|OuDk?yv|Hd#l!e3d=j%s<($~7_OP>yZDWbQ#x*_=VN)+&tlqx>7omq%0hF^I5LU(7kYFt4b2Tn_ZtHqm8bb6>QVno|$EZESJ6V?=Z#o zM>U_o%e!>~|K6M1mEgT;V_J0ruf~cKc*&o!45T({St^tGw_g2j_*oWg>lWQ$N?#nz zh3Pzje~5C_LJCLb>`GH?U9MMQP?`!0i(zcb2t)X4z>Vy18H7-nus%HF0H zRFk*)4Sk$)0zdD@irTkM;MIb00>4YBkWmP5dJ!%I=Sq$>7_T&8{m!Oy^tEWUMCzQDh*(;T1GrV7%B+-Mg!=p)c|sY3IZSP29UQKKp*7^ zd`G?0t2cI@!0Yg$UVKXJf{qd({mL^`SodKXjBgLAH~ZVC9gRr9A%&!8#n%FRBbx8!^(JPWh()#2&f0<_bvfzqnH>OH}!idMPqAKv)zmgYuD!Ld+8_(k+0p zLb!rsD+D@(7u87$(~{=MK^Fay&;Wz(;W9uX60QK2V~ndhGEPXNWCR-{k^$nNa2c>6 z3ztF2F*b*f0h_XL8NjKlM2MUPiXu0`E=LJ75S$*VT~Nn!^JI%!0hoJ^Sqkv?hRcB4 zYvB^;lz1F*8x&)JR=dbSyNo);TAPfO4>-oVaHAwzyfoS+BNz$<2KCc#&O2X55*BI~ zpm5=2v%lCBwf6F<*LKtuGbiCveDA3oUVSlUCL`YwS0nF!%6;;z!b;(N=nP~0%AO%B zY-CrqjTDd7v@9hpMa<+J;u-T|!Y&S^?U`L+;G-VzsAqN8B3zvIz(}!Zb_rl5qBP(U z4;+?;IPz;?tU?^Ou&HqiOhrT38mOqO=XAa}#