Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ValveSoftware/openvr.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Ludwig <joe@valvesoftware.com>2017-01-31 04:10:56 +0300
committerJoe Ludwig <joe@valvesoftware.com>2017-01-31 04:10:56 +0300
commit70acfe9262290ddb789588a7390e5fc60bb20080 (patch)
treed0c8312a429fa45016015af7d281a9e4abc1d83c
parentb96746068239d5571a4d1ff77577517cc4ca1326 (diff)
OpenVR SDK 1.0.6:
General: * Updated source code and cmake configurations for openvr_api.dll (and dylib/so) for applications that need a static library. * Added VREvent_PropertyChanged event, which is sent when any property changes. * Added VREvent_PrimaryDashboardDeviceChanged event, which is sent when the user changes the dashboard laser pointer from one controller to another. IVRCompositor: * Added initial support for DirectX 12 and OSX IOSurfaces. Use at your own risk. Forward compatibility is not guaranteed. * Added IVRCompositor::ReleaseMirrorTextureD3D11(). Call ReleaseMirrorTextureD3D11 instead of calling Release directly on the texture. IVRApplications: * Added GetCurrentSceneProcessId(), which returns the process ID of the latest process to call VR_Init with the Scene application type. Server driver Interface: * Greatly simplified IServerTrackedDeviceProvider::Init and its arguments. This function now takes only an IVRDriverContext. From there it can call GetGenericInterface to get the rest of the interface. * Added global accessor functions for drivers that are similar to those used by applications. Put this line at the start of your IServerTrackedDeviceProvider::Init function (and the equivalent line in Cleanup) to enable them: VR_INIT_SERVER_DRIVER_CONTEXT( pContext ); * IServerTrackedDeviceProvider no longer has enumeration functions for drivers. If the provider contains an HMD it should call TrackedDeviceAdded with the details of that HMD before Init returns. Other devices can be added at any time by calls to TrackedDeviceAdded. * IVRServerDriverHost::TrackedDeviceAdded now takes all the required values for a new tracked device, including the device class and device driver interface pointer. * Replace the property functions on ITrackedDeviceServerDriver with the IVRProperties interface and the CPropertyHelpers helper functions. This should result in significantly less boilerplate code in drivers and allows drivers to invalidate properties immediately instead of waiting for the client-side cache to expire. Use vr::VRProperties() to get the new helper interface. See the sample driver for details. * Added a new "enable" setting to all drivers that will prevent the driver DLL from being loaded. The enable flag has been removed from the sample driver. * IServerDriverHost has been renamed to IVRServerDriverHost no longer contains a few functions that are now handled by property setters. * GetSettings() is now handled with vr::VRSettings() * PhysicalIpdSet() is now handled by setting the Prop_UserIpdMeters_Float property. * TrackedDevicePropertiesChanged() is now handled automatically when a property is set. * MCImageUpdated() was undocumented and not useful outside the Lighthouse driver. It has been removed. CVRHiddenAreaHelpers: * This new helper class provides access to the hidden area mesh via the property system. You can access it with vr::VRHiddenArea() in a server driver. IDriverLog: * This interface has been renamed to IVRDriverLog IClientTrackedDeviceProvider: * Client drivers have been removed from the system. Drivers are no longer loaded into client processes. The functionality that used to be held in client drivers has moved: * BIsHmdPresent is implemented by looking for USB VID and PID values as specified in the driver manifest file: https://github.com/ValveSoftware/openvr/wiki/DriverManifest * GetHiddenAreaMesh is implemented via properties and the CVRHiddenAreaHelpers class. (See above) * GetMCImage was undocumented and not useful outside of the Lighthouse driver. It has been removed. * Watchdog mode, which allows SteamVR to start automatically on hardware activity, has been moved to a new driver type IVRWatchdogProvider. IVRWatchdogProvider: * This provider is only loaded in app type SteamWatchdog. It monitors the hardware for changes and calls vr::VRWatchdogHost()->WatchdogWakeUp() if an event occurs that should start SteamVR. This is entirely optional. A driver that doesn't implement this provider will just not wake up SteamVR on hardware activity. [git-p4: depot-paths = "//vr/steamvr/sdk_release/": change = 3811839]
-rw-r--r--CMakeLists.txt66
-rw-r--r--Toolchain-clang.cmake9
-rwxr-xr-xbin/linux64/libopenvr_api.sobin394088 -> 284733 bytes
-rwxr-xr-xbin/linux64/libopenvr_api.so.dbgbin3166719 -> 2401947 bytes
-rwxr-xr-xbin/osx32/libopenvr_api.dylibbin308788 -> 296540 bytes
-rw-r--r--bin/osx32/libopenvr_api.dylib.dSYM/Contents/Resources/DWARF/libopenvr_api.dylibbin2188041 -> 1994700 bytes
-rw-r--r--bin/win32/openvr_api.dllbin267040 -> 257312 bytes
-rw-r--r--bin/win32/openvr_api.pdbbin4599808 -> 4599808 bytes
-rw-r--r--bin/win64/openvr_api.dllbin314656 -> 302880 bytes
-rw-r--r--bin/win64/openvr_api.pdbbin4386816 -> 4386816 bytes
-rw-r--r--headers/openvr.h212
-rw-r--r--headers/openvr_api.cs191
-rw-r--r--headers/openvr_api.json77
-rw-r--r--headers/openvr_capi.h57
-rw-r--r--headers/openvr_driver.h1006
-rwxr-xr-xlib/linux64/libopenvr_api.sobin3159591 -> 2395531 bytes
-rw-r--r--lib/win32/openvr_api.libbin5750 -> 5750 bytes
-rw-r--r--lib/win64/openvr_api.libbin5668 -> 5668 bytes
-rw-r--r--samples/CMakeLists.txt66
-rw-r--r--samples/bin/drivers/sample/driver.vrdrivermanifest11
-rw-r--r--samples/bin/drivers/sample/resources/icons/headset_sample_status_error.pngbin0 -> 2951 bytes
-rw-r--r--samples/bin/drivers/sample/resources/icons/headset_sample_status_off.pngbin0 -> 1449 bytes
-rw-r--r--samples/bin/drivers/sample/resources/icons/headset_sample_status_ready.pngbin0 -> 2400 bytes
-rw-r--r--samples/bin/drivers/sample/resources/icons/headset_sample_status_ready_alert.pngbin0 -> 2889 bytes
-rw-r--r--samples/bin/drivers/sample/resources/icons/headset_sample_status_ready_low.pngbin0 -> 2909 bytes
-rw-r--r--samples/bin/drivers/sample/resources/icons/headset_sample_status_searching.gifbin0 -> 20840 bytes
-rw-r--r--samples/bin/drivers/sample/resources/icons/headset_sample_status_searching_alert.gifbin0 -> 23550 bytes
-rw-r--r--samples/bin/drivers/sample/resources/icons/headset_sample_status_standby.pngbin0 -> 1590 bytes
-rw-r--r--samples/bin/drivers/sample/resources/settings/default.vrsettings15
-rw-r--r--samples/bin/linux64/libopenvr_api.sobin394088 -> 284733 bytes
-rw-r--r--samples/bin/osx32/libopenvr_api.dylibbin308788 -> 296540 bytes
-rw-r--r--samples/bin/win32/openvr_api.dllbin267040 -> 257312 bytes
-rw-r--r--samples/bin/win64/openvr_api.dllbin314656 -> 302880 bytes
-rw-r--r--samples/driver_sample/driver_sample.cpp378
-rw-r--r--samples/driver_sample/driverlog.cpp22
-rw-r--r--samples/driver_sample/driverlog.h8
-rw-r--r--samples/hellovr_opengl/CMakeLists.txt10
-rw-r--r--samples/hellovr_opengl/hellovr_opengl.vcxproj2
-rw-r--r--samples/hellovr_opengl/hellovr_opengl.vcxproj.filters6
-rw-r--r--samples/hellovr_opengl/hellovr_opengl_main.cpp20
-rw-r--r--samples/helloworldoverlay/CMakeLists.txt10
-rw-r--r--samples/helloworldoverlay/openvroverlaycontroller.cpp4
-rw-r--r--samples/shared/compat.h3
-rw-r--r--samples/shared/pathtools.cpp397
-rw-r--r--samples/shared/pathtools.h37
-rw-r--r--samples/shared/strtools.cpp437
-rw-r--r--samples/shared/strtools.h130
-rwxr-xr-xsamples/thirdparty/sdl2-2.0.3/bin/linux64/libSDL2-2.0.so.0bin0 -> 1089260 bytes
-rwxr-xr-xsamples/thirdparty/sdl2-2.0.3/bin/linux64/libSDL2-2.0.so.0.dbgbin0 -> 5159574 bytes
-rw-r--r--samples/thirdparty/sdl2-2.0.3/bin/linux64/libSDL2.sobin0 -> 1089260 bytes
-rw-r--r--samples/thirdparty/sdl2-2.0.3/bin/linux64/libSDL2_static.abin0 -> 9124842 bytes
-rw-r--r--samples/tracked_camera_openvr_sample/CMakeLists.txt10
-rw-r--r--src/CMakeLists.txt80
-rw-r--r--src/openvr_api_public.cpp22
-rw-r--r--src/vrcommon/dirtools_public.cpp7
-rw-r--r--src/vrcommon/dirtools_public.h (renamed from src/vrcommon/dirtools.h)0
-rw-r--r--src/vrcommon/envvartools_public.cpp2
-rw-r--r--src/vrcommon/envvartools_public.h (renamed from src/vrcommon/envvartools.h)0
-rw-r--r--src/vrcommon/hmderrors_public.cpp3
-rw-r--r--src/vrcommon/hmderrors_public.h (renamed from src/vrcommon/hmderrors.h)2
-rw-r--r--src/vrcommon/pathtools_public.cpp9
-rw-r--r--src/vrcommon/pathtools_public.h (renamed from src/vrcommon/pathtools.h)0
-rw-r--r--src/vrcommon/sharedlibtools_public.cpp2
-rw-r--r--src/vrcommon/sharedlibtools_public.h (renamed from src/vrcommon/sharedlibtools.h)0
-rw-r--r--src/vrcommon/strtools_public.cpp2
-rw-r--r--src/vrcommon/strtools_public.h (renamed from src/vrcommon/strtools.h)0
-rw-r--r--src/vrcommon/vrpathregistry_public.cpp37
-rw-r--r--src/vrcommon/vrpathregistry_public.h (renamed from src/vrcommon/vrpathregistry.h)7
68 files changed, 2571 insertions, 786 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..ee4aff7
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,66 @@
+# Set the minimum required version of CMake for this project.
+cmake_minimum_required(VERSION 2.8)
+
+# Set project name.
+project(OpenVRSDK)
+
+# Setup some options.
+option(BUILD_SHARED "Builds the library as shared library" OFF)
+option(USE_LIBCXX "Uses libc++ instead of libstdc++" ON)
+option(USE_CUSTOM_LIBCXX "Uses a custom libc++" OFF)
+
+add_definitions( -DVR_API_PUBLIC )
+
+# Check if 32 or 64 bit system.
+set(SIZEOF_VOIDP ${CMAKE_SIZEOF_VOID_P})
+if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+ set(PROCESSOR_ARCH "64")
+else()
+ set(PROCESSOR_ARCH "32")
+endif()
+
+# Get platform.
+if(WIN32)
+ set(PLATFORM_NAME "win")
+elseif(UNIX AND NOT APPLE)
+ if(CMAKE_SYSTEM_NAME MATCHES ".*Linux")
+ set(PLATFORM_NAME "linux")
+ add_definitions(-DLINUX -DPOSIX)
+ if(PROCESSOR_ARCH MATCHES "64")
+ add_definitions(-DLINUX64)
+ endif()
+ endif()
+elseif(APPLE)
+ if(CMAKE_SYSTEM_NAME MATCHES ".*Darwin.*" OR CMAKE_SYSTEM_NAME MATCHES ".*MacOS.*")
+ set(PLATFORM_NAME "osx")
+ add_definitions(-DOSX -DPOSIX)
+ endif()
+endif()
+
+# Set output folder for static and shared libraries
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/${PLATFORM_NAME}${PROCESSOR_ARCH})
+set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/${PLATFORM_NAME}${PROCESSOR_ARCH})
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/${PLATFORM_NAME}${PROCESSOR_ARCH})
+
+# Enable some properties.
+if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang")
+ # Enable c++11 and hide symbols which shouldn't be visible
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fPIC -fvisibility=hidden")
+
+ # Set custom libc++ usage here
+ if(CMAKE_C_COMPILER_ID MATCHES "Clang" AND USE_LIBCXX)
+ if(USE_CUSTOM_LIBCXX)
+ if(BUILD_SHARED)
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -stdlib=libc++")
+ endif()
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -nostdinc++")
+ include_directories( ${LIBCXX_INCLUDE} ${LIBCXX_ABI_INCLUDE})
+ message(STATUS "Using custom libc++")
+ else()
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
+ message(STATUS "Using libc++")
+ endif()
+ endif()
+endif()
+
+add_subdirectory(src)
diff --git a/Toolchain-clang.cmake b/Toolchain-clang.cmake
new file mode 100644
index 0000000..fb6b0ac
--- /dev/null
+++ b/Toolchain-clang.cmake
@@ -0,0 +1,9 @@
+set(CMAKE_SYSTEM_NAME Linux)
+
+set(CMAKE_C_COMPILER clang)
+set(CMAKE_CXX_COMPILER clang++)
+
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
diff --git a/bin/linux64/libopenvr_api.so b/bin/linux64/libopenvr_api.so
index 7b6f2d2..eafad11 100755
--- a/bin/linux64/libopenvr_api.so
+++ b/bin/linux64/libopenvr_api.so
Binary files differ
diff --git a/bin/linux64/libopenvr_api.so.dbg b/bin/linux64/libopenvr_api.so.dbg
index c100646..877c284 100755
--- a/bin/linux64/libopenvr_api.so.dbg
+++ b/bin/linux64/libopenvr_api.so.dbg
Binary files differ
diff --git a/bin/osx32/libopenvr_api.dylib b/bin/osx32/libopenvr_api.dylib
index 647ec3f..b3da84f 100755
--- a/bin/osx32/libopenvr_api.dylib
+++ b/bin/osx32/libopenvr_api.dylib
Binary files differ
diff --git a/bin/osx32/libopenvr_api.dylib.dSYM/Contents/Resources/DWARF/libopenvr_api.dylib b/bin/osx32/libopenvr_api.dylib.dSYM/Contents/Resources/DWARF/libopenvr_api.dylib
index 67ae4da..8ca6951 100644
--- a/bin/osx32/libopenvr_api.dylib.dSYM/Contents/Resources/DWARF/libopenvr_api.dylib
+++ b/bin/osx32/libopenvr_api.dylib.dSYM/Contents/Resources/DWARF/libopenvr_api.dylib
Binary files differ
diff --git a/bin/win32/openvr_api.dll b/bin/win32/openvr_api.dll
index 7aa2b99..83ead53 100644
--- a/bin/win32/openvr_api.dll
+++ b/bin/win32/openvr_api.dll
Binary files differ
diff --git a/bin/win32/openvr_api.pdb b/bin/win32/openvr_api.pdb
index a5d24ae..a7bb091 100644
--- a/bin/win32/openvr_api.pdb
+++ b/bin/win32/openvr_api.pdb
Binary files differ
diff --git a/bin/win64/openvr_api.dll b/bin/win64/openvr_api.dll
index bbcccde..5767d72 100644
--- a/bin/win64/openvr_api.dll
+++ b/bin/win64/openvr_api.dll
Binary files differ
diff --git a/bin/win64/openvr_api.pdb b/bin/win64/openvr_api.pdb
index b2e1f15..082d478 100644
--- a/bin/win64/openvr_api.pdb
+++ b/bin/win64/openvr_api.pdb
Binary files differ
diff --git a/headers/openvr.h b/headers/openvr.h
index 6617b4d..19f2a0b 100644
--- a/headers/openvr.h
+++ b/headers/openvr.h
@@ -21,6 +21,10 @@ struct VkPhysicalDevice_T;
struct VkInstance_T;
struct VkQueue_T;
+// Forward declarations to avoid requiring d3d12.h
+struct ID3D12Resource;
+struct ID3D12CommandQueue;
+
namespace vr
{
@@ -116,6 +120,8 @@ 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 IOSurface
+ TextureType_DirectX12 = 4, // Handle is a pointer to a D3D12TextureData_t structure
};
enum EColorSpace
@@ -199,6 +205,30 @@ enum ETrackingUniverseOrigin
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. */
@@ -241,6 +271,8 @@ enum ETrackedDeviceProperty
Prop_DriverVersion_String = 1031,
Prop_Firmware_ForceUpdateRequired_Bool = 1032,
Prop_ViveSystemButtonFixRequired_Bool = 1033,
+ Prop_ParentDriver_Uint64 = 1034,
+
// Properties that are unique to TrackedDeviceClass_HMD
Prop_ReportsTimeSinceVSync_Bool = 2000,
@@ -281,6 +313,11 @@ enum ETrackedDeviceProperty
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_UsesDriverDirectMode_Bool = 2042,
// Properties that are unique to TrackedDeviceClass_Controller
Prop_AttachedDeviceId_String = 3000,
@@ -312,6 +349,14 @@ enum ETrackedDeviceProperty
Prop_NamedIconPathDeviceStandby_String = 5007, // PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others
Prop_NamedIconPathDeviceAlertLow_String = 5008, // PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others
+ // 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,
+
// Vendors are free to expose private debug data in this reserved region
Prop_VendorSpecific_Reserved_Start = 10000,
Prop_VendorSpecific_Reserved_End = 10999,
@@ -327,13 +372,14 @@ enum ETrackedPropertyError
TrackedProp_WrongDataType = 1,
TrackedProp_WrongDeviceClass = 2,
TrackedProp_BufferTooSmall = 3,
- TrackedProp_UnknownProperty = 4,
+ 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
@@ -376,6 +422,14 @@ struct VRVulkanTextureData_t
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
@@ -399,7 +453,7 @@ enum EVREventType
VREvent_TrackedDeviceActivated = 100,
VREvent_TrackedDeviceDeactivated = 101,
VREvent_TrackedDeviceUpdated = 102,
- VREvent_TrackedDeviceUserInteractionStarted = 103,
+ VREvent_TrackedDeviceUserInteractionStarted = 103,
VREvent_TrackedDeviceUserInteractionEnded = 104,
VREvent_IpdChanged = 105,
VREvent_EnterStandbyMode = 106,
@@ -407,6 +461,7 @@ enum EVREventType
VREvent_TrackedDeviceRoleChanged = 108,
VREvent_WatchdogWakeUpRequested = 109,
VREvent_LensDistortionChanged = 110,
+ VREvent_PropertyChanged = 111,
VREvent_ButtonPress = 200, // data is controller
VREvent_ButtonUnpress = 201, // data is controller
@@ -436,78 +491,81 @@ enum EVREventType
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_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,
+ 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_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_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_ChaperoneDataHasChanged = 800,
+ VREvent_ChaperoneUniverseHasChanged = 801,
+ VREvent_ChaperoneTempDataHasChanged = 802,
+ VREvent_ChaperoneSettingsHaveChanged = 803,
+ VREvent_SeatedZeroPoseReset = 804,
- VREvent_AudioSettingsHaveChanged = 820,
+ VREvent_AudioSettingsHaveChanged = 820,
- VREvent_BackgroundSettingHasChanged = 850,
- VREvent_CameraSettingsHaveChanged = 851,
- VREvent_ReprojectionSettingHasChanged = 852,
- VREvent_ModelSkinSettingsHaveChanged = 853,
- VREvent_EnvironmentSettingsHaveChanged = 854,
- VREvent_PowerSettingsHaveChanged = 855,
+ VREvent_BackgroundSettingHasChanged = 850,
+ VREvent_CameraSettingsHaveChanged = 851,
+ VREvent_ReprojectionSettingHasChanged = 852,
+ VREvent_ModelSkinSettingsHaveChanged = 853,
+ VREvent_EnvironmentSettingsHaveChanged = 854,
+ VREvent_PowerSettingsHaveChanged = 855,
- VREvent_StatusUpdate = 900,
+ VREvent_StatusUpdate = 900,
- VREvent_MCImageUpdated = 1000,
+ VREvent_MCImageUpdated = 1000,
- VREvent_FirmwareUpdateStarted = 1100,
- VREvent_FirmwareUpdateFinished = 1101,
+ VREvent_FirmwareUpdateStarted = 1100,
+ VREvent_FirmwareUpdateFinished = 1101,
- VREvent_KeyboardClosed = 1200,
- VREvent_KeyboardCharInput = 1201,
- VREvent_KeyboardDone = 1202, // Sent when DONE button clicked on keyboard
+ 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_ApplicationTransitionStarted = 1300,
+ VREvent_ApplicationTransitionAborted = 1301,
+ VREvent_ApplicationTransitionNewAppStarted = 1302,
+ VREvent_ApplicationListUpdated = 1303,
+ VREvent_ApplicationMimeTypeLoad = 1304,
+ VREvent_ApplicationTransitionNewAppLaunchComplete = 1305,
- VREvent_Compositor_MirrorWindowShown = 1400,
- VREvent_Compositor_MirrorWindowHidden = 1401,
- VREvent_Compositor_ChaperoneBoundsShown = 1410,
- VREvent_Compositor_ChaperoneBoundsHidden = 1411,
+ VREvent_Compositor_MirrorWindowShown = 1400,
+ VREvent_Compositor_MirrorWindowHidden = 1401,
+ VREvent_Compositor_ChaperoneBoundsShown = 1410,
+ VREvent_Compositor_ChaperoneBoundsHidden = 1411,
VREvent_TrackedCamera_StartVideoStream = 1500,
VREvent_TrackedCamera_StopVideoStream = 1501,
@@ -515,15 +573,15 @@ enum EVREventType
VREvent_TrackedCamera_ResumeVideoStream = 1503,
VREvent_TrackedCamera_EditingSurface = 1550,
- VREvent_PerformanceTest_EnableCapture = 1600,
- VREvent_PerformanceTest_DisableCapture = 1601,
- VREvent_PerformanceTest_FidelityLevel = 1602,
+ VREvent_PerformanceTest_EnableCapture = 1600,
+ VREvent_PerformanceTest_DisableCapture = 1601,
+ VREvent_PerformanceTest_FidelityLevel = 1602,
- VREvent_MessageOverlay_Closed = 1650,
+ VREvent_MessageOverlay_Closed = 1650,
// Vendors are free to expose private events in this reserved region
- VREvent_VendorSpecific_Reserved_Start = 10000,
- VREvent_VendorSpecific_Reserved_End = 19999,
+ VREvent_VendorSpecific_Reserved_Start = 10000,
+ VREvent_VendorSpecific_Reserved_End = 19999,
};
@@ -711,6 +769,12 @@ 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
{
@@ -733,6 +797,7 @@ typedef union
VREvent_ApplicationLaunch_t applicationLaunch;
VREvent_EditingCameraSurface_t cameraSurface;
VREvent_MessageOverlay_t messageOverlay;
+ VREvent_Property_t property;
} VREvent_Data_t;
/** An event posted by the server to all running applications */
@@ -764,6 +829,8 @@ enum EHiddenAreaMeshType
k_eHiddenAreaMesh_Standard = 0,
k_eHiddenAreaMesh_Inverse = 1,
k_eHiddenAreaMesh_LineLoop = 2,
+
+ k_eHiddenAreaMesh_Max = 3,
};
@@ -1173,9 +1240,7 @@ public:
/** [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. The index will
- * also be -1 if the headset is in direct mode on the driver side instead of using the compositor's
- * builtin direct mode support.
+ * 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;
@@ -1453,6 +1518,7 @@ namespace vr
VRApplicationProperty_IsDashboardOverlay_Bool = 60,
VRApplicationProperty_IsTemplate_Bool = 61,
VRApplicationProperty_IsInstanced_Bool = 62,
+ VRApplicationProperty_IsInternal_Bool = 63,
VRApplicationProperty_LastLaunchTime_Uint64 = 70,
};
@@ -1600,6 +1666,11 @@ namespace vr
* 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";
@@ -1708,7 +1779,6 @@ namespace vr
//-----------------------------------------------------------------------------
// null keys
static const char * const k_pch_Null_Section = "driver_null";
- static const char * const k_pch_Null_EnableNullDriver_Bool = "enable";
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";
@@ -1809,6 +1879,10 @@ namespace vr
// model skin keys
static const char * const k_pch_modelskin_Section = "modelskins";
+ //-----------------------------------------------------------------------------
+ // driver keys - These could be checked in any driver_<name> section
+ static const char * const k_pch_Driver_Enable_Bool = "enable";
+
} // namespace vr
// ivrchaperone.h
@@ -2237,8 +2311,10 @@ public:
/** 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. */
+ /** 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;
@@ -2258,7 +2334,7 @@ public:
};
-static const char * const IVRCompositor_Version = "IVRCompositor_019";
+static const char * const IVRCompositor_Version = "IVRCompositor_020";
} // namespace vr
diff --git a/headers/openvr_api.cs b/headers/openvr_api.cs
index 98e09ef..33bfd25 100644
--- a/headers/openvr_api.cs
+++ b/headers/openvr_api.cs
@@ -475,6 +475,11 @@ public struct IVRApplications
[MarshalAs(UnmanagedType.FunctionPtr)]
internal _LaunchInternalProcess LaunchInternalProcess;
+ [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+ internal delegate uint _GetCurrentSceneProcessId();
+ [MarshalAs(UnmanagedType.FunctionPtr)]
+ internal _GetCurrentSceneProcessId GetCurrentSceneProcessId;
+
}
[StructLayout(LayoutKind.Sequential)]
@@ -801,6 +806,11 @@ public struct IVRCompositor
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;
@@ -1613,13 +1623,61 @@ public class CVRSystem
HiddenAreaMesh_t result = FnTable.GetHiddenAreaMesh(eEye,type);
return result;
}
+// This is a terrible hack to workaround the fact that VRControllerState_t was
+// originally mis-compiled with the wrong packing for Linux and OSX.
+ [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+ internal delegate bool _GetControllerStatePacked(uint unControllerDeviceIndex,ref VRControllerState_t_Packed pControllerState,uint unControllerStateSize);
+ [StructLayout(LayoutKind.Explicit)]
+ struct GetControllerStateUnion
+ {
+ [FieldOffset(0)]
+ public IVRSystem._GetControllerState pGetControllerState;
+ [FieldOffset(0)]
+ public _GetControllerStatePacked pGetControllerStatePacked;
+ }
public bool GetControllerState(uint unControllerDeviceIndex,ref VRControllerState_t pControllerState,uint unControllerStateSize)
{
+ if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) ||
+ (System.Environment.OSVersion.Platform == System.PlatformID.Unix))
+ {
+ GetControllerStateUnion u;
+ VRControllerState_t_Packed state_packed = new VRControllerState_t_Packed();
+ u.pGetControllerStatePacked = null;
+ u.pGetControllerState = FnTable.GetControllerState;
+ bool packed_result = u.pGetControllerStatePacked(unControllerDeviceIndex,ref state_packed,(uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VRControllerState_t_Packed)));
+
+ state_packed.Unpack(ref pControllerState);
+ return packed_result;
+ }
bool result = FnTable.GetControllerState(unControllerDeviceIndex,ref pControllerState,unControllerStateSize);
return result;
}
+// This is a terrible hack to workaround the fact that VRControllerState_t was
+// originally mis-compiled with the wrong packing for Linux and OSX.
+ [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+ internal delegate bool _GetControllerStateWithPosePacked(ETrackingUniverseOrigin eOrigin,uint unControllerDeviceIndex,ref VRControllerState_t_Packed pControllerState,uint unControllerStateSize,ref TrackedDevicePose_t pTrackedDevicePose);
+ [StructLayout(LayoutKind.Explicit)]
+ struct GetControllerStateWithPoseUnion
+ {
+ [FieldOffset(0)]
+ public IVRSystem._GetControllerStateWithPose pGetControllerStateWithPose;
+ [FieldOffset(0)]
+ public _GetControllerStateWithPosePacked pGetControllerStateWithPosePacked;
+ }
public bool GetControllerStateWithPose(ETrackingUniverseOrigin eOrigin,uint unControllerDeviceIndex,ref VRControllerState_t pControllerState,uint unControllerStateSize,ref TrackedDevicePose_t pTrackedDevicePose)
{
+ if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) ||
+ (System.Environment.OSVersion.Platform == System.PlatformID.Unix))
+ {
+ GetControllerStateWithPoseUnion u;
+ VRControllerState_t_Packed state_packed = new VRControllerState_t_Packed();
+ u.pGetControllerStateWithPosePacked = null;
+ u.pGetControllerStateWithPose = FnTable.GetControllerStateWithPose;
+ bool packed_result = u.pGetControllerStateWithPosePacked(eOrigin,unControllerDeviceIndex,ref state_packed,(uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VRControllerState_t_Packed)),ref pTrackedDevicePose);
+
+ state_packed.Unpack(ref pControllerState);
+ return packed_result;
+ }
bool result = FnTable.GetControllerStateWithPose(eOrigin,unControllerDeviceIndex,ref pControllerState,unControllerStateSize,ref pTrackedDevicePose);
return result;
}
@@ -1939,6 +1997,11 @@ public class CVRApplications
EVRApplicationError result = FnTable.LaunchInternalProcess(pchBinaryPath,pchArguments,pchWorkingDirectory);
return result;
}
+ public uint GetCurrentSceneProcessId()
+ {
+ uint result = FnTable.GetCurrentSceneProcessId();
+ return result;
+ }
}
@@ -2269,6 +2332,10 @@ public class CVRCompositor
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;
@@ -2776,8 +2843,32 @@ public class CVRRenderModels
uint result = FnTable.GetComponentRenderModelName(pchRenderModelName,pchComponentName,pchComponentRenderModelName,unComponentRenderModelNameLen);
return result;
}
+// This is a terrible hack to workaround the fact that VRControllerState_t was
+// originally mis-compiled with the wrong packing for Linux and OSX.
+ [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+ internal delegate bool _GetComponentStatePacked(string pchRenderModelName,string pchComponentName,ref VRControllerState_t_Packed pControllerState,ref RenderModel_ControllerMode_State_t pState,ref RenderModel_ComponentState_t pComponentState);
+ [StructLayout(LayoutKind.Explicit)]
+ struct GetComponentStateUnion
+ {
+ [FieldOffset(0)]
+ public IVRRenderModels._GetComponentState pGetComponentState;
+ [FieldOffset(0)]
+ public _GetComponentStatePacked pGetComponentStatePacked;
+ }
public bool GetComponentState(string pchRenderModelName,string pchComponentName,ref VRControllerState_t pControllerState,ref RenderModel_ControllerMode_State_t pState,ref RenderModel_ComponentState_t pComponentState)
{
+ if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) ||
+ (System.Environment.OSVersion.Platform == System.PlatformID.Unix))
+ {
+ GetComponentStateUnion u;
+ VRControllerState_t_Packed state_packed = new VRControllerState_t_Packed();
+ u.pGetComponentStatePacked = null;
+ u.pGetComponentState = FnTable.GetComponentState;
+ bool packed_result = u.pGetComponentStatePacked(pchRenderModelName,pchComponentName,ref state_packed,ref pState,ref pComponentState);
+
+ state_packed.Unpack(ref pControllerState);
+ return packed_result;
+ }
bool result = FnTable.GetComponentState(pchRenderModelName,pchComponentName,ref pControllerState,ref pState,ref pComponentState);
return result;
}
@@ -2986,6 +3077,8 @@ public enum ETextureType
DirectX = 0,
OpenGL = 1,
Vulkan = 2,
+ IOSurface = 3,
+ DirectX12 = 4,
}
public enum EColorSpace
{
@@ -3058,6 +3151,7 @@ public enum ETrackedDeviceProperty
Prop_DriverVersion_String = 1031,
Prop_Firmware_ForceUpdateRequired_Bool = 1032,
Prop_ViveSystemButtonFixRequired_Bool = 1033,
+ Prop_ParentDriver_Uint64 = 1034,
Prop_ReportsTimeSinceVSync_Bool = 2000,
Prop_SecondsFromVsyncToPhotons_Float = 2001,
Prop_DisplayFrequency_Float = 2002,
@@ -3096,6 +3190,11 @@ public enum ETrackedDeviceProperty
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_UsesDriverDirectMode_Bool = 2042,
Prop_AttachedDeviceId_String = 3000,
Prop_SupportedButtons_Uint64 = 3001,
Prop_Axis0Type_Int32 = 3002,
@@ -3120,6 +3219,10 @@ public enum ETrackedDeviceProperty
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_VendorSpecific_Reserved_Start = 10000,
Prop_VendorSpecific_Reserved_End = 10999,
}
@@ -3136,6 +3239,7 @@ public enum ETrackedPropertyError
TrackedProp_StringExceedsMaximumLength = 8,
TrackedProp_NotYetAvailable = 9,
TrackedProp_PermissionDenied = 10,
+ TrackedProp_InvalidOperation = 11,
}
public enum EVRSubmitFlags
{
@@ -3170,6 +3274,7 @@ public enum EVREventType
VREvent_TrackedDeviceRoleChanged = 108,
VREvent_WatchdogWakeUpRequested = 109,
VREvent_LensDistortionChanged = 110,
+ VREvent_PropertyChanged = 111,
VREvent_ButtonPress = 200,
VREvent_ButtonUnpress = 201,
VREvent_ButtonTouch = 202,
@@ -3216,6 +3321,7 @@ public enum EVREventType
VREvent_ScreenshotFailed = 522,
VREvent_SubmitScreenshotToDashboard = 523,
VREvent_ScreenshotProgressToDashboard = 524,
+ VREvent_PrimaryDashboardDeviceChanged = 525,
VREvent_Notification_Shown = 600,
VREvent_Notification_Hidden = 601,
VREvent_Notification_BeginInteraction = 602,
@@ -3249,6 +3355,7 @@ public enum EVREventType
VREvent_ApplicationTransitionNewAppStarted = 1302,
VREvent_ApplicationListUpdated = 1303,
VREvent_ApplicationMimeTypeLoad = 1304,
+ VREvent_ApplicationTransitionNewAppLaunchComplete = 1305,
VREvent_Compositor_MirrorWindowShown = 1400,
VREvent_Compositor_MirrorWindowHidden = 1401,
VREvent_Compositor_ChaperoneBoundsShown = 1410,
@@ -3305,6 +3412,7 @@ public enum EHiddenAreaMeshType
k_eHiddenAreaMesh_Standard = 0,
k_eHiddenAreaMesh_Inverse = 1,
k_eHiddenAreaMesh_LineLoop = 2,
+ k_eHiddenAreaMesh_Max = 3,
}
public enum EVRControllerAxisType
{
@@ -3536,6 +3644,7 @@ public enum EVRApplicationProperty
IsDashboardOverlay_Bool = 60,
IsTemplate_Bool = 61,
IsInstanced_Bool = 62,
+ IsInternal_Bool = 63,
LastLaunchTime_Uint64 = 70,
}
public enum EVRApplicationTransitionState
@@ -3863,6 +3972,12 @@ public enum EVRScreenshotError
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;
@@ -3960,6 +4075,11 @@ public enum EVRScreenshotError
{
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;
@@ -3988,6 +4108,29 @@ public enum EVRScreenshotError
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 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;
@@ -4116,6 +4259,19 @@ public enum EVRScreenshotError
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 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 *
@@ -4124,6 +4280,23 @@ public enum EVRScreenshotError
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 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)]
@@ -4200,6 +4373,20 @@ public class OpenVR
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;
@@ -4213,7 +4400,7 @@ public class OpenVR
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_019";
+ public const string IVRCompositor_Version = "IVRCompositor_020";
public const uint k_unVROverlayMaxKeyLength = 128;
public const uint k_unVROverlayMaxNameLength = 128;
public const uint k_unMaxOverlayCount = 64;
@@ -4280,7 +4467,6 @@ public class OpenVR
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_EnableNullDriver_Bool = "enable";
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";
@@ -4350,6 +4536,7 @@ public class OpenVR
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";
diff --git a/headers/openvr_api.json b/headers/openvr_api.json
index 24509ee..688e137 100644
--- a/headers/openvr_api.json
+++ b/headers/openvr_api.json
@@ -3,6 +3,8 @@
,{"typedef": "vr::glUInt_t","type": "uint32_t"}
,{"typedef": "vr::SharedTextureHandle_t","type": "uint64_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"}
@@ -37,6 +39,8 @@
{"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"}
@@ -103,6 +107,7 @@
,{"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_ReportsTimeSinceVSync_Bool","value": "2000"}
,{"name": "Prop_SecondsFromVsyncToPhotons_Float","value": "2001"}
,{"name": "Prop_DisplayFrequency_Float","value": "2002"}
@@ -141,6 +146,11 @@
,{"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_UsesDriverDirectMode_Bool","value": "2042"}
,{"name": "Prop_AttachedDeviceId_String","value": "3000"}
,{"name": "Prop_SupportedButtons_Uint64","value": "3001"}
,{"name": "Prop_Axis0Type_Int32","value": "3002"}
@@ -165,6 +175,10 @@
,{"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_VendorSpecific_Reserved_Start","value": "10000"}
,{"name": "Prop_VendorSpecific_Reserved_End","value": "10999"}
]}
@@ -180,6 +194,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"}
@@ -211,6 +226,7 @@
,{"name": "VREvent_TrackedDeviceRoleChanged","value": "108"}
,{"name": "VREvent_WatchdogWakeUpRequested","value": "109"}
,{"name": "VREvent_LensDistortionChanged","value": "110"}
+ ,{"name": "VREvent_PropertyChanged","value": "111"}
,{"name": "VREvent_ButtonPress","value": "200"}
,{"name": "VREvent_ButtonUnpress","value": "201"}
,{"name": "VREvent_ButtonTouch","value": "202"}
@@ -257,6 +273,7 @@
,{"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"}
@@ -290,6 +307,7 @@
,{"name": "VREvent_ApplicationTransitionNewAppStarted","value": "1302"}
,{"name": "VREvent_ApplicationListUpdated","value": "1303"}
,{"name": "VREvent_ApplicationMimeTypeLoad","value": "1304"}
+ ,{"name": "VREvent_ApplicationTransitionNewAppLaunchComplete","value": "1305"}
,{"name": "VREvent_Compositor_MirrorWindowShown","value": "1400"}
,{"name": "VREvent_Compositor_MirrorWindowHidden","value": "1401"}
,{"name": "VREvent_Compositor_ChaperoneBoundsShown","value": "1410"}
@@ -342,6 +360,7 @@
{"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"}
@@ -559,6 +578,7 @@
,{"name": "VRApplicationProperty_IsDashboardOverlay_Bool","value": "60"}
,{"name": "VRApplicationProperty_IsTemplate_Bool","value": "61"}
,{"name": "VRApplicationProperty_IsInstanced_Bool","value": "62"}
+ ,{"name": "VRApplicationProperty_IsInternal_Bool","value": "63"}
,{"name": "VRApplicationProperty_LastLaunchTime_Uint64","value": "70"}
]}
, {"enumname": "vr::EVRApplicationTransitionState","values": [
@@ -718,6 +738,34 @@
,{
"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"}
@@ -744,7 +792,7 @@
,{
"constname": "IVRChaperoneSetup_Version","consttype": "const char *const", "constval": "IVRChaperoneSetup_005"}
,{
- "constname": "IVRCompositor_Version","consttype": "const char *const", "constval": "IVRCompositor_019"}
+ "constname": "IVRCompositor_Version","consttype": "const char *const", "constval": "IVRCompositor_020"}
,{
"constname": "k_unVROverlayMaxKeyLength","consttype": "const uint32_t", "constval": "128"}
,{
@@ -878,8 +926,6 @@
,{
"constname": "k_pch_Null_Section","consttype": "const char *const", "constval": "driver_null"}
,{
- "constname": "k_pch_Null_EnableNullDriver_Bool","consttype": "const char *const", "constval": "enable"}
-,{
"constname": "k_pch_Null_SerialNumber_String","consttype": "const char *const", "constval": "serialNumber"}
,{
"constname": "k_pch_Null_ModelNumber_String","consttype": "const char *const", "constval": "modelNumber"}
@@ -1018,6 +1064,8 @@
,{
"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"}
@@ -1080,6 +1128,10 @@
{ "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": [
@@ -1136,6 +1188,9 @@
{ "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"},
@@ -1155,7 +1210,8 @@
{ "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": "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"},
@@ -2095,6 +2151,11 @@
]
}
,{
+ "classname": "vr::IVRApplications",
+ "methodname": "GetCurrentSceneProcessId",
+ "returntype": "uint32_t"
+}
+,{
"classname": "vr::IVRChaperone",
"methodname": "GetCalibrationState",
"returntype": "vr::ChaperoneCalibrationState"
@@ -2561,6 +2622,14 @@
}
,{
"classname": "vr::IVRCompositor",
+ "methodname": "ReleaseMirrorTextureD3D11",
+ "returntype": "void",
+ "params": [
+{ "paramname": "pD3D11ShaderResourceView" ,"paramtype": "void *"}
+ ]
+}
+,{
+ "classname": "vr::IVRCompositor",
"methodname": "GetMirrorTextureGL",
"returntype": "vr::EVRCompositorError",
"params": [
diff --git a/headers/openvr_capi.h b/headers/openvr_capi.h
index daffdfb..a7ab2cf 100644
--- a/headers/openvr_capi.h
+++ b/headers/openvr_capi.h
@@ -50,6 +50,9 @@ typedef char bool;
#include <stdbool.h>
#endif
+typedef uint64_t PropertyContainerHandle_t;
+typedef uint32_t PropertyTypeTag_t;
+
// OpenVR Constants
@@ -58,6 +61,20 @@ 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;
@@ -71,7 +88,7 @@ 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_019";
+static const char * IVRCompositor_Version = "IVRCompositor_020";
static const unsigned int k_unVROverlayMaxKeyLength = 128;
static const unsigned int k_unVROverlayMaxNameLength = 128;
static const unsigned int k_unMaxOverlayCount = 64;
@@ -138,7 +155,6 @@ static const char * k_pch_Lighthouse_DisambiguationDebug_Int32 = "disambiguation
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_EnableNullDriver_Bool = "enable";
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";
@@ -208,6 +224,7 @@ 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";
@@ -224,6 +241,8 @@ 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
@@ -302,6 +321,7 @@ typedef enum ETrackedDeviceProperty
ETrackedDeviceProperty_Prop_DriverVersion_String = 1031,
ETrackedDeviceProperty_Prop_Firmware_ForceUpdateRequired_Bool = 1032,
ETrackedDeviceProperty_Prop_ViveSystemButtonFixRequired_Bool = 1033,
+ ETrackedDeviceProperty_Prop_ParentDriver_Uint64 = 1034,
ETrackedDeviceProperty_Prop_ReportsTimeSinceVSync_Bool = 2000,
ETrackedDeviceProperty_Prop_SecondsFromVsyncToPhotons_Float = 2001,
ETrackedDeviceProperty_Prop_DisplayFrequency_Float = 2002,
@@ -340,6 +360,11 @@ typedef enum ETrackedDeviceProperty
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_UsesDriverDirectMode_Bool = 2042,
ETrackedDeviceProperty_Prop_AttachedDeviceId_String = 3000,
ETrackedDeviceProperty_Prop_SupportedButtons_Uint64 = 3001,
ETrackedDeviceProperty_Prop_Axis0Type_Int32 = 3002,
@@ -364,6 +389,10 @@ typedef enum ETrackedDeviceProperty
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_VendorSpecific_Reserved_Start = 10000,
ETrackedDeviceProperty_Prop_VendorSpecific_Reserved_End = 10999,
} ETrackedDeviceProperty;
@@ -381,6 +410,7 @@ typedef enum ETrackedPropertyError
ETrackedPropertyError_TrackedProp_StringExceedsMaximumLength = 8,
ETrackedPropertyError_TrackedProp_NotYetAvailable = 9,
ETrackedPropertyError_TrackedProp_PermissionDenied = 10,
+ ETrackedPropertyError_TrackedProp_InvalidOperation = 11,
} ETrackedPropertyError;
typedef enum EVRSubmitFlags
@@ -418,6 +448,7 @@ typedef enum EVREventType
EVREventType_VREvent_TrackedDeviceRoleChanged = 108,
EVREventType_VREvent_WatchdogWakeUpRequested = 109,
EVREventType_VREvent_LensDistortionChanged = 110,
+ EVREventType_VREvent_PropertyChanged = 111,
EVREventType_VREvent_ButtonPress = 200,
EVREventType_VREvent_ButtonUnpress = 201,
EVREventType_VREvent_ButtonTouch = 202,
@@ -464,6 +495,7 @@ typedef enum EVREventType
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,
@@ -497,6 +529,7 @@ typedef enum EVREventType
EVREventType_VREvent_ApplicationTransitionNewAppStarted = 1302,
EVREventType_VREvent_ApplicationListUpdated = 1303,
EVREventType_VREvent_ApplicationMimeTypeLoad = 1304,
+ EVREventType_VREvent_ApplicationTransitionNewAppLaunchComplete = 1305,
EVREventType_VREvent_Compositor_MirrorWindowShown = 1400,
EVREventType_VREvent_Compositor_MirrorWindowHidden = 1401,
EVREventType_VREvent_Compositor_ChaperoneBoundsShown = 1410,
@@ -557,6 +590,7 @@ 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
@@ -802,6 +836,7 @@ typedef enum EVRApplicationProperty
EVRApplicationProperty_VRApplicationProperty_IsDashboardOverlay_Bool = 60,
EVRApplicationProperty_VRApplicationProperty_IsTemplate_Bool = 61,
EVRApplicationProperty_VRApplicationProperty_IsInstanced_Bool = 62,
+ EVRApplicationProperty_VRApplicationProperty_IsInternal_Bool = 63,
EVRApplicationProperty_VRApplicationProperty_LastLaunchTime_Uint64 = 70,
} EVRApplicationProperty;
@@ -994,11 +1029,14 @@ typedef enum EVRScreenshotError
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 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;
@@ -1126,6 +1164,13 @@ typedef struct VRVulkanTextureData_t
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;
@@ -1239,6 +1284,12 @@ 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 *
@@ -1577,6 +1628,7 @@ struct VR_IVRApplications_FnTable
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
@@ -1651,6 +1703,7 @@ struct VR_IVRCompositor_FnTable
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);
diff --git a/headers/openvr_driver.h b/headers/openvr_driver.h
index c2d550e..455f8e8 100644
--- a/headers/openvr_driver.h
+++ b/headers/openvr_driver.h
@@ -21,6 +21,10 @@ struct VkPhysicalDevice_T;
struct VkInstance_T;
struct VkQueue_T;
+// Forward declarations to avoid requiring d3d12.h
+struct ID3D12Resource;
+struct ID3D12CommandQueue;
+
namespace vr
{
@@ -116,6 +120,8 @@ 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 IOSurface
+ TextureType_DirectX12 = 4, // Handle is a pointer to a D3D12TextureData_t structure
};
enum EColorSpace
@@ -199,6 +205,30 @@ enum ETrackingUniverseOrigin
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. */
@@ -241,6 +271,8 @@ enum ETrackedDeviceProperty
Prop_DriverVersion_String = 1031,
Prop_Firmware_ForceUpdateRequired_Bool = 1032,
Prop_ViveSystemButtonFixRequired_Bool = 1033,
+ Prop_ParentDriver_Uint64 = 1034,
+
// Properties that are unique to TrackedDeviceClass_HMD
Prop_ReportsTimeSinceVSync_Bool = 2000,
@@ -281,6 +313,11 @@ enum ETrackedDeviceProperty
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_UsesDriverDirectMode_Bool = 2042,
// Properties that are unique to TrackedDeviceClass_Controller
Prop_AttachedDeviceId_String = 3000,
@@ -312,6 +349,14 @@ enum ETrackedDeviceProperty
Prop_NamedIconPathDeviceStandby_String = 5007, // PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others
Prop_NamedIconPathDeviceAlertLow_String = 5008, // PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others
+ // 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,
+
// Vendors are free to expose private debug data in this reserved region
Prop_VendorSpecific_Reserved_Start = 10000,
Prop_VendorSpecific_Reserved_End = 10999,
@@ -327,13 +372,14 @@ enum ETrackedPropertyError
TrackedProp_WrongDataType = 1,
TrackedProp_WrongDeviceClass = 2,
TrackedProp_BufferTooSmall = 3,
- TrackedProp_UnknownProperty = 4,
+ 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
@@ -376,6 +422,14 @@ struct VRVulkanTextureData_t
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
@@ -399,7 +453,7 @@ enum EVREventType
VREvent_TrackedDeviceActivated = 100,
VREvent_TrackedDeviceDeactivated = 101,
VREvent_TrackedDeviceUpdated = 102,
- VREvent_TrackedDeviceUserInteractionStarted = 103,
+ VREvent_TrackedDeviceUserInteractionStarted = 103,
VREvent_TrackedDeviceUserInteractionEnded = 104,
VREvent_IpdChanged = 105,
VREvent_EnterStandbyMode = 106,
@@ -407,6 +461,7 @@ enum EVREventType
VREvent_TrackedDeviceRoleChanged = 108,
VREvent_WatchdogWakeUpRequested = 109,
VREvent_LensDistortionChanged = 110,
+ VREvent_PropertyChanged = 111,
VREvent_ButtonPress = 200, // data is controller
VREvent_ButtonUnpress = 201, // data is controller
@@ -436,78 +491,81 @@ enum EVREventType
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_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,
+ 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_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_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_ChaperoneDataHasChanged = 800,
+ VREvent_ChaperoneUniverseHasChanged = 801,
+ VREvent_ChaperoneTempDataHasChanged = 802,
+ VREvent_ChaperoneSettingsHaveChanged = 803,
+ VREvent_SeatedZeroPoseReset = 804,
- VREvent_AudioSettingsHaveChanged = 820,
+ VREvent_AudioSettingsHaveChanged = 820,
- VREvent_BackgroundSettingHasChanged = 850,
- VREvent_CameraSettingsHaveChanged = 851,
- VREvent_ReprojectionSettingHasChanged = 852,
- VREvent_ModelSkinSettingsHaveChanged = 853,
- VREvent_EnvironmentSettingsHaveChanged = 854,
- VREvent_PowerSettingsHaveChanged = 855,
+ VREvent_BackgroundSettingHasChanged = 850,
+ VREvent_CameraSettingsHaveChanged = 851,
+ VREvent_ReprojectionSettingHasChanged = 852,
+ VREvent_ModelSkinSettingsHaveChanged = 853,
+ VREvent_EnvironmentSettingsHaveChanged = 854,
+ VREvent_PowerSettingsHaveChanged = 855,
- VREvent_StatusUpdate = 900,
+ VREvent_StatusUpdate = 900,
- VREvent_MCImageUpdated = 1000,
+ VREvent_MCImageUpdated = 1000,
- VREvent_FirmwareUpdateStarted = 1100,
- VREvent_FirmwareUpdateFinished = 1101,
+ VREvent_FirmwareUpdateStarted = 1100,
+ VREvent_FirmwareUpdateFinished = 1101,
- VREvent_KeyboardClosed = 1200,
- VREvent_KeyboardCharInput = 1201,
- VREvent_KeyboardDone = 1202, // Sent when DONE button clicked on keyboard
+ 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_ApplicationTransitionStarted = 1300,
+ VREvent_ApplicationTransitionAborted = 1301,
+ VREvent_ApplicationTransitionNewAppStarted = 1302,
+ VREvent_ApplicationListUpdated = 1303,
+ VREvent_ApplicationMimeTypeLoad = 1304,
+ VREvent_ApplicationTransitionNewAppLaunchComplete = 1305,
- VREvent_Compositor_MirrorWindowShown = 1400,
- VREvent_Compositor_MirrorWindowHidden = 1401,
- VREvent_Compositor_ChaperoneBoundsShown = 1410,
- VREvent_Compositor_ChaperoneBoundsHidden = 1411,
+ VREvent_Compositor_MirrorWindowShown = 1400,
+ VREvent_Compositor_MirrorWindowHidden = 1401,
+ VREvent_Compositor_ChaperoneBoundsShown = 1410,
+ VREvent_Compositor_ChaperoneBoundsHidden = 1411,
VREvent_TrackedCamera_StartVideoStream = 1500,
VREvent_TrackedCamera_StopVideoStream = 1501,
@@ -515,15 +573,15 @@ enum EVREventType
VREvent_TrackedCamera_ResumeVideoStream = 1503,
VREvent_TrackedCamera_EditingSurface = 1550,
- VREvent_PerformanceTest_EnableCapture = 1600,
- VREvent_PerformanceTest_DisableCapture = 1601,
- VREvent_PerformanceTest_FidelityLevel = 1602,
+ VREvent_PerformanceTest_EnableCapture = 1600,
+ VREvent_PerformanceTest_DisableCapture = 1601,
+ VREvent_PerformanceTest_FidelityLevel = 1602,
- VREvent_MessageOverlay_Closed = 1650,
+ VREvent_MessageOverlay_Closed = 1650,
// Vendors are free to expose private events in this reserved region
- VREvent_VendorSpecific_Reserved_Start = 10000,
- VREvent_VendorSpecific_Reserved_End = 19999,
+ VREvent_VendorSpecific_Reserved_Start = 10000,
+ VREvent_VendorSpecific_Reserved_End = 19999,
};
@@ -711,6 +769,12 @@ 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
{
@@ -733,6 +797,7 @@ typedef union
VREvent_ApplicationLaunch_t applicationLaunch;
VREvent_EditingCameraSurface_t cameraSurface;
VREvent_MessageOverlay_t messageOverlay;
+ VREvent_Property_t property;
} VREvent_Data_t;
/** An event posted by the server to all running applications */
@@ -764,6 +829,8 @@ enum EHiddenAreaMeshType
k_eHiddenAreaMesh_Standard = 0,
k_eHiddenAreaMesh_Inverse = 1,
k_eHiddenAreaMesh_LineLoop = 2,
+
+ k_eHiddenAreaMesh_Max = 3,
};
@@ -1325,7 +1392,6 @@ namespace vr
//-----------------------------------------------------------------------------
// null keys
static const char * const k_pch_Null_Section = "driver_null";
- static const char * const k_pch_Null_EnableNullDriver_Bool = "enable";
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";
@@ -1426,6 +1492,10 @@ namespace vr
// model skin keys
static const char * const k_pch_modelskin_Section = "modelskins";
+ //-----------------------------------------------------------------------------
+ // driver keys - These could be checked in any driver_<name> section
+ static const char * const k_pch_Driver_Enable_Bool = "enable";
+
} // namespace vr
// iservertrackeddevicedriver.h
@@ -1543,37 +1613,11 @@ public:
// Tracking Methods
// ------------------------------------
virtual DriverPose_t GetPose() = 0;
-
- // ------------------------------------
- // Property Methods
- // ------------------------------------
-
- /** Returns a bool property. If the property is not available this function will return false. */
- virtual bool GetBoolTrackedDeviceProperty( ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) = 0;
-
- /** Returns a float property. If the property is not available this function will return 0. */
- virtual float GetFloatTrackedDeviceProperty( ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) = 0;
-
- /** Returns an int property. If the property is not available this function will return 0. */
- virtual int32_t GetInt32TrackedDeviceProperty( ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) = 0;
-
- /** Returns a uint64 property. If the property is not available this function will return 0. */
- virtual uint64_t GetUint64TrackedDeviceProperty( ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) = 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( ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) = 0;
-
- /** Returns a string property. If the property is not available this function will return 0 and pError will be
- * set to an error. Otherwise it returns the length of the number of bytes necessary to hold this string including
- * the trailing null. If the buffer is too small the error will be TrackedProp_BufferTooSmall. Drivers may not
- * return strings longer than k_unMaxPropertyStringSize. */
- virtual uint32_t GetStringTrackedDeviceProperty( ETrackedDeviceProperty prop, char *pchValue, uint32_t unBufferSize, ETrackedPropertyError *pError ) = 0;
-
};
-static const char *ITrackedDeviceServerDriver_Version = "ITrackedDeviceServerDriver_004";
+static const char *ITrackedDeviceServerDriver_Version = "ITrackedDeviceServerDriver_005";
}
// ivrdisplaycomponent.h
@@ -1745,73 +1789,21 @@ namespace vr
class ITrackedDeviceServerDriver;
struct TrackedDeviceDriverInfo_t;
struct DriverPose_t;
-
-class IDriverLog
-{
-public:
- /** Writes a log message to the log file prefixed with the driver name */
- virtual void Log( const char *pchLogMessage ) = 0;
-};
+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 IServerDriverHost
+class IVRDriverContext
{
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 ) = 0;
-
- /** Notifies the server that a tracked device's pose has been updated */
- virtual void TrackedDevicePoseUpdated( uint32_t unWhichDevice, const DriverPose_t & newPose ) = 0;
+ /** 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;
- /** Notifies the server that the property cache for the specified device should be invalidated */
- virtual void TrackedDevicePropertiesChanged( uint32_t unWhichDevice ) = 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 MC image has been updated for the display attached to the device. This is
- * only permitted on devices of the HMD class. */
- virtual void MCImageUpdated() = 0;
-
- /** always returns a pointer to a valid interface pointer of IVRSettings */
- virtual IVRSettings *GetSettings( const char *pchInterfaceVersion ) = 0;
-
- /** Notifies the server that the physical IPD adjustment has been moved on the HMD */
- virtual void PhysicalIpdSet( uint32_t unWhichDevice, float fPhysicalIpdMeters ) = 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;
+ /** Returns the property container handle for this driver */
+ virtual DriverHandle_t GetDriverHandle() = 0;
};
@@ -1828,7 +1820,7 @@ public:
* config files.
* pchDriverInstallDir - The absolute path of the root directory for the driver.
*/
- virtual EVRInitError Init( IDriverLog *pDriverLog, vr::IServerDriverHost *pDriverHost, const char *pchUserDriverConfigDir, const char *pchDriverInstallDir ) = 0;
+ virtual EVRInitError Init( IVRDriverContext *pDriverContext ) = 0;
/** cleans up the driver right before it is unloaded */
virtual void Cleanup() = 0;
@@ -1836,15 +1828,6 @@ public:
/** Returns the version of the ITrackedDeviceServerDriver interface used by this driver */
virtual const char * const *GetInterfaceVersions() = 0;
- /** returns the number of HMDs that this driver manages that are physically connected. */
- virtual uint32_t GetTrackedDeviceCount() = 0;
-
- /** returns a single HMD */
- virtual ITrackedDeviceServerDriver *GetTrackedDeviceDriver( uint32_t unWhich ) = 0;
-
- /** returns a single HMD by ID */
- virtual ITrackedDeviceServerDriver* FindTrackedDeviceDriver( const char *pchId ) = 0;
-
/** Allows the driver do to some work in the main loop of the server. */
virtual void RunFrame() = 0;
@@ -1865,104 +1848,497 @@ public:
};
-static const char *IServerTrackedDeviceProvider_Version = "IServerTrackedDeviceProvider_003";
+static const char *IServerTrackedDeviceProvider_Version = "IServerTrackedDeviceProvider_004";
-/** This interface is provided by vrclient to allow the driver call back and query various information */
-class IClientDriverHost
+
+
+/** This interface must be implemented in each driver. It will be loaded in vrclient.dll */
+class IVRWatchdogProvider
{
public:
- /** 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;
+ /** initializes the driver in watchdog mode. */
+ virtual EVRInitError Init( IVRDriverContext *pDriverContext ) = 0;
- /** Returns true if there is a device connected in this slot. */
- virtual bool IsTrackedDeviceConnected( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0;
+ /** cleans up the driver right before it is unloaded */
+ virtual void Cleanup() = 0;
+};
+
+static const char *IVRWatchdogProvider_Version = "IVRWatchdogProvider_001";
+
+}
+// ivrproperties.h
+#include <string>
+
+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:
- /** 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;
+ /** 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;
- /** 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;
+ /** 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 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 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 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 container handle given a tracked device index */
+ virtual PropertyContainerHandle_t TrackedDeviceToPropertyContainer( TrackedDeviceIndex_t nDevice ) = 0;
- /** Returns a string property. If the device index is not valid or the property is not a float type this function will
+};
+
+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 generally fit in buffers of k_unTrackingStringSize characters. */
- virtual uint32_t GetStringTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, char *pchValue, uint32_t unBufferSize, ETrackedPropertyError *pError = 0L ) = 0;
+ * 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 );
- /** always returns a pointer to a valid interface pointer of IVRSettings */
- virtual void *GetGenericInterface( const char *pchInterfaceVersion ) = 0;
- /** 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;
+ /** 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<typename T>
+ T GetPropertyHelper( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError, T bDefault, PropertyTypeTag_t unTypeTag );
+
+ IVRProperties *m_pProperties;
};
-/** Defines the mode that the client driver should start in. */
-enum EClientDriverMode
+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 )
{
- ClientDriverMode_Normal = 0,
- ClientDriverMode_Watchdog = 1, // client should return VRInitError_Init_LowPowerWatchdogNotSupported if it can't support this mode
+ 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<typename T>
+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<bool>( ulContainerHandle, prop, pError, false, k_unBoolPropertyTag );
+}
+
+
+inline float CVRPropertyHelpers::GetFloatProperty( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError )
+{
+ return GetPropertyHelper<float>( ulContainerHandle, prop, pError, 0.f, k_unFloatPropertyTag );
+}
+
+inline int32_t CVRPropertyHelpers::GetInt32Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError )
+{
+ return GetPropertyHelper<int32_t>( ulContainerHandle, prop, pError, 0, k_unInt32PropertyTag );
+}
+
+inline uint64_t CVRPropertyHelpers::GetUint64Property( PropertyContainerHandle_t ulContainerHandle, ETrackedDeviceProperty prop, ETrackedPropertyError *pError )
+{
+ return GetPropertyHelper<uint64_t>( 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;
};
-/** This interface must be implemented in each driver. It will be loaded in vrclient.dll */
-class IClientTrackedDeviceProvider
+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:
- /** initializes the driver. This will be called before any other methods are called,
- * except BIsHmdPresent(). BIsHmdPresent is called outside of the Init/Cleanup pair.
- * 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 IClientDriverHost 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( EClientDriverMode eDriverMode, IDriverLog *pDriverLog, vr::IClientDriverHost *pDriverHost, const char *pchUserDriverConfigDir, const char *pchDriverInstallDir ) = 0;
+ /** 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;
- /** cleans up the driver right before it is unloaded */
- virtual void Cleanup() = 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;
- /** Called when the client needs to inform an application if an HMD is attached that uses
- * this driver. This method should be as lightweight as possible and should have no side effects
- * such as hooking process functions or leaving resources loaded. Init will not be called before
- * this method and Cleanup will not be called after it.
- */
- virtual bool BIsHmdPresent( const char *pchUserConfigDir ) = 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;
- /** called when the client inits an HMD to let the client driver know which one is in use */
- virtual EVRInitError SetDisplayId( const char *pchDisplayId ) = 0;
+ /** notifies the server that the button was pressed */
+ virtual void TrackedDeviceButtonPressed( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0;
- /** Returns the stencil mesh information for the current HMD. If this HMD does not have a stencil 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. The pixels covered by this mesh will never be seen by the user after the lens distortion is applied and based on visibility to the panels.
- * This will improve perf 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.
- */
- virtual HiddenAreaMesh_t GetHiddenAreaMesh( EVREye eEye, EHiddenAreaMeshType type ) = 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;
+};
+
+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);
+ }
- /** Get the MC image for the current HMD.
- * Returns the size in bytes of the buffer required to hold the specified resource. */
- virtual uint32_t GetMCImage( uint32_t *pImgWidth, uint32_t *pImgHeight, uint32_t *pChannels, void *pDataBuffer, uint32_t unBufferLen ) = 0;
+ IVRProperties *m_pProperties;
};
-static const char *IClientTrackedDeviceProvider_Version = "IClientTrackedDeviceProvider_005";
+
+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";
+
+};
+
+
+
@@ -1978,9 +2354,185 @@ namespace vr
IVRControllerComponent_Version,
IVRCameraComponent_Version,
IServerTrackedDeviceProvider_Version,
- IClientTrackedDeviceProvider_Version,
+ IVRWatchdogProvider_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();
+ }
+
+ private:
+ IVRSettings *m_pVRSettings;
+ IVRProperties *m_pVRProperties;
+ CVRPropertyHelpers m_propertyHelpers;
+ CVRHiddenAreaHelpers m_hiddenAreaHelpers;
+ IVRServerDriverHost *m_pVRServerDriverHost;
+ IVRWatchdogHost *m_pVRWatchdogHost;
+ IVRDriverLog *m_pVRDriverLog;
+ };
+
+ 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 void COpenVRDriverContext::Clear()
+ {
+ m_pVRSettings = nullptr;
+ m_pVRProperties = nullptr;
+ m_pVRServerDriverHost = nullptr;
+ m_pVRDriverLog = nullptr;
+ m_pVRWatchdogHost = nullptr;
+ }
+
+ inline EVRInitError COpenVRDriverContext::InitServer()
+ {
+ Clear();
+ if ( !VRServerDriverHost()
+ || !VRSettings()
+ || !VRProperties()
+ || !VRDriverLog() )
+ 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
diff --git a/lib/linux64/libopenvr_api.so b/lib/linux64/libopenvr_api.so
index 4647025..48e4045 100755
--- a/lib/linux64/libopenvr_api.so
+++ b/lib/linux64/libopenvr_api.so
Binary files differ
diff --git a/lib/win32/openvr_api.lib b/lib/win32/openvr_api.lib
index 1521479..705736e 100644
--- a/lib/win32/openvr_api.lib
+++ b/lib/win32/openvr_api.lib
Binary files differ
diff --git a/lib/win64/openvr_api.lib b/lib/win64/openvr_api.lib
index fc16c94..33c8bbd 100644
--- a/lib/win64/openvr_api.lib
+++ b/lib/win64/openvr_api.lib
Binary files differ
diff --git a/samples/CMakeLists.txt b/samples/CMakeLists.txt
index 3f50eb4..6ec4168 100644
--- a/samples/CMakeLists.txt
+++ b/samples/CMakeLists.txt
@@ -15,21 +15,22 @@ if(NOT PLATFORM)
endif()
message(STATUS "Compilation set for ${PLATFORM}bits architectures.")
+set(SDL_REQUIRED_LIBRARIES SDL2)
+
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
- add_definitions(-DLINUX)
+ add_definitions(-DLINUX -DPOSIX)
set(ARCH_TARGET linux64)
if(${PLATFORM} MATCHES 32)
message(WARNING "OpenVR x86 binaries not provided on GNU/Linux.")
endif()
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
- add_definitions(-DOSX)
+ set(CMAKE_MACOSX_RPATH 0)
+ add_definitions(-DOSX -DPOSIX)
set(ARCH_TARGET osx32)
- if(${PLATFORM} MATCHES 64)
- message(WARNING "OpenVR x64 binaries not provided on OSX.")
- endif()
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Windows")
+ set(SDL_REQUIRED_LIBRARIES ${SDL_REQUIRED_LIBRARIES} SDL2main)
add_definitions(-D_WIN32)
set(ARCH_TARGET win${PLATFORM})
@@ -50,7 +51,7 @@ set(SHARED_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/shared)
# Check that the steamVR SDK is installed
# (needed to prevent a segfault in OpenVR).
if(CMAKE_HOST_UNIX)
- find_file(OPENVRPATHS openvrpaths.vrpath PATHS $ENV{HOME}/.config/openvr)
+ find_file(OPENVRPATHS openvrpaths.vrpath PATHS $ENV{HOME}/.config/openvr "$ENV{HOME}/Library/Application Support/OpenVR/.openvr")
if(${OPENVRPATHS} MATCHES OPENVRPATHS-NOTFOUND)
message(FATAL_ERROR "${OPENVRPATHS} Please install SteamVR SDK to continue..")
endif()
@@ -74,7 +75,6 @@ endfunction()
# -----------------------------------------------------------------------------
## COMPILER DETECTION ##
-
if( (${CMAKE_CXX_COMPILER_ID} MATCHES "GNU")
OR (${CMAKE_CXX_COMPILER_ID} MATCHES "Clang"))
# Better to use the prebuilt GNU preprocessor define __GNUC__,
@@ -90,12 +90,12 @@ if( (${CMAKE_CXX_COMPILER_ID} MATCHES "GNU")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -m32")
endif()
-elseif(${CMAKE_CXX_COMPILER_ID} MATCHES "MSVC")
+elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Za")
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /w2 /DEBUG")
+ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /W2 /DEBUG")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MP /INCREMENTAL:NO")
else()
- message(FATAL_ERROR "Unsupported compiler.")
+ message(FATAL_ERROR "Unsupported compiler '${CMAKE_CXX_COMPILER_ID}'")
endif()
# -----------------------------------------------------------------------------
@@ -124,19 +124,33 @@ else()
endif()
## SDL 2
-foreach(lib SDL2 SDL2main)
- find_library(${lib}_LIBRARY
- NAMES
- ${lib}
- PATHS
- ${THIRDPARTY_DIR}/sdl2-2.0.3/bin
- PATH_SUFFIXES
- linux32
- osx32
- ${WINDOWS_PATH_SUFFIXES}
- )
- list(APPEND SDL2_LIBRARIES ${${lib}_LIBRARY})
-endforeach()
+## osx32 and linux32 cmake can spot each others' .so and .a files, so keep them apart
+if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
+ foreach(lib ${SDL_REQUIRED_LIBRARIES})
+ find_library(${lib}_LIBRARY
+ NAMES
+ ${lib}
+ PATHS
+ ${THIRDPARTY_DIR}/sdl2-2.0.3/bin
+ PATH_SUFFIXES
+ osx32
+ )
+ list(APPEND SDL2_LIBRARIES ${${lib}_LIBRARY})
+ endforeach()
+else()
+ foreach(lib ${SDL_REQUIRED_LIBRARIES})
+ find_library(${lib}_LIBRARY
+ NAMES
+ ${lib}
+ PATHS
+ ${THIRDPARTY_DIR}/sdl2-2.0.3/bin
+ PATH_SUFFIXES
+ linux${PLATFORM}
+ ${WINDOWS_PATH_SUFFIXES}
+ )
+ list(APPEND SDL2_LIBRARIES ${${lib}_LIBRARY})
+ endforeach()
+endif()
set(SDL2_INCLUDE_DIR ${THIRDPARTY_DIR}/sdl2-2.0.3/include)
## Qt 5
@@ -167,6 +181,8 @@ foreach(module Core Gui Widgets)
list(APPEND QT_FLAGS "${Qt5${module}_EXECUTABLE_COMPILE_FLAGS}")
list(APPEND QT_DEFINITIONS "${Qt5${module}_DEFINITIONS}")
endforeach()
+# Correct QT_FLAGS having semicolons, which break the compile step on POSIX
+list(REMOVE_DUPLICATES QT_FLAGS)
## OpenVR API path
find_library(OPENVR_LIBRARIES
@@ -176,8 +192,8 @@ find_library(OPENVR_LIBRARIES
${CMAKE_CURRENT_SOURCE_DIR}/../bin
${CMAKE_CURRENT_SOURCE_DIR}/../lib
PATH_SUFFIXES
- linux64
osx32
+ linux64
${WINDOWS_PATH_SUFFIXES}
NO_DEFAULT_PATH
NO_CMAKE_FIND_ROOT_PATH
@@ -210,4 +226,4 @@ add_subdirectory(hellovr_opengl)
add_subdirectory(helloworldoverlay)
add_subdirectory(tracked_camera_openvr_sample)
-# ----------------------------------------------------------------------------- \ No newline at end of file
+# -----------------------------------------------------------------------------
diff --git a/samples/bin/drivers/sample/driver.vrdrivermanifest b/samples/bin/drivers/sample/driver.vrdrivermanifest
new file mode 100644
index 0000000..a550df9
--- /dev/null
+++ b/samples/bin/drivers/sample/driver.vrdrivermanifest
@@ -0,0 +1,11 @@
+{
+ "alwaysActivate": false,
+ "name" : "sample",
+ "directory" : "",
+ "resourceOnly" : false,
+
+ "hmd_presence" :
+ [
+ "*.*"
+ ]
+}
diff --git a/samples/bin/drivers/sample/resources/icons/headset_sample_status_error.png b/samples/bin/drivers/sample/resources/icons/headset_sample_status_error.png
new file mode 100644
index 0000000..c9401de
--- /dev/null
+++ b/samples/bin/drivers/sample/resources/icons/headset_sample_status_error.png
Binary files differ
diff --git a/samples/bin/drivers/sample/resources/icons/headset_sample_status_off.png b/samples/bin/drivers/sample/resources/icons/headset_sample_status_off.png
new file mode 100644
index 0000000..22e884f
--- /dev/null
+++ b/samples/bin/drivers/sample/resources/icons/headset_sample_status_off.png
Binary files differ
diff --git a/samples/bin/drivers/sample/resources/icons/headset_sample_status_ready.png b/samples/bin/drivers/sample/resources/icons/headset_sample_status_ready.png
new file mode 100644
index 0000000..5fe9fe2
--- /dev/null
+++ b/samples/bin/drivers/sample/resources/icons/headset_sample_status_ready.png
Binary files differ
diff --git a/samples/bin/drivers/sample/resources/icons/headset_sample_status_ready_alert.png b/samples/bin/drivers/sample/resources/icons/headset_sample_status_ready_alert.png
new file mode 100644
index 0000000..1da03a4
--- /dev/null
+++ b/samples/bin/drivers/sample/resources/icons/headset_sample_status_ready_alert.png
Binary files differ
diff --git a/samples/bin/drivers/sample/resources/icons/headset_sample_status_ready_low.png b/samples/bin/drivers/sample/resources/icons/headset_sample_status_ready_low.png
new file mode 100644
index 0000000..bbaf61d
--- /dev/null
+++ b/samples/bin/drivers/sample/resources/icons/headset_sample_status_ready_low.png
Binary files differ
diff --git a/samples/bin/drivers/sample/resources/icons/headset_sample_status_searching.gif b/samples/bin/drivers/sample/resources/icons/headset_sample_status_searching.gif
new file mode 100644
index 0000000..85bb813
--- /dev/null
+++ b/samples/bin/drivers/sample/resources/icons/headset_sample_status_searching.gif
Binary files differ
diff --git a/samples/bin/drivers/sample/resources/icons/headset_sample_status_searching_alert.gif b/samples/bin/drivers/sample/resources/icons/headset_sample_status_searching_alert.gif
new file mode 100644
index 0000000..7c23fae
--- /dev/null
+++ b/samples/bin/drivers/sample/resources/icons/headset_sample_status_searching_alert.gif
Binary files differ
diff --git a/samples/bin/drivers/sample/resources/icons/headset_sample_status_standby.png b/samples/bin/drivers/sample/resources/icons/headset_sample_status_standby.png
new file mode 100644
index 0000000..ff9e402
--- /dev/null
+++ b/samples/bin/drivers/sample/resources/icons/headset_sample_status_standby.png
Binary files differ
diff --git a/samples/bin/drivers/sample/resources/settings/default.vrsettings b/samples/bin/drivers/sample/resources/settings/default.vrsettings
new file mode 100644
index 0000000..369a316
--- /dev/null
+++ b/samples/bin/drivers/sample/resources/settings/default.vrsettings
@@ -0,0 +1,15 @@
+{
+ "driver_sample" : {
+ "enable" : true,
+ "serialNumber" : "1234",
+ "modelNumber" : "SampleModel 1",
+ "windowX" : 20,
+ "windowY" : 20,
+ "windowWidth" : 800,
+ "windowHeight" : 600,
+ "renderWidth" : 400,
+ "renderHeight" : 300,
+ "secondsFromVsyncToPhotons" : 0.011,
+ "displayFrequency" : 0
+ }
+}
diff --git a/samples/bin/linux64/libopenvr_api.so b/samples/bin/linux64/libopenvr_api.so
index 3b4363f..eafad11 100644
--- a/samples/bin/linux64/libopenvr_api.so
+++ b/samples/bin/linux64/libopenvr_api.so
Binary files differ
diff --git a/samples/bin/osx32/libopenvr_api.dylib b/samples/bin/osx32/libopenvr_api.dylib
index 647ec3f..b3da84f 100644
--- a/samples/bin/osx32/libopenvr_api.dylib
+++ b/samples/bin/osx32/libopenvr_api.dylib
Binary files differ
diff --git a/samples/bin/win32/openvr_api.dll b/samples/bin/win32/openvr_api.dll
index 7aa2b99..83ead53 100644
--- a/samples/bin/win32/openvr_api.dll
+++ b/samples/bin/win32/openvr_api.dll
Binary files differ
diff --git a/samples/bin/win64/openvr_api.dll b/samples/bin/win64/openvr_api.dll
index bbcccde..5767d72 100644
--- a/samples/bin/win64/openvr_api.dll
+++ b/samples/bin/win64/openvr_api.dll
Binary files differ
diff --git a/samples/driver_sample/driver_sample.cpp b/samples/driver_sample/driver_sample.cpp
index 1c7290c..b14f12a 100644
--- a/samples/driver_sample/driver_sample.cpp
+++ b/samples/driver_sample/driver_sample.cpp
@@ -53,7 +53,6 @@ inline void HmdMatrix_SetIdentity( HmdMatrix34_t *pMatrix )
// keys for use with the settings API
static const char * const k_pch_Sample_Section = "driver_sample";
-static const char * const k_pch_Sample_EnableSampleDriver_Bool = "enable";
static const char * const k_pch_Sample_SerialNumber_String = "serialNumber";
static const char * const k_pch_Sample_ModelNumber_String = "modelNumber";
static const char * const k_pch_Sample_WindowX_Int32 = "windowX";
@@ -69,35 +68,22 @@ static const char * const k_pch_Sample_DisplayFrequency_Float = "displayFrequenc
// Purpose:
//-----------------------------------------------------------------------------
-class CClientDriver_Sample : public IClientTrackedDeviceProvider
+class CWatchdogDriver_Sample : public IVRWatchdogProvider
{
public:
- CClientDriver_Sample()
- : m_bEnableNullDriver( false )
- , m_bInit( false )
+ CWatchdogDriver_Sample()
{
- m_eDriverMode = ClientDriverMode_Normal;
m_pWatchdogThread = nullptr;
}
- virtual EVRInitError Init( vr::EClientDriverMode eDriverMode, vr::IDriverLog *pDriverLog, vr::IClientDriverHost *pDriverHost, const char *pchUserDriverConfigDir, const char *pchDriverInstallDir ) ;
+ virtual EVRInitError Init( vr::IVRDriverContext *pDriverContext ) ;
virtual void Cleanup() ;
- virtual bool BIsHmdPresent( const char *pchUserDriverConfigDir ) ;
- virtual EVRInitError SetDisplayId( const char *pchDisplayId ) { return VRInitError_None; } // Null doesn't care
- virtual HiddenAreaMesh_t GetHiddenAreaMesh( EVREye eEye, EHiddenAreaMeshType type );
- virtual uint32_t GetMCImage( uint32_t *pImgWidth, uint32_t *pImgHeight, uint32_t *pChannels, void *pDataBuffer, uint32_t unBufferLen ) { return 0; }
- void WatchdogWakeUp();
private:
- vr::IClientDriverHost *m_pClientDriverHost;
-
- bool m_bEnableNullDriver;
- bool m_bInit;
- vr::EClientDriverMode m_eDriverMode;
std::thread *m_pWatchdogThread;
};
-CClientDriver_Sample g_clientDriverNull;
+CWatchdogDriver_Sample g_watchdogDriverNull;
bool g_bExiting = false;
@@ -111,69 +97,38 @@ void WatchdogThreadFunction( )
if ( (0x01 & GetAsyncKeyState( 'Y' )) != 0 )
{
// Y key was pressed.
- g_clientDriverNull.WatchdogWakeUp();
+ vr::VRWatchdogHost()->WatchdogWakeUp();
}
std::this_thread::sleep_for( std::chrono::microseconds( 500 ) );
#else
// for the other platforms, just send one every five seconds
std::this_thread::sleep_for( std::chrono::seconds( 5 ) );
- g_clientDriverNull.WatchdogWakeUp();
+ vr::VRWatchdogHost()->WatchdogWakeUp();
#endif
}
}
-EVRInitError CClientDriver_Sample::Init( vr::EClientDriverMode eDriverMode, vr::IDriverLog *pDriverLog, vr::IClientDriverHost *pDriverHost, const char *pchUserDriverConfigDir, const char *pchDriverInstallDir )
+EVRInitError CWatchdogDriver_Sample::Init( vr::IVRDriverContext *pDriverContext )
{
- m_pClientDriverHost = pDriverHost;
- InitDriverLog( pDriverLog );
-
- m_eDriverMode = eDriverMode;
-
- if ( !m_bInit )
- {
- if ( m_pClientDriverHost )
- {
- IVRSettings *pSettings = (IVRSettings *) m_pClientDriverHost->GetGenericInterface( IVRSettings_Version );
-
- if ( !m_bEnableNullDriver && pSettings )
- {
- m_bEnableNullDriver = pSettings->GetBool( k_pch_Sample_Section, k_pch_Sample_EnableSampleDriver_Bool);
- }
- }
- m_bInit = true;
- }
+ VR_INIT_WATCHDOG_DRIVER_CONTEXT( pDriverContext );
+ InitDriverLog( vr::VRDriverLog() );
- if ( eDriverMode == ClientDriverMode_Watchdog )
+ // Watchdog mode on Windows starts a thread that listens for the 'Y' key on the keyboard to
+ // be pressed. A real driver should wait for a system button event or something else from the
+ // the hardware that signals that the VR system should start up.
+ g_bExiting = false;
+ m_pWatchdogThread = new std::thread( WatchdogThreadFunction );
+ if ( !m_pWatchdogThread )
{
- if ( !m_bEnableNullDriver )
- {
- return VRInitError_Init_LowPowerWatchdogNotSupported;
- }
-
- // Watchdog mode on Windows starts a thread that listens for the 'Y' key on the keyboard to
- // be pressed. A real driver should wait for a system button event or something else from the
- // the hardware that signals that the VR system should start up.
- g_bExiting = false;
- m_pWatchdogThread = new std::thread( WatchdogThreadFunction );
- if ( !m_pWatchdogThread )
- {
- DriverLog( "Unable to create watchdog thread\n");
- return VRInitError_Driver_Failed;
- }
+ DriverLog( "Unable to create watchdog thread\n");
+ return VRInitError_Driver_Failed;
}
return VRInitError_None;
}
-void CClientDriver_Sample::WatchdogWakeUp()
-{
- if ( m_pClientDriverHost )
- m_pClientDriverHost->WatchdogWakeUp();
-}
-
-
-void CClientDriver_Sample::Cleanup()
+void CWatchdogDriver_Sample::Cleanup()
{
g_bExiting = true;
if ( m_pWatchdogThread )
@@ -187,79 +142,35 @@ void CClientDriver_Sample::Cleanup()
}
-bool CClientDriver_Sample::BIsHmdPresent( const char *pchUserDriverConfigDir )
-{
- // optimistically return true. We'll have a chance to say whether there's actually an HMD later.
- // This should do something quick like look for a USB VID/PID combination that makes it likely
- // there's an HMD attached.
- return true;
-}
-
-
-// ------------------------------------------------------------------------------------------
-// Purpose: Return a mesh that contains the hidden area for the current HMD
-// ------------------------------------------------------------------------------------------
-HiddenAreaMesh_t CClientDriver_Sample::GetHiddenAreaMesh( EVREye eEye, EHiddenAreaMeshType type )
-{
- // Null doesn't do visible area meshes
- vr::HiddenAreaMesh_t mesh;
- mesh.pVertexData = NULL;
- mesh.unTriangleCount = 0;
- return mesh;
-}
-
-
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
class CSampleDeviceDriver : public vr::ITrackedDeviceServerDriver, public vr::IVRDisplayComponent
{
public:
- CSampleDeviceDriver( vr::IServerDriverHost *pDriverHost )
- : m_pServerDriverHost( pDriverHost )
- , m_unObjectId( vr::k_unTrackedDeviceIndexInvalid )
+ CSampleDeviceDriver( )
{
- IVRSettings *pSettings = m_pServerDriverHost ? m_pServerDriverHost->GetSettings( vr::IVRSettings_Version ) : NULL;
+ m_unObjectId = vr::k_unTrackedDeviceIndexInvalid;
+ m_ulPropertyContainer = vr::k_ulInvalidPropertyContainer;
- if ( pSettings )
- {
- DriverLog( "Using settings values\n" );
- m_flIPD = pSettings->GetFloat( k_pch_SteamVR_Section, k_pch_SteamVR_IPD_Float );
-
- char buf[1024];
- pSettings->GetString( k_pch_Sample_Section, k_pch_Sample_SerialNumber_String, buf, sizeof(buf));
- m_sSerialNumber = buf;
-
- pSettings->GetString( k_pch_Sample_Section, k_pch_Sample_ModelNumber_String, buf, sizeof(buf));
- m_sSerialNumber = buf;
-
- m_nWindowX = pSettings->GetInt32( k_pch_Sample_Section, k_pch_Sample_WindowX_Int32);
- m_nWindowY = pSettings->GetInt32( k_pch_Sample_Section, k_pch_Sample_WindowY_Int32);
- m_nWindowWidth = pSettings->GetInt32( k_pch_Sample_Section, k_pch_Sample_WindowWidth_Int32);
- m_nWindowHeight = pSettings->GetInt32( k_pch_Sample_Section, k_pch_Sample_WindowHeight_Int32);
- m_nRenderWidth = pSettings->GetInt32( k_pch_Sample_Section, k_pch_Sample_RenderWidth_Int32);
- m_nRenderHeight = pSettings->GetInt32( k_pch_Sample_Section, k_pch_Sample_RenderHeight_Int32);
- m_flSecondsFromVsyncToPhotons = pSettings->GetFloat( k_pch_Sample_Section, k_pch_Sample_SecondsFromVsyncToPhotons_Float);
- m_flDisplayFrequency = pSettings->GetFloat( k_pch_Sample_Section, k_pch_Sample_DisplayFrequency_Float);
- }
- else
- {
+ DriverLog( "Using settings values\n" );
+ m_flIPD = vr::VRSettings()->GetFloat( k_pch_SteamVR_Section, k_pch_SteamVR_IPD_Float );
- DriverLog( "Could not get settings API. Using default values\n" );
- m_flIPD = 0.065f;
+ char buf[1024];
+ vr::VRSettings()->GetString( k_pch_Sample_Section, k_pch_Sample_SerialNumber_String, buf, sizeof( buf ) );
+ m_sSerialNumber = buf;
- m_sSerialNumber = "SAMPLE1234";
- m_sModelNumber = "ED209";
+ vr::VRSettings()->GetString( k_pch_Sample_Section, k_pch_Sample_ModelNumber_String, buf, sizeof( buf ) );
+ m_sSerialNumber = buf;
- m_nWindowX = 0;
- m_nWindowY = 0;
- m_nWindowWidth = 1920;
- m_nWindowHeight = 1080;
- m_nRenderWidth = 1344;
- m_nRenderHeight = 1512;
- m_flSecondsFromVsyncToPhotons = 0.0;
- m_flDisplayFrequency = 0.0;
- }
+ m_nWindowX = vr::VRSettings()->GetInt32( k_pch_Sample_Section, k_pch_Sample_WindowX_Int32 );
+ m_nWindowY = vr::VRSettings()->GetInt32( k_pch_Sample_Section, k_pch_Sample_WindowY_Int32 );
+ m_nWindowWidth = vr::VRSettings()->GetInt32( k_pch_Sample_Section, k_pch_Sample_WindowWidth_Int32 );
+ m_nWindowHeight = vr::VRSettings()->GetInt32( k_pch_Sample_Section, k_pch_Sample_WindowHeight_Int32 );
+ m_nRenderWidth = vr::VRSettings()->GetInt32( k_pch_Sample_Section, k_pch_Sample_RenderWidth_Int32 );
+ m_nRenderHeight = vr::VRSettings()->GetInt32( k_pch_Sample_Section, k_pch_Sample_RenderHeight_Int32 );
+ m_flSecondsFromVsyncToPhotons = vr::VRSettings()->GetFloat( k_pch_Sample_Section, k_pch_Sample_SecondsFromVsyncToPhotons_Float );
+ m_flDisplayFrequency = vr::VRSettings()->GetFloat( k_pch_Sample_Section, k_pch_Sample_DisplayFrequency_Float );
DriverLog( "driver_null: Serial Number: %s\n", m_sSerialNumber.c_str() );
DriverLog( "driver_null: Model Number: %s\n", m_sModelNumber.c_str() );
@@ -272,13 +183,39 @@ public:
virtual ~CSampleDeviceDriver()
{
- m_pServerDriverHost = NULL;
}
- virtual EVRInitError Activate( uint32_t unObjectId )
+ virtual EVRInitError Activate( vr::TrackedDeviceIndex_t unObjectId )
{
m_unObjectId = unObjectId;
+ m_ulPropertyContainer = vr::VRProperties()->TrackedDeviceToPropertyContainer( m_unObjectId );
+
+
+ vr::VRProperties()->SetStringProperty( m_ulPropertyContainer, Prop_ModelNumber_String, m_sModelNumber.c_str() );
+ vr::VRProperties()->SetStringProperty( m_ulPropertyContainer, Prop_RenderModelName_String, m_sModelNumber.c_str() );
+ vr::VRProperties()->SetFloatProperty( m_ulPropertyContainer, Prop_UserIpdMeters_Float, m_flIPD );
+ vr::VRProperties()->SetFloatProperty( m_ulPropertyContainer, Prop_UserHeadToEyeDepthMeters_Float, 0.f );
+ vr::VRProperties()->SetFloatProperty( m_ulPropertyContainer, Prop_DisplayFrequency_Float, m_flDisplayFrequency );
+ vr::VRProperties()->SetFloatProperty( m_ulPropertyContainer, Prop_SecondsFromVsyncToPhotons_Float, m_flSecondsFromVsyncToPhotons );
+
+ // return a constant that's not 0 (invalid) or 1 (reserved for Oculus)
+ vr::VRProperties()->SetUint64Property( m_ulPropertyContainer, Prop_CurrentUniverseId_Uint64, 2 );
+
+ // avoid "not fullscreen" warnings from vrmonitor
+ vr::VRProperties()->SetBoolProperty( m_ulPropertyContainer, Prop_IsOnDesktop_Bool, false );
+
+ // Set icons for the HMD we're going to show
+ vr::VRProperties()->SetStringProperty( m_ulPropertyContainer, Prop_IconPathName_String, "icons" );
+ vr::VRProperties()->SetStringProperty( m_ulPropertyContainer, vr::Prop_NamedIconPathDeviceOff_String, "{sample}headset_sample_status_off.png" );
+ vr::VRProperties()->SetStringProperty( m_ulPropertyContainer, vr::Prop_NamedIconPathDeviceSearching_String, "{sample}headset_sample_status_searching.gif" );
+ vr::VRProperties()->SetStringProperty( m_ulPropertyContainer, vr::Prop_NamedIconPathDeviceSearchingAlert_String, "{sample}headset_sample_status_searching_alert.gif" );
+ vr::VRProperties()->SetStringProperty( m_ulPropertyContainer, vr::Prop_NamedIconPathDeviceReady_String, "{sample}headset_sample_status_ready.png" );
+ vr::VRProperties()->SetStringProperty( m_ulPropertyContainer, vr::Prop_NamedIconPathDeviceReadyAlert_String, "{sample}headset_sample_status_ready_alert.png" );
+ vr::VRProperties()->SetStringProperty( m_ulPropertyContainer, vr::Prop_NamedIconPathDeviceNotReady_String, "{sample}headset_sample_status_error.png" );
+ vr::VRProperties()->SetStringProperty( m_ulPropertyContainer, vr::Prop_NamedIconPathDeviceStandby_String, "{sample}headset_sample_status_standby.png" );
+ vr::VRProperties()->SetStringProperty( m_ulPropertyContainer, vr::Prop_NamedIconPathDeviceAlertLow_String, "{sample}headset_sample_status_ready_low.png" );
+
return VRInitError_None;
}
@@ -387,140 +324,6 @@ public:
return pose;
}
- virtual bool GetBoolTrackedDeviceProperty( vr::ETrackedDeviceProperty prop, vr::ETrackedPropertyError *pError )
- {
- *pError = vr::TrackedProp_Success;
-
- switch ( prop )
- {
- case vr::Prop_IsOnDesktop_Bool:
- // avoid "not fullscreen" warnings from vrmonitor
- return false;
- }
-
- *pError = vr::TrackedProp_ValueNotProvidedByDevice;
- return false;
- }
-
- virtual float GetFloatTrackedDeviceProperty( vr::ETrackedDeviceProperty prop, vr::ETrackedPropertyError *pError )
- {
- vr::ETrackedPropertyError error = vr::TrackedProp_ValueNotProvidedByDevice;
- float fRetVal = 0;
- switch ( prop )
- {
- case vr::Prop_UserIpdMeters_Float:
- fRetVal = m_flIPD;
- error = TrackedProp_Success;
- break;
-
- case vr::Prop_UserHeadToEyeDepthMeters_Float:
- error = vr::TrackedProp_Success;
- fRetVal = 0.f;
- break;
-
- case vr::Prop_DisplayFrequency_Float:
- error = vr::TrackedProp_Success;
- fRetVal = m_flDisplayFrequency;
- break;
-
- case vr::Prop_SecondsFromVsyncToPhotons_Float:
- error = vr::TrackedProp_Success;
- fRetVal = m_flSecondsFromVsyncToPhotons;
- break;
-
- }
-
- if ( pError )
- {
- *pError = error;
- }
-
- return fRetVal;
- }
-
- int32_t GetInt32TrackedDeviceProperty( vr::ETrackedDeviceProperty prop, vr::ETrackedPropertyError *pError )
- {
- int32_t nRetVal = 0;
- vr::ETrackedPropertyError error = vr::TrackedProp_UnknownProperty;
-
- switch ( prop )
- {
- case vr::Prop_DeviceClass_Int32:
- nRetVal = vr::TrackedDeviceClass_HMD;
- error = vr::TrackedProp_Success;
- break;
- }
-
- if ( pError )
- {
- *pError = error;
- }
-
- return nRetVal;
- }
-
- virtual uint64_t GetUint64TrackedDeviceProperty( vr::ETrackedDeviceProperty prop, vr::ETrackedPropertyError *pError )
- {
- *pError = vr::TrackedProp_Success;
-
- switch ( prop )
- {
- case vr::Prop_CurrentUniverseId_Uint64:
- // return a constant that's not 0 (invalid) or 1 (reserved for Oculus)
- return 2;
- }
-
- *pError = vr::TrackedProp_ValueNotProvidedByDevice;
- return 0;
- }
-
- vr::HmdMatrix34_t GetMatrix34TrackedDeviceProperty( vr::ETrackedDeviceProperty prop, vr::ETrackedPropertyError *pError )
- {
- *pError = vr::TrackedProp_ValueNotProvidedByDevice;
- HmdMatrix34_t matIdentity;
- HmdMatrix_SetIdentity( &matIdentity);
- return matIdentity;
- }
-
- virtual uint32_t GetStringTrackedDeviceProperty( vr::ETrackedDeviceProperty prop, char *pchValue, uint32_t unBufferSize, vr::ETrackedPropertyError *pError )
- {
- std::string sValue= GetStringTrackedDeviceProperty( prop, pError );
- if ( *pError == vr::TrackedProp_Success )
- {
- if ( sValue.size( ) + 1 > unBufferSize )
- {
- *pError = vr::TrackedProp_BufferTooSmall;
- }
- else
- {
- strcpy_s( pchValue, unBufferSize, sValue.c_str() );
- }
- return (uint32_t)sValue.size( ) + 1;
- }
- return 0;
- }
-
- std::string GetStringTrackedDeviceProperty( vr::ETrackedDeviceProperty prop, vr::ETrackedPropertyError *pError )
- {
- *pError = vr::TrackedProp_ValueNotProvidedByDevice;
- std::string sRetVal;
-
- switch ( prop )
- {
- case vr::Prop_ModelNumber_String:
- sRetVal = m_sModelNumber;
- *pError = vr::TrackedProp_Success;
- break;
-
- case vr::Prop_SerialNumber_String:
- sRetVal = m_sSerialNumber;
- *pError = vr::TrackedProp_Success;
- break;
- }
-
- return sRetVal;
- }
-
void RunFrame()
{
@@ -529,13 +332,15 @@ public:
// driver blocks it for some periodic task.
if ( m_unObjectId != vr::k_unTrackedDeviceIndexInvalid )
{
- m_pServerDriverHost->TrackedDevicePoseUpdated( m_unObjectId, GetPose() );
+ vr::VRServerDriverHost()->TrackedDevicePoseUpdated( m_unObjectId, GetPose(), sizeof( DriverPose_t ) );
}
}
+ std::string GetSerialNumber() const { return m_sSerialNumber; }
+
private:
- vr::IServerDriverHost *m_pServerDriverHost;
- uint32_t m_unObjectId;
+ vr::TrackedDeviceIndex_t m_unObjectId;
+ vr::PropertyContainerHandle_t m_ulPropertyContainer;
std::string m_sSerialNumber;
std::string m_sModelNumber;
@@ -563,12 +368,9 @@ public:
{
}
- virtual EVRInitError Init( IDriverLog *pDriverLog, vr::IServerDriverHost *pDriverHost, const char *pchUserDriverConfigDir, const char *pchDriverInstallDir ) ;
+ virtual EVRInitError Init( vr::IVRDriverContext *pDriverContext ) ;
virtual void Cleanup() ;
virtual const char * const *GetInterfaceVersions() { return vr::k_InterfaceVersions; }
- virtual uint32_t GetTrackedDeviceCount();
- virtual ITrackedDeviceServerDriver *GetTrackedDeviceDriver( uint32_t unWhich ) ;
- virtual ITrackedDeviceServerDriver* FindTrackedDeviceDriver( const char *pchId ) ;
virtual void RunFrame() ;
virtual bool ShouldBlockStandbyMode() { return false; }
virtual void EnterStandby() {}
@@ -583,18 +385,13 @@ private:
CServerDriver_Sample g_serverDriverNull;
-EVRInitError CServerDriver_Sample::Init( IDriverLog *pDriverLog, vr::IServerDriverHost *pDriverHost, const char *pchUserDriverConfigDir, const char *pchDriverInstallDir )
+EVRInitError CServerDriver_Sample::Init( vr::IVRDriverContext *pDriverContext )
{
- InitDriverLog( pDriverLog );
-
- IVRSettings *pSettings = pDriverHost ? pDriverHost->GetSettings( vr::IVRSettings_Version ) : NULL;
-
- m_bEnableNullDriver = pSettings && pSettings->GetBool( k_pch_Sample_Section, k_pch_Sample_EnableSampleDriver_Bool );
-
- if ( !m_bEnableNullDriver )
- return VRInitError_Init_HmdNotFound;
+ VR_INIT_SERVER_DRIVER_CONTEXT( pDriverContext );
+ InitDriverLog( vr::VRDriverLog() );
- m_pNullHmdLatest = new CSampleDeviceDriver( pDriverHost);
+ m_pNullHmdLatest = new CSampleDeviceDriver();
+ vr::VRServerDriverHost()->TrackedDeviceAdded( m_pNullHmdLatest->GetSerialNumber().c_str(), vr::TrackedDeviceClass_HMD, m_pNullHmdLatest );
return VRInitError_None;
}
@@ -606,27 +403,6 @@ void CServerDriver_Sample::Cleanup()
}
-uint32_t CServerDriver_Sample::GetTrackedDeviceCount()
-{
- if ( m_bEnableNullDriver )
- return 1;
-
- return 0;
-}
-
-
-ITrackedDeviceServerDriver *CServerDriver_Sample::GetTrackedDeviceDriver( uint32_t unWhich )
-{
- return m_pNullHmdLatest;
-}
-
-
-ITrackedDeviceServerDriver* CServerDriver_Sample::FindTrackedDeviceDriver( const char *pchId )
-{
- return m_pNullHmdLatest;
-}
-
-
void CServerDriver_Sample::RunFrame()
{
if ( m_pNullHmdLatest )
@@ -644,9 +420,9 @@ HMD_DLL_EXPORT void *HmdDriverFactory( const char *pInterfaceName, int *pReturnC
{
return &g_serverDriverNull;
}
- if( 0 == strcmp( IClientTrackedDeviceProvider_Version, pInterfaceName ) )
+ if( 0 == strcmp( IVRWatchdogProvider_Version, pInterfaceName ) )
{
- return &g_clientDriverNull;
+ return &g_watchdogDriverNull;
}
if( pReturnCode )
diff --git a/samples/driver_sample/driverlog.cpp b/samples/driver_sample/driverlog.cpp
index 88e8ffa..a635aac 100644
--- a/samples/driver_sample/driverlog.cpp
+++ b/samples/driver_sample/driverlog.cpp
@@ -5,10 +5,10 @@
#include <stdio.h>
#include <stdarg.h>
-static vr::IDriverLog * s_pLogFile = NULL;
+static vr::IVRDriverLog * s_pLogFile = NULL;
-bool InitDriverLog( vr::IDriverLog *pDriverLog )
+bool InitDriverLog( vr::IVRDriverLog *pDriverLog )
{
if( s_pLogFile )
return false;
@@ -59,21 +59,3 @@ void DebugDriverLog( const char *pMsgFormat, ... )
}
-//-----------------------------------------------------------------------------
-// Purpose: Helper to get a string from a tracked device property and turn it
-// into a std::string
-//-----------------------------------------------------------------------------
-std::string GetTrackedDeviceString( vr::IClientDriverHost *pClientHost, vr::TrackedDeviceIndex_t unDevice, vr::ETrackedDeviceProperty prop, vr::ETrackedPropertyError *peError )
-{
- uint32_t unRequiredBufferLen = pClientHost->GetStringTrackedDeviceProperty( unDevice, prop, NULL, 0, peError );
- if( unRequiredBufferLen == 0 )
- return "";
-
- char *pchBuffer = new char[ unRequiredBufferLen ];
- unRequiredBufferLen = pClientHost->GetStringTrackedDeviceProperty( unDevice, prop, pchBuffer, unRequiredBufferLen, peError );
- std::string sResult = pchBuffer;
- delete [] pchBuffer;
- return sResult;
-}
-
-
diff --git a/samples/driver_sample/driverlog.h b/samples/driver_sample/driverlog.h
index 62ce822..3249393 100644
--- a/samples/driver_sample/driverlog.h
+++ b/samples/driver_sample/driverlog.h
@@ -17,13 +17,9 @@ extern void DriverLog( const char *pchFormat, ... );
extern void DebugDriverLog( const char *pchFormat, ... );
-extern bool InitDriverLog( vr::IDriverLog *pDriverLog );
+extern bool InitDriverLog( vr::IVRDriverLog *pDriverLog );
extern void CleanupDriverLog();
-/** Retrieves a string property from the IClientHost interface */
-std::string GetTrackedDeviceString( vr::IClientDriverHost *pClientHost, vr::TrackedDeviceIndex_t unDevice, vr::ETrackedDeviceProperty prop, vr::ETrackedPropertyError *peError = NULL );
-
-
-#endif // DRIVERLOG_H \ No newline at end of file
+#endif // DRIVERLOG_H
diff --git a/samples/hellovr_opengl/CMakeLists.txt b/samples/hellovr_opengl/CMakeLists.txt
index 253030e..a706ea2 100644
--- a/samples/hellovr_opengl/CMakeLists.txt
+++ b/samples/hellovr_opengl/CMakeLists.txt
@@ -1,5 +1,14 @@
set(TARGET_NAME hellovr_opengl)
+if(APPLE)
+ if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
+ set_source_files_properties(../shared/pathtools.cpp hellovr_opengl_main.cpp PROPERTIES COMPILE_FLAGS "-x objective-c++")
+ find_library(FOUNDATION_FRAMEWORK Foundation)
+ mark_as_advanced(FOUNDATION_FRAMEWORK)
+ set(EXTRA_LIBS ${EXTRA_LIBS} ${FOUNDATION_FRAMEWORK})
+ endif()
+endif()
+
add_executable(${TARGET_NAME}
${SHARED_SRC_FILES}
hellovr_opengl_main.cpp
@@ -11,6 +20,7 @@ target_link_libraries(${TARGET_NAME}
${SDL2_LIBRARIES}
${OPENVR_LIBRARIES}
${CMAKE_DL_LIBS}
+ ${EXTRA_LIBS}
)
setTargetOutputDirectory(${TARGET_NAME})
diff --git a/samples/hellovr_opengl/hellovr_opengl.vcxproj b/samples/hellovr_opengl/hellovr_opengl.vcxproj
index 6af11c4..8681565 100644
--- a/samples/hellovr_opengl/hellovr_opengl.vcxproj
+++ b/samples/hellovr_opengl/hellovr_opengl.vcxproj
@@ -87,12 +87,14 @@
<ClCompile Include="..\shared\lodepng.cpp" />
<ClCompile Include="..\shared\Matrices.cpp" />
<ClCompile Include="..\shared\pathtools.cpp" />
+ <ClCompile Include="..\shared\strtools.cpp" />
<ClCompile Include="hellovr_opengl_main.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\shared\lodepng.h" />
<ClInclude Include="..\shared\Matrices.h" />
<ClInclude Include="..\shared\pathtools.h" />
+ <ClInclude Include="..\shared\strtools.h" />
<ClInclude Include="..\shared\Vectors.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
diff --git a/samples/hellovr_opengl/hellovr_opengl.vcxproj.filters b/samples/hellovr_opengl/hellovr_opengl.vcxproj.filters
index e90ad34..a4f5007 100644
--- a/samples/hellovr_opengl/hellovr_opengl.vcxproj.filters
+++ b/samples/hellovr_opengl/hellovr_opengl.vcxproj.filters
@@ -33,6 +33,9 @@
<ClCompile Include="..\shared\pathtools.cpp">
<Filter>Shared</Filter>
</ClCompile>
+ <ClCompile Include="..\shared\strtools.cpp">
+ <Filter>Shared</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\shared\lodepng.h">
@@ -47,5 +50,8 @@
<ClInclude Include="..\shared\pathtools.h">
<Filter>Shared</Filter>
</ClInclude>
+ <ClInclude Include="..\shared\strtools.h">
+ <Filter>Shared</Filter>
+ </ClInclude>
</ItemGroup>
</Project> \ No newline at end of file
diff --git a/samples/hellovr_opengl/hellovr_opengl_main.cpp b/samples/hellovr_opengl/hellovr_opengl_main.cpp
index 5dfc5ae..bd78b4c 100644
--- a/samples/hellovr_opengl/hellovr_opengl_main.cpp
+++ b/samples/hellovr_opengl/hellovr_opengl_main.cpp
@@ -3,7 +3,15 @@
#include <SDL.h>
#include <GL/glew.h>
#include <SDL_opengl.h>
+#if defined( OSX )
+#include <Foundation/Foundation.h>
+#include <AppKit/AppKit.h>
+#include <OpenGL/glu.h>
+// Apple's version of glut.h #undef's APIENTRY, redefine it
+#define APIENTRY
+#else
#include <GL/glu.h>
+#endif
#include <stdio.h>
#include <string>
#include <cstdlib>
@@ -22,6 +30,10 @@
#define APIENTRY
#endif
+#ifndef _countof
+#define _countof(x) (sizeof(x)/sizeof((x)[0]))
+#endif
+
void ThreadSleep( unsigned long nMilliseconds )
{
#if defined(_WIN32)
@@ -691,9 +703,9 @@ void CMainApplication::RenderFrame()
RenderStereoTargets();
RenderCompanionWindow();
- vr::Texture_t leftEyeTexture = {(void*)leftEyeDesc.m_nResolveTextureId, vr::TextureType_OpenGL, vr::ColorSpace_Gamma };
+ vr::Texture_t leftEyeTexture = {(void*)(uintptr_t)leftEyeDesc.m_nResolveTextureId, vr::TextureType_OpenGL, vr::ColorSpace_Gamma };
vr::VRCompositor()->Submit(vr::Eye_Left, &leftEyeTexture );
- vr::Texture_t rightEyeTexture = {(void*)rightEyeDesc.m_nResolveTextureId, vr::TextureType_OpenGL, vr::ColorSpace_Gamma };
+ vr::Texture_t rightEyeTexture = {(void*)(uintptr_t)rightEyeDesc.m_nResolveTextureId, vr::TextureType_OpenGL, vr::ColorSpace_Gamma };
vr::VRCompositor()->Submit(vr::Eye_Right, &rightEyeTexture );
}
@@ -1183,7 +1195,7 @@ void CMainApplication::RenderControllerAxes()
glBindBuffer( GL_ARRAY_BUFFER, m_glControllerVertBuffer );
GLuint stride = 2 * 3 * sizeof( float );
- GLuint offset = 0;
+ uintptr_t offset = 0;
glEnableVertexAttribArray( 0 );
glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, stride, (const void *)offset);
@@ -1458,7 +1470,7 @@ void CMainApplication::RenderCompanionWindow()
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
- glDrawElements( GL_TRIANGLES, m_uiCompanionWindowIndexSize/2, GL_UNSIGNED_SHORT, (const void *)(m_uiCompanionWindowIndexSize) );
+ glDrawElements( GL_TRIANGLES, m_uiCompanionWindowIndexSize/2, GL_UNSIGNED_SHORT, (const void *)(uintptr_t)(m_uiCompanionWindowIndexSize) );
glBindVertexArray( 0 );
glUseProgram( 0 );
diff --git a/samples/helloworldoverlay/CMakeLists.txt b/samples/helloworldoverlay/CMakeLists.txt
index c2f7b0e..134bafd 100644
--- a/samples/helloworldoverlay/CMakeLists.txt
+++ b/samples/helloworldoverlay/CMakeLists.txt
@@ -1,5 +1,14 @@
set(TARGET_NAME helloworldoverlay)
+if(APPLE)
+ if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
+ set_source_files_properties(../shared/pathtools.cpp PROPERTIES COMPILE_FLAGS "-x objective-c++")
+ find_library(FOUNDATION_FRAMEWORK Foundation)
+ mark_as_advanced(FOUNDATION_FRAMEWORK)
+ set(EXTRA_LIBS ${EXTRA_LIBS} ${FOUNDATION_FRAMEWORK})
+ endif()
+endif()
+
add_executable(${TARGET_NAME}
${SHARED_SRC_FILES}
main.cpp
@@ -18,6 +27,7 @@ target_link_libraries(${TARGET_NAME}
${QT_LIBRARIES}
${OPENVR_LIBRARIES}
${CMAKE_DL_LIBS}
+ ${EXTRA_LIBS}
)
set_target_properties(${TARGET_NAME}
diff --git a/samples/helloworldoverlay/openvroverlaycontroller.cpp b/samples/helloworldoverlay/openvroverlaycontroller.cpp
index a691a4d..edb8032 100644
--- a/samples/helloworldoverlay/openvroverlaycontroller.cpp
+++ b/samples/helloworldoverlay/openvroverlaycontroller.cpp
@@ -172,7 +172,7 @@ void COpenVROverlayController::OnSceneChanged( const QList<QRectF>& )
{
// skip rendering if the overlay isn't visible
if( !vr::VROverlay() ||
- !vr::VROverlay()->IsOverlayVisible( m_ulOverlayHandle ) && !vr::VROverlay()->IsOverlayVisible( m_ulOverlayThumbnailHandle ) )
+ ( !vr::VROverlay()->IsOverlayVisible( m_ulOverlayHandle ) && !vr::VROverlay()->IsOverlayVisible( m_ulOverlayThumbnailHandle ) ) )
return;
m_pOpenGLContext->makeCurrent( m_pOffscreenSurface );
@@ -188,7 +188,7 @@ void COpenVROverlayController::OnSceneChanged( const QList<QRectF>& )
GLuint unTexture = m_pFbo->texture();
if( unTexture != 0 )
{
- vr::Texture_t texture = {(void*)unTexture, vr::TextureType_OpenGL, vr::ColorSpace_Auto };
+ vr::Texture_t texture = {(void*)(uintptr_t)unTexture, vr::TextureType_OpenGL, vr::ColorSpace_Auto };
vr::VROverlay()->SetOverlayTexture( m_ulOverlayHandle, &texture );
}
}
diff --git a/samples/shared/compat.h b/samples/shared/compat.h
index 0163b08..154f8b0 100644
--- a/samples/shared/compat.h
+++ b/samples/shared/compat.h
@@ -15,6 +15,7 @@
#define vsprintf_s sprintf
#define _stricmp strcmp
#define stricmp strcmp
+#define strnicmp strncasecmp
#define strcpy_s(dst, n, src) int(strncpy(dst, src, n) != nullptr)
#define fopen_s(fd, path, mode) int((*fd = fopen(path, mode)) != nullptr)
#define _vsnprintf_s(buffer, size, fmt, ap) vsnprintf(buffer, size, fmt, ap)
@@ -24,4 +25,4 @@ typedef int errno_t;
#endif // _WIN32
-#endif // OPENVR_SAMPLES_SHARED_COMPAT_H_ \ No newline at end of file
+#endif // OPENVR_SAMPLES_SHARED_COMPAT_H_
diff --git a/samples/shared/pathtools.cpp b/samples/shared/pathtools.cpp
index d148a5d..2ea3524 100644
--- a/samples/shared/pathtools.cpp
+++ b/samples/shared/pathtools.cpp
@@ -1,22 +1,27 @@
//========= Copyright Valve Corporation ============//
+#include "compat.h"
+#include "strtools.h"
#include "pathtools.h"
-//#include "hmdplatform_private.h"
-//#include "vrcommon/strtools.h"
#if defined( _WIN32)
#include <Windows.h>
#include <direct.h>
#include <Shobjidl.h>
#include <KnownFolders.h>
-#elif defined OSX
-#include <mach-o/dyld.h>
-#include <dlfcn.h>
-#include "osxfilebridge.h"
-#define _S_IFDIR S_IFDIR // really from tier0/platform.h which we dont have yet
-#define _MAX_PATH MAX_PATH // yet another form of _PATH define we use
-#elif defined(LINUX)
+#include <Shlobj.h>
+
+#undef GetEnvironmentVariable
+#else
#include <dlfcn.h>
#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#endif
+#if defined OSX
+#include <Foundation/Foundation.h>
+#include <AppKit/AppKit.h>
+#include <mach-o/dyld.h>
+#define _S_IFDIR S_IFDIR // really from tier0/platform.h which we dont have yet
#endif
#include <sys/stat.h>
@@ -26,44 +31,54 @@
/** Returns the path (including filename) to the current executable */
std::string Path_GetExecutablePath()
{
- bool bSuccess = false;
- char rchPath[ 1024 ];
- size_t nBuff = sizeof(rchPath);
#if defined( _WIN32 )
- bSuccess = ::GetModuleFileNameA(NULL, rchPath, (DWORD)nBuff) > 0;
-#elif defined OSX
- uint32_t _nBuff = nBuff;
- bSuccess = _NSGetExecutablePath(rchPath, &_nBuff) == 0;
+ wchar_t *pwchPath = new wchar_t[MAX_UNICODE_PATH];
+ char *pchPath = new char[MAX_UNICODE_PATH_IN_UTF8];
+ ::GetModuleFileNameW( NULL, pwchPath, MAX_UNICODE_PATH );
+ WideCharToMultiByte( CP_UTF8, 0, pwchPath, -1, pchPath, MAX_UNICODE_PATH_IN_UTF8, NULL, NULL );
+ delete[] pwchPath;
+
+ std::string sPath = pchPath;
+ delete[] pchPath;
+ return sPath;
+#elif defined( OSX )
+ char rchPath[1024];
+ uint32_t nBuff = sizeof( rchPath );
+ bool bSuccess = _NSGetExecutablePath(rchPath, &nBuff) == 0;
rchPath[nBuff-1] = '\0';
+ if( bSuccess )
+ return rchPath;
+ else
+ return "";
#elif defined LINUX
+ char rchPath[1024];
+ size_t nBuff = sizeof( rchPath );
ssize_t nRead = readlink("/proc/self/exe", rchPath, nBuff-1 );
if ( nRead != -1 )
{
rchPath[ nRead ] = 0;
- bSuccess = true;
+ return rchPath;
}
else
{
- rchPath[ 0 ] = '\0';
+ return "";
}
#else
AssertMsg( false, "Implement Plat_GetExecutablePath" );
+ return "";
#endif
- if( bSuccess )
- return rchPath;
- else
- return "";
}
/** Returns the path of the current working directory */
std::string Path_GetWorkingDirectory()
{
std::string sPath;
- char buf[ 1024 ];
#if defined( _WIN32 )
- sPath = _getcwd( buf, sizeof( buf ) );
+ wchar_t buf[MAX_UNICODE_PATH];
+ sPath = UTF16to8( _wgetcwd( buf, MAX_UNICODE_PATH ) );
#else
+ char buf[ 1024 ];
sPath = getcwd( buf, sizeof( buf ) );
#endif
return sPath;
@@ -74,37 +89,14 @@ bool Path_SetWorkingDirectory( const std::string & sPath )
{
bool bSuccess;
#if defined( _WIN32 )
- bSuccess = 0 == _chdir( sPath.c_str() );
+ std::wstring wsPath = UTF8to16( sPath.c_str() );
+ bSuccess = 0 == _wchdir( wsPath.c_str() );
#else
bSuccess = 0 == chdir( sPath.c_str() );
#endif
return bSuccess;
}
-std::string Path_GetModulePath()
-{
-#if defined( _WIN32 )
- char path[32768];
- HMODULE hm = NULL;
-
- if (!GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
- (LPCSTR) &Path_GetModulePath,
- &hm))
- {
- int ret = GetLastError();
- fprintf(stderr, "GetModuleHandle returned %d\n", ret);
- return "";
- }
- GetModuleFileNameA(hm, path, sizeof(path));
- FreeLibrary( hm );
- return path;
-#else
- Dl_info dl_info;
- dladdr((void *)Path_GetModulePath, &dl_info);
- return dl_info.dli_fname;
-#endif
-}
-
/** Returns the specified path without its filename */
std::string Path_StripFilename( const std::string & sPath, char slash )
{
@@ -151,17 +143,45 @@ std::string Path_StripExtension( const std::string & sPath )
return sPath;
}
+/** returns just extension of the provided filename (if any). */
+std::string Path_GetExtension( const std::string & sPath )
+{
+ for ( std::string::const_reverse_iterator i = sPath.rbegin(); i != sPath.rend(); i++ )
+ {
+ if ( *i == '.' )
+ {
+ return std::string( i.base(), sPath.end() );
+ }
+
+ // if we find a slash there is no extension
+ if ( *i == '\\' || *i == '/' )
+ break;
+ }
+
+ // we didn't find an extension
+ return "";
+}
bool Path_IsAbsolute( const std::string & sPath )
{
if( sPath.empty() )
return false;
- if( sPath.find( ':' ) != std::string::npos )
- return true;
+#if defined( WIN32 )
+ if ( sPath.size() < 3 ) // must be c:\x or \\x at least
+ return false;
- if( sPath[0] == '\\' || sPath[0] == '/' )
+ if ( sPath[1] == ':' ) // drive letter plus slash, but must test both slash cases
+ {
+ if ( sPath[2] == '\\' || sPath[2] == '/' )
+ return true;
+ }
+ else if ( sPath[0] == '\\' && sPath[1] == '\\' ) // UNC path
+ return true;
+#else
+ if( sPath[0] == '\\' || sPath[0] == '/' ) // any leading slash
return true;
+#endif
return false;
}
@@ -223,6 +243,8 @@ std::string Path_Join( const std::string & first, const std::string & second, ch
// only insert a slash if we don't already have one
std::string::size_type nLen = first.length();
+ if( !nLen )
+ return second;
#if defined(_WIN32)
if( first.back() == '\\' || first.back() == '/' )
nLen--;
@@ -257,6 +279,41 @@ std::string Path_Join(
return Path_Join( Path_Join( Path_Join( Path_Join( first, second, slash ), third, slash ), fourth, slash ), fifth, slash );
}
+
+std::string Path_RemoveTrailingSlash( const std::string & sRawPath, char slash )
+{
+ if ( slash == 0 )
+ slash = Path_GetSlash();
+
+ std::string sPath = sRawPath;
+ std::string::size_type nCurrent = sRawPath.length();
+ if ( nCurrent == 0 )
+ return sPath;
+
+ int nLastFound = -1;
+ nCurrent--;
+ while( nCurrent != 0 )
+ {
+ if ( sRawPath[ nCurrent ] == slash )
+ {
+ nLastFound = (int)nCurrent;
+ nCurrent--;
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ if ( nLastFound >= 0 )
+ {
+ sPath.erase( nLastFound, std::string::npos );
+ }
+
+ return sPath;
+}
+
+
/** Removes redundant <dir>/.. elements in the path. Returns an empty path if the
* specified path has a broken number of directories for its number of ..s */
std::string Path_Compact( const std::string & sRawPath, char slash )
@@ -336,17 +393,15 @@ std::string Path_Compact( const std::string & sRawPath, char slash )
return sPath;
}
-#define MAX_UNICODE_PATH 32768
-#define MAX_UNICODE_PATH_IN_UTF8 ( MAX_UNICODE_PATH * 4 )
/** Returns the path to the current DLL or exe */
-std::string GetThisModulePath()
+std::string Path_GetThisModulePath()
{
// gets the path of vrclient.dll itself
#ifdef WIN32
HMODULE hmodule = NULL;
- ::GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, reinterpret_cast<LPCTSTR>(GetThisModulePath), &hmodule);
+ ::GetModuleHandleEx( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, reinterpret_cast<LPCTSTR>(Path_GetThisModulePath), &hmodule );
wchar_t *pwchPath = new wchar_t[MAX_UNICODE_PATH];
char *pchPath = new char[ MAX_UNICODE_PATH_IN_UTF8 ];
@@ -361,7 +416,7 @@ std::string GetThisModulePath()
#elif defined( OSX ) || defined( LINUX )
// get the addr of a function in vrclient.so and then ask the dlopen system about it
Dl_info info;
- dladdr( (void *)GetThisModulePath, &info );
+ dladdr( (void *)Path_GetThisModulePath, &info );
return info.dli_fname;
#endif
@@ -379,19 +434,44 @@ bool Path_IsDirectory( const std::string & sPath )
sFixedPath.erase( sFixedPath.end() - 1, sFixedPath.end() );
// see if the specified path actually exists.
+
+#if defined(POSIX)
struct stat buf;
- if ( stat ( sFixedPath.c_str(), &buf ) == -1)
+ if ( stat( sFixedPath.c_str(), &buf ) == -1 )
{
return false;
}
-#if defined(LINUX)
+#if defined( LINUX ) || defined( OSX )
return S_ISDIR( buf.st_mode );
#else
- return ( buf.st_mode & _S_IFDIR ) != 0;
+ return (buf.st_mode & _S_IFDIR) != 0;
+#endif
+
+#else
+ struct _stat buf;
+ std::wstring wsFixedPath = UTF8to16( sFixedPath.c_str() );
+ if ( _wstat( wsFixedPath.c_str(), &buf ) == -1 )
+ {
+ return false;
+ }
+
+ return (buf.st_mode & _S_IFDIR) != 0;
#endif
}
+/** returns true if the specified path represents an app bundle */
+bool Path_IsAppBundle( const std::string & sPath )
+{
+#if defined(OSX)
+ NSBundle *bundle = [ NSBundle bundleWithPath: [ NSString stringWithUTF8String:sPath.c_str() ] ];
+ bool bisAppBundle = ( nullptr != bundle );
+ [ bundle release ];
+ return bisAppBundle;
+#else
+ return false;
+#endif
+}
//-----------------------------------------------------------------------------
// Purpose: returns true if the the path exists
@@ -402,11 +482,20 @@ bool Path_Exists( const std::string & sPath )
if( sFixedPath.empty() )
return false;
+#if defined( WIN32 )
+ struct _stat buf;
+ std::wstring wsFixedPath = UTF8to16( sFixedPath.c_str() );
+ if ( _wstat( wsFixedPath.c_str(), &buf ) == -1 )
+ {
+ return false;
+ }
+#else
struct stat buf;
if ( stat ( sFixedPath.c_str(), &buf ) == -1)
{
return false;
}
+#endif
return true;
}
@@ -475,11 +564,9 @@ unsigned char * Path_ReadBinaryFile( const std::string &strFilename, int *pSize
#if defined( POSIX )
f = fopen( strFilename.c_str(), "rb" );
#else
- errno_t err = fopen_s(&f, strFilename.c_str(), "rb");
- if ( err != 0 )
- {
- f = NULL;
- }
+ std::wstring wstrFilename = UTF8to16( strFilename.c_str() );
+ // the open operation needs to be sharable, therefore use of _wfsopen instead of _wfopen_s
+ f = _wfsopen( wstrFilename.c_str(), L"rb", _SH_DENYNO );
#endif
unsigned char* buf = NULL;
@@ -508,6 +595,68 @@ unsigned char * Path_ReadBinaryFile( const std::string &strFilename, int *pSize
return buf;
}
+uint32_t Path_ReadBinaryFile( const std::string &strFilename, unsigned char *pBuffer, uint32_t unSize )
+{
+ FILE *f;
+#if defined( POSIX )
+ f = fopen( strFilename.c_str(), "rb" );
+#else
+ std::wstring wstrFilename = UTF8to16( strFilename.c_str() );
+ errno_t err = _wfopen_s( &f, wstrFilename.c_str(), L"rb" );
+ if ( err != 0 )
+ {
+ f = NULL;
+ }
+#endif
+
+ uint32_t unSizeToReturn = 0;
+
+ if ( f != NULL )
+ {
+ fseek( f, 0, SEEK_END );
+ uint32_t size = (uint32_t)ftell( f );
+ fseek( f, 0, SEEK_SET );
+
+ if ( size > unSize || !pBuffer )
+ {
+ unSizeToReturn = (uint32_t)size;
+ }
+ else
+ {
+ if ( fread( pBuffer, size, 1, f ) == 1 )
+ {
+ unSizeToReturn = (uint32_t)size;
+ }
+ }
+
+ fclose( f );
+ }
+
+ return unSizeToReturn;
+}
+
+bool Path_WriteBinaryFile(const std::string &strFilename, unsigned char *pData, unsigned nSize)
+{
+ FILE *f;
+#if defined( POSIX )
+ f = fopen(strFilename.c_str(), "wb");
+#else
+ std::wstring wstrFilename = UTF8to16( strFilename.c_str() );
+ errno_t err = _wfopen_s( &f, wstrFilename.c_str(), L"wb" );
+ if (err != 0)
+ {
+ f = NULL;
+ }
+#endif
+
+ size_t written = 0;
+ if (f != NULL) {
+ written = fwrite(pData, sizeof(unsigned char), nSize, f);
+ fclose(f);
+ }
+
+ return written = nSize ? true : false;
+}
std::string Path_ReadTextFile( const std::string &strFilename )
{
@@ -520,7 +669,7 @@ std::string Path_ReadTextFile( const std::string &strFilename )
return "";
// convert CRLF -> LF
- int outsize = 1;
+ size_t outsize = 1;
for (int i=1; i < size; i++)
{
if (buf[i] == '\n' && buf[i-1] == '\r') // CRLF
@@ -529,7 +678,7 @@ std::string Path_ReadTextFile( const std::string &strFilename )
buf[outsize++] = buf[i]; // just copy
}
- std::string ret((char *)buf, (char *)(buf + outsize));
+ std::string ret((char *)buf, outsize);
delete[] buf;
return ret;
}
@@ -541,7 +690,8 @@ bool Path_WriteStringToTextFile( const std::string &strFilename, const char *pch
#if defined( POSIX )
f = fopen( strFilename.c_str(), "w" );
#else
- errno_t err = fopen_s(&f, strFilename.c_str(), "w");
+ std::wstring wstrFilename = UTF8to16( strFilename.c_str() );
+ errno_t err = _wfopen_s( &f, wstrFilename.c_str(), L"w" );
if ( err != 0 )
{
f = NULL;
@@ -557,4 +707,113 @@ bool Path_WriteStringToTextFile( const std::string &strFilename, const char *pch
}
return ok;
-} \ No newline at end of file
+}
+
+bool Path_WriteStringToTextFileAtomic( const std::string &strFilename, const char *pchData )
+{
+ std::string strTmpFilename = strFilename + ".tmp";
+
+ if ( !Path_WriteStringToTextFile( strTmpFilename, pchData ) )
+ return false;
+
+ // Platform specific atomic file replacement
+#if defined( _WIN32 )
+ std::wstring wsFilename = UTF8to16( strFilename.c_str() );
+ std::wstring wsTmpFilename = UTF8to16( strTmpFilename.c_str() );
+ if ( !::ReplaceFileW( wsFilename.c_str(), wsTmpFilename.c_str(), nullptr, 0, 0, 0 ) )
+ {
+ // if we couldn't ReplaceFile, try a non-atomic write as a fallback
+ if ( !Path_WriteStringToTextFile( strFilename, pchData ) )
+ return false;
+ }
+#elif defined( POSIX )
+ if ( rename( strTmpFilename.c_str(), strFilename.c_str() ) == -1 )
+ return false;
+#else
+#error Do not know how to write atomic file
+#endif
+
+ return true;
+}
+
+
+#if defined(WIN32)
+#define FILE_URL_PREFIX "file:///"
+#else
+#define FILE_URL_PREFIX "file://"
+#endif
+
+// ----------------------------------------------------------------------------------------------------------------------------
+// Purpose: Turns a path to a file on disk into a URL (or just returns the value if it's already a URL)
+// ----------------------------------------------------------------------------------------------------------------------------
+std::string Path_FilePathToUrl( const std::string & sRelativePath, const std::string & sBasePath )
+{
+ if ( !strnicmp( sRelativePath.c_str(), "http://", 7 )
+ || !strnicmp( sRelativePath.c_str(), "https://", 8 )
+ || !strnicmp( sRelativePath.c_str(), "file://", 7 ) )
+ {
+ return sRelativePath;
+ }
+ else
+ {
+ std::string sAbsolute = Path_MakeAbsolute( sRelativePath, sBasePath );
+ if ( sAbsolute.empty() )
+ return sAbsolute;
+ return std::string( FILE_URL_PREFIX ) + sAbsolute;
+ }
+}
+
+// -----------------------------------------------------------------------------------------------------
+// Purpose: Strips off file:// off a URL and returns the path. For other kinds of URLs an empty string is returned
+// -----------------------------------------------------------------------------------------------------
+std::string Path_UrlToFilePath( const std::string & sFileUrl )
+{
+ if ( !strnicmp( sFileUrl.c_str(), FILE_URL_PREFIX, strlen( FILE_URL_PREFIX ) ) )
+ {
+ return sFileUrl.c_str() + strlen( FILE_URL_PREFIX );
+ }
+ else
+ {
+ return "";
+ }
+}
+
+
+// -----------------------------------------------------------------------------------------------------
+// Purpose: Returns the root of the directory the system wants us to store user documents in
+// -----------------------------------------------------------------------------------------------------
+std::string GetUserDocumentsPath()
+{
+#if defined( WIN32 )
+ WCHAR rwchPath[MAX_PATH];
+
+ if ( !SUCCEEDED( SHGetFolderPathW( NULL, CSIDL_MYDOCUMENTS | CSIDL_FLAG_CREATE, NULL, 0, rwchPath ) ) )
+ {
+ return "";
+ }
+
+ // Convert the path to UTF-8 and store in the output
+ std::string sUserPath = UTF16to8( rwchPath );
+
+ return sUserPath;
+#elif defined( OSX )
+ @autoreleasepool {
+ NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );
+ if ( [paths count] == 0 )
+ {
+ return "";
+ }
+
+ return [[paths objectAtIndex:0] UTF8String];
+ }
+#elif defined( LINUX )
+ // @todo: not solved/changed as part of OSX - still not real - just removed old class based steam cut and paste
+ const char *pchHome = getenv( "HOME" );
+ if ( pchHome == NULL )
+ {
+ return "";
+ }
+ return pchHome;
+#endif
+}
+
diff --git a/samples/shared/pathtools.h b/samples/shared/pathtools.h
index ad92b28..7c34a71 100644
--- a/samples/shared/pathtools.h
+++ b/samples/shared/pathtools.h
@@ -2,6 +2,7 @@
#pragma once
#include <string>
+#include <stdint.h>
/** Returns the path (including filename) to the current executable */
std::string Path_GetExecutablePath();
@@ -13,7 +14,7 @@ std::string Path_GetWorkingDirectory();
bool Path_SetWorkingDirectory( const std::string & sPath );
/** returns the path (including filename) of the current shared lib or DLL */
-std::string Path_GetModulePath();
+std::string Path_GetThisModulePath();
/** Returns the specified path without its filename.
* If slash is unspecified the native path separator of the current platform
@@ -27,6 +28,9 @@ std::string Path_StripDirectory( const std::string & sPath, char slash = 0 );
* If there is a path the path is left intact. */
std::string Path_StripExtension( const std::string & sPath );
+/** returns just extension of the provided filename (if any). */
+std::string Path_GetExtension( const std::string & sPath );
+
/** Returns true if the path is absolute */
bool Path_IsAbsolute( const std::string & sPath );
@@ -60,11 +64,14 @@ std::string Path_Join(
* will be used. */
std::string Path_Compact( const std::string & sRawPath, char slash = 0 );
+//** Removed trailing slashes */
+std::string Path_RemoveTrailingSlash( const std::string & sRawPath, char slash = 0 );
+
/** returns true if the specified path exists and is a directory */
bool Path_IsDirectory( const std::string & sPath );
-/** Returns the path to the current DLL or exe */
-std::string GetThisModulePath();
+/** returns true if the specified path represents an app bundle */
+bool Path_IsAppBundle( const std::string & sPath );
/** returns true if the the path exists */
bool Path_Exists( const std::string & sPath );
@@ -75,8 +82,28 @@ std::string Path_FindParentSubDirectoryRecursively( const std::string &strStartD
/** Path operations to read or write text/binary files */
unsigned char * Path_ReadBinaryFile( const std::string &strFilename, int *pSize );
+uint32_t Path_ReadBinaryFile( const std::string &strFilename, unsigned char *pBuffer, uint32_t unSize );
+bool Path_WriteBinaryFile( const std::string &strFilename, unsigned char *pData, unsigned nSize );
std::string Path_ReadTextFile( const std::string &strFilename );
bool Path_WriteStringToTextFile( const std::string &strFilename, const char *pchData );
+bool Path_WriteStringToTextFileAtomic( const std::string &strFilename, const char *pchData );
+
+/** Returns a file:// url for paths, or an http or https url if that's what was provided */
+std::string Path_FilePathToUrl( const std::string & sRelativePath, const std::string & sBasePath );
+
+/** Strips off file:// off a URL and returns the path. For other kinds of URLs an empty string is returned */
+std::string Path_UrlToFilePath( const std::string & sFileUrl );
+
+/** Returns the root of the directory the system wants us to store user documents in */
+std::string GetUserDocumentsPath();
+
+#ifndef MAX_UNICODE_PATH
+ #define MAX_UNICODE_PATH 32767
+#endif
+
+#ifndef MAX_UNICODE_PATH_IN_UTF8
+ #define MAX_UNICODE_PATH_IN_UTF8 (MAX_UNICODE_PATH * 4)
+#endif
//-----------------------------------------------------------------------------
#if defined(WIN32)
@@ -91,8 +118,12 @@ bool Path_WriteStringToTextFile( const std::string &strFilename, const char *pch
#define PLATSUBDIR "osx32"
#elif defined(LINUX)
#define DYNAMIC_LIB_EXT ".so"
+#if defined( LINUX32 )
#define PLATSUBDIR "linux32"
#else
+#define PLATSUBDIR "linux64"
+#endif
+#else
#warning "Unknown platform for PLATSUBDIR"
#define PLATSUBDIR "unknown_platform"
#endif
diff --git a/samples/shared/strtools.cpp b/samples/shared/strtools.cpp
new file mode 100644
index 0000000..6166db4
--- /dev/null
+++ b/samples/shared/strtools.cpp
@@ -0,0 +1,437 @@
+//========= Copyright Valve Corporation ============//
+#include "strtools.h"
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+bool StringHasPrefix( const std::string & sString, const std::string & sPrefix )
+{
+ return 0 == strnicmp( sString.c_str(), sPrefix.c_str(), sPrefix.length() );
+}
+
+bool StringHasPrefixCaseSensitive( const std::string & sString, const std::string & sPrefix )
+{
+ return 0 == strncmp( sString.c_str(), sPrefix.c_str(), sPrefix.length() );
+}
+
+
+bool StringHasSuffix( const std::string &sString, const std::string &sSuffix )
+{
+ size_t cStrLen = sString.length();
+ size_t cSuffixLen = sSuffix.length();
+
+ if ( cSuffixLen > cStrLen )
+ return false;
+
+ std::string sStringSuffix = sString.substr( cStrLen - cSuffixLen, cSuffixLen );
+
+ return 0 == stricmp( sStringSuffix.c_str(), sSuffix.c_str() );
+}
+
+bool StringHasSuffixCaseSensitive( const std::string &sString, const std::string &sSuffix )
+{
+ size_t cStrLen = sString.length();
+ size_t cSuffixLen = sSuffix.length();
+
+ if ( cSuffixLen > cStrLen )
+ return false;
+
+ std::string sStringSuffix = sString.substr( cStrLen - cSuffixLen, cSuffixLen );
+
+ return 0 == strncmp( sStringSuffix.c_str(), sSuffix.c_str(),cSuffixLen );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+std::string UTF16to8(const wchar_t * in)
+{
+ std::string out;
+ unsigned int codepoint = 0;
+ for ( ; in && *in != 0; ++in )
+ {
+ if (*in >= 0xd800 && *in <= 0xdbff)
+ codepoint = ((*in - 0xd800) << 10) + 0x10000;
+ else
+ {
+ if (*in >= 0xdc00 && *in <= 0xdfff)
+ codepoint |= *in - 0xdc00;
+ else
+ codepoint = *in;
+
+ if (codepoint <= 0x7f)
+ out.append(1, static_cast<char>(codepoint));
+ else if (codepoint <= 0x7ff)
+ {
+ out.append(1, static_cast<char>(0xc0 | ((codepoint >> 6) & 0x1f)));
+ out.append(1, static_cast<char>(0x80 | (codepoint & 0x3f)));
+ }
+ else if (codepoint <= 0xffff)
+ {
+ out.append(1, static_cast<char>(0xe0 | ((codepoint >> 12) & 0x0f)));
+ out.append(1, static_cast<char>(0x80 | ((codepoint >> 6) & 0x3f)));
+ out.append(1, static_cast<char>(0x80 | (codepoint & 0x3f)));
+ }
+ else
+ {
+ out.append(1, static_cast<char>(0xf0 | ((codepoint >> 18) & 0x07)));
+ out.append(1, static_cast<char>(0x80 | ((codepoint >> 12) & 0x3f)));
+ out.append(1, static_cast<char>(0x80 | ((codepoint >> 6) & 0x3f)));
+ out.append(1, static_cast<char>(0x80 | (codepoint & 0x3f)));
+ }
+ codepoint = 0;
+ }
+ }
+ return out;
+}
+
+std::wstring UTF8to16(const char * in)
+{
+ std::wstring out;
+ unsigned int codepoint = 0;
+ int following = 0;
+ for ( ; in && *in != 0; ++in )
+ {
+ unsigned char ch = *in;
+ if (ch <= 0x7f)
+ {
+ codepoint = ch;
+ following = 0;
+ }
+ else if (ch <= 0xbf)
+ {
+ if (following > 0)
+ {
+ codepoint = (codepoint << 6) | (ch & 0x3f);
+ --following;
+ }
+ }
+ else if (ch <= 0xdf)
+ {
+ codepoint = ch & 0x1f;
+ following = 1;
+ }
+ else if (ch <= 0xef)
+ {
+ codepoint = ch & 0x0f;
+ following = 2;
+ }
+ else
+ {
+ codepoint = ch & 0x07;
+ following = 3;
+ }
+ if (following == 0)
+ {
+ if (codepoint > 0xffff)
+ {
+ out.append(1, static_cast<wchar_t>(0xd800 + (codepoint >> 10)));
+ out.append(1, static_cast<wchar_t>(0xdc00 + (codepoint & 0x03ff)));
+ }
+ else
+ out.append(1, static_cast<wchar_t>(codepoint));
+ codepoint = 0;
+ }
+ }
+ return out;
+}
+
+
+void strcpy_safe( char *pchBuffer, size_t unBufferSizeBytes, const char *pchSource )
+{
+ pchBuffer[ unBufferSizeBytes - 1 ] = '\0';
+ strncpy( pchBuffer, pchSource, unBufferSizeBytes - 1 );
+}
+
+
+// --------------------------------------------------------------------
+// Purpose: converts a string to upper case
+// --------------------------------------------------------------------
+std::string StringToUpper( const std::string & sString )
+{
+ std::string sOut;
+ sOut.reserve( sString.size() + 1 );
+ for( std::string::const_iterator i = sString.begin(); i != sString.end(); i++ )
+ {
+ sOut.push_back( (char)toupper( *i ) );
+ }
+
+ return sOut;
+}
+
+
+// --------------------------------------------------------------------
+// Purpose: converts a string to lower case
+// --------------------------------------------------------------------
+std::string StringToLower( const std::string & sString )
+{
+ std::string sOut;
+ sOut.reserve( sString.size() + 1 );
+ for( std::string::const_iterator i = sString.begin(); i != sString.end(); i++ )
+ {
+ sOut.push_back( (char)tolower( *i ) );
+ }
+
+ return sOut;
+}
+
+
+uint32_t ReturnStdString( const std::string & sValue, char *pchBuffer, uint32_t unBufferLen )
+{
+ uint32_t unLen = (uint32_t)sValue.length() + 1;
+ if( !pchBuffer || !unBufferLen )
+ return unLen;
+
+ if( unBufferLen < unLen )
+ {
+ pchBuffer[0] = '\0';
+ }
+ else
+ {
+ memcpy( pchBuffer, sValue.c_str(), unLen );
+ }
+
+ return unLen;
+}
+
+void BufferToStdString( std::string & sDest, const char *pchBuffer, uint32_t unBufferLen )
+{
+ sDest.resize( unBufferLen + 1 );
+ memcpy( const_cast< char* >( sDest.c_str() ), pchBuffer, unBufferLen );
+ const_cast< char* >( sDest.c_str() )[ unBufferLen ] = '\0';
+}
+
+/** Returns a std::string from a uint64_t */
+std::string Uint64ToString( uint64_t ulValue )
+{
+ char buf[ 22 ];
+#if defined( _WIN32 )
+ sprintf_s( buf, "%llu", ulValue );
+#else
+ snprintf( buf, sizeof( buf ), "%llu", (long long unsigned int ) ulValue );
+#endif
+ return buf;
+}
+
+
+/** returns a uint64_t from a string */
+uint64_t StringToUint64( const std::string & sValue )
+{
+ return strtoull( sValue.c_str(), NULL, 0 );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Helper for converting a numeric value to a hex digit, value should be 0-15.
+//-----------------------------------------------------------------------------
+char cIntToHexDigit( int nValue )
+{
+ //Assert( nValue >= 0 && nValue <= 15 );
+ return "0123456789ABCDEF"[ nValue & 15 ];
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Helper for converting a hex char value to numeric, return -1 if the char
+// is not a valid hex digit.
+//-----------------------------------------------------------------------------
+int iHexCharToInt( char cValue )
+{
+ int32_t iValue = cValue;
+ if ( (uint32_t)( iValue - '0' ) < 10 )
+ return iValue - '0';
+
+ iValue |= 0x20;
+ if ( (uint32_t)( iValue - 'a' ) < 6 )
+ return iValue - 'a' + 10;
+
+ return -1;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Internal implementation of encode, works in the strict RFC manner, or
+// with spaces turned to + like HTML form encoding.
+//-----------------------------------------------------------------------------
+void V_URLEncodeInternal( char *pchDest, int nDestLen, const char *pchSource, int nSourceLen, bool bUsePlusForSpace )
+{
+ //AssertMsg( nDestLen > 3*nSourceLen, "Target buffer for V_URLEncode should be 3x source length, plus one for terminating null\n" );
+
+ int iDestPos = 0;
+ for ( int i=0; i < nSourceLen; ++i )
+ {
+ // worst case we need 3 additional chars
+ if( (iDestPos+3) > nDestLen )
+ {
+ pchDest[0] = '\0';
+// AssertMsg( false, "Target buffer too short\n" );
+ return;
+ }
+
+ // We allow only a-z, A-Z, 0-9, period, underscore, and hyphen to pass through unescaped.
+ // These are the characters allowed by both the original RFC 1738 and the latest RFC 3986.
+ // Current specs also allow '~', but that is forbidden under original RFC 1738.
+ if ( !( pchSource[i] >= 'a' && pchSource[i] <= 'z' ) && !( pchSource[i] >= 'A' && pchSource[i] <= 'Z' ) && !(pchSource[i] >= '0' && pchSource[i] <= '9' )
+ && pchSource[i] != '-' && pchSource[i] != '_' && pchSource[i] != '.'
+ )
+ {
+ if ( bUsePlusForSpace && pchSource[i] == ' ' )
+ {
+ pchDest[iDestPos++] = '+';
+ }
+ else
+ {
+ pchDest[iDestPos++] = '%';
+ uint8_t iValue = pchSource[i];
+ if ( iValue == 0 )
+ {
+ pchDest[iDestPos++] = '0';
+ pchDest[iDestPos++] = '0';
+ }
+ else
+ {
+ char cHexDigit1 = cIntToHexDigit( iValue % 16 );
+ iValue /= 16;
+ char cHexDigit2 = cIntToHexDigit( iValue );
+ pchDest[iDestPos++] = cHexDigit2;
+ pchDest[iDestPos++] = cHexDigit1;
+ }
+ }
+ }
+ else
+ {
+ pchDest[iDestPos++] = pchSource[i];
+ }
+ }
+
+ if( (iDestPos+1) > nDestLen )
+ {
+ pchDest[0] = '\0';
+ //AssertMsg( false, "Target buffer too short to terminate\n" );
+ return;
+ }
+
+ // Null terminate
+ pchDest[iDestPos++] = 0;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Internal implementation of decode, works in the strict RFC manner, or
+// with spaces turned to + like HTML form encoding.
+//
+// Returns the amount of space used in the output buffer.
+//-----------------------------------------------------------------------------
+size_t V_URLDecodeInternal( char *pchDecodeDest, int nDecodeDestLen, const char *pchEncodedSource, int nEncodedSourceLen, bool bUsePlusForSpace )
+{
+ if ( nDecodeDestLen < nEncodedSourceLen )
+ {
+ //AssertMsg( false, "V_URLDecode needs a dest buffer at least as large as the source" );
+ return 0;
+ }
+
+ int iDestPos = 0;
+ for( int i=0; i < nEncodedSourceLen; ++i )
+ {
+ if ( bUsePlusForSpace && pchEncodedSource[i] == '+' )
+ {
+ pchDecodeDest[ iDestPos++ ] = ' ';
+ }
+ else if ( pchEncodedSource[i] == '%' )
+ {
+ // Percent signifies an encoded value, look ahead for the hex code, convert to numeric, and use that
+
+ // First make sure we have 2 more chars
+ if ( i < nEncodedSourceLen - 2 )
+ {
+ char cHexDigit1 = pchEncodedSource[i+1];
+ char cHexDigit2 = pchEncodedSource[i+2];
+
+ // Turn the chars into a hex value, if they are not valid, then we'll
+ // just place the % and the following two chars direct into the string,
+ // even though this really shouldn't happen, who knows what bad clients
+ // may do with encoding.
+ bool bValid = false;
+ int iValue = iHexCharToInt( cHexDigit1 );
+ if ( iValue != -1 )
+ {
+ iValue *= 16;
+ int iValue2 = iHexCharToInt( cHexDigit2 );
+ if ( iValue2 != -1 )
+ {
+ iValue += iValue2;
+ pchDecodeDest[ iDestPos++ ] = (char)iValue;
+ bValid = true;
+ }
+ }
+
+ if ( !bValid )
+ {
+ pchDecodeDest[ iDestPos++ ] = '%';
+ pchDecodeDest[ iDestPos++ ] = cHexDigit1;
+ pchDecodeDest[ iDestPos++ ] = cHexDigit2;
+ }
+ }
+
+ // Skip ahead
+ i += 2;
+ }
+ else
+ {
+ pchDecodeDest[ iDestPos++ ] = pchEncodedSource[i];
+ }
+ }
+
+ // We may not have extra room to NULL terminate, since this can be used on raw data, but if we do
+ // go ahead and do it as this can avoid bugs.
+ if ( iDestPos < nDecodeDestLen )
+ {
+ pchDecodeDest[iDestPos] = 0;
+ }
+
+ return (size_t)iDestPos;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Encodes a string (or binary data) from URL encoding format, see rfc1738 section 2.2.
+// This version of the call isn't a strict RFC implementation, but uses + for space as is
+// the standard in HTML form encoding, despite it not being part of the RFC.
+//
+// Dest buffer should be at least as large as source buffer to guarantee room for decode.
+//-----------------------------------------------------------------------------
+void V_URLEncode( char *pchDest, int nDestLen, const char *pchSource, int nSourceLen )
+{
+ return V_URLEncodeInternal( pchDest, nDestLen, pchSource, nSourceLen, true );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Decodes a string (or binary data) from URL encoding format, see rfc1738 section 2.2.
+// This version of the call isn't a strict RFC implementation, but uses + for space as is
+// the standard in HTML form encoding, despite it not being part of the RFC.
+//
+// Dest buffer should be at least as large as source buffer to guarantee room for decode.
+// Dest buffer being the same as the source buffer (decode in-place) is explicitly allowed.
+//-----------------------------------------------------------------------------
+size_t V_URLDecode( char *pchDecodeDest, int nDecodeDestLen, const char *pchEncodedSource, int nEncodedSourceLen )
+{
+ return V_URLDecodeInternal( pchDecodeDest, nDecodeDestLen, pchEncodedSource, nEncodedSourceLen, true );
+}
+
+//-----------------------------------------------------------------------------
+void V_StripExtension( std::string &in )
+{
+ // Find the last dot. If it's followed by a dot or a slash, then it's part of a
+ // directory specifier like ../../somedir/./blah.
+ std::string::size_type test = in.rfind( '.' );
+ if ( test != std::string::npos )
+ {
+ // This handles things like ".\blah" or "c:\my@email.com\abc\def\geh"
+ // Which would otherwise wind up with "" and "c:\my@email", respectively.
+ if ( in.rfind( '\\' ) < test && in.rfind( '/' ) < test )
+ {
+ in.resize( test );
+ }
+ }
+}
+
diff --git a/samples/shared/strtools.h b/samples/shared/strtools.h
new file mode 100644
index 0000000..b69ef15
--- /dev/null
+++ b/samples/shared/strtools.h
@@ -0,0 +1,130 @@
+//========= Copyright Valve Corporation ============//
+#pragma once
+
+#include <string>
+#include <stdint.h>
+#include <sys/types.h>
+
+/** returns true if the string has the prefix */
+bool StringHasPrefix( const std::string & sString, const std::string & sPrefix );
+bool StringHasPrefixCaseSensitive( const std::string & sString, const std::string & sPrefix );
+
+/** returns if the string has the suffix */
+bool StringHasSuffix( const std::string &sString, const std::string &sSuffix );
+bool StringHasSuffixCaseSensitive( const std::string &sString, const std::string &sSuffix );
+
+/** converts a UTF-16 string to a UTF-8 string */
+std::string UTF16to8(const wchar_t * in);
+
+/** converts a UTF-8 string to a UTF-16 string */
+std::wstring UTF8to16(const char * in);
+#define Utf16FromUtf8 UTF8to16
+
+/** safely copy a string into a buffer */
+void strcpy_safe( char *pchBuffer, size_t unBufferSizeBytes, const char *pchSource );
+template< size_t bufferSize >
+void strcpy_safe( char (& buffer) [ bufferSize ], const char *pchSource )
+{
+ strcpy_safe( buffer, bufferSize, pchSource );
+}
+
+
+/** converts a string to upper case */
+std::string StringToUpper( const std::string & sString );
+
+/** converts a string to lower case */
+std::string StringToLower( const std::string & sString );
+
+// we stricmp (from WIN) but it isn't POSIX - OSX/LINUX have strcasecmp so just inline bridge to it
+#if defined( OSX ) || defined( LINUX )
+#include <strings.h>
+inline int stricmp(const char *pStr1, const char *pStr2) { return strcasecmp(pStr1,pStr2); }
+#ifndef _stricmp
+#define _stricmp stricmp
+#endif
+inline int strnicmp( const char *pStr1, const char *pStr2, size_t unBufferLen ) { return strncasecmp( pStr1,pStr2, unBufferLen ); }
+#define _strnicmp strnicmp
+
+#ifndef _vsnprintf_s
+#define _vsnprintf_s vsnprintf
+#endif
+
+#define _TRUNCATE ((size_t)-1)
+
+#endif
+
+#if defined( OSX )
+// behaviors ensure NULL-termination at least as well as _TRUNCATE does, but
+// wcsncpy_s/strncpy_s can non-NULL-terminate, wcslcpy/strlcpy can not.
+inline errno_t wcsncpy_s(wchar_t *strDest, size_t numberOfElements, const wchar_t *strSource, size_t count)
+{
+ return wcslcpy(strDest, strSource, numberOfElements);
+}
+
+inline errno_t strncpy_s(char *strDest, size_t numberOfElements, const char *strSource, size_t count)
+{
+ return strlcpy(strDest, strSource, numberOfElements);
+}
+
+#endif
+
+#if defined( LINUX )
+// this implementation does not return whether or not the destination was
+// truncated, but that is straightforward to fix if anybody actually needs the
+// return code.
+#include "string.h"
+inline void wcsncpy_s(wchar_t *strDest, size_t numberOfElements, const wchar_t *strSource, size_t count)
+{
+ wcsncpy(strDest, strSource, numberOfElements);
+ strDest[numberOfElements-1] = '\0';
+}
+
+inline void strncpy_s(char *strDest, size_t numberOfElements, const char *strSource, size_t count)
+{
+ strncpy(strDest, strSource, numberOfElements);
+ strDest[numberOfElements-1] = '\0';
+}
+
+#endif
+
+#if defined( _WIN32 ) && _MSC_VER < 1800
+inline uint64_t strtoull(const char *str, char **endptr, int base) { return _strtoui64( str, endptr, base ); }
+#endif
+
+/* Handles copying a std::string into a buffer as would be provided in an API */
+uint32_t ReturnStdString( const std::string & sValue, char *pchBuffer, uint32_t unBufferLen );
+
+/* Handles copying a buffer into an std::string and auto adds null terminator */
+void BufferToStdString( std::string & sDest, const char *pchBuffer, uint32_t unBufferLen );
+
+/** Returns a std::string from a uint64_t */
+std::string Uint64ToString( uint64_t ulValue );
+
+/** returns a uint64_t from a string */
+uint64_t StringToUint64( const std::string & sValue );
+
+//-----------------------------------------------------------------------------
+// Purpose: Encodes a string (or binary data) from URL encoding format, see rfc1738 section 2.2.
+// This version of the call isn't a strict RFC implementation, but uses + for space as is
+// the standard in HTML form encoding, despite it not being part of the RFC.
+//
+// Dest buffer should be at least as large as source buffer to guarantee room for decode.
+//-----------------------------------------------------------------------------
+void V_URLEncode( char *pchDest, int nDestLen, const char *pchSource, int nSourceLen );
+
+//-----------------------------------------------------------------------------
+// Purpose: Decodes a string (or binary data) from URL encoding format, see rfc1738 section 2.2.
+// This version of the call isn't a strict RFC implementation, but uses + for space as is
+// the standard in HTML form encoding, despite it not being part of the RFC.
+//
+// Dest buffer should be at least as large as source buffer to guarantee room for decode.
+// Dest buffer being the same as the source buffer (decode in-place) is explicitly allowed.
+//-----------------------------------------------------------------------------
+size_t V_URLDecode( char *pchDecodeDest, int nDecodeDestLen, const char *pchEncodedSource, int nEncodedSourceLen );
+
+//-----------------------------------------------------------------------------
+// Purpose: strip extension from a path
+//-----------------------------------------------------------------------------
+void V_StripExtension( std::string &in );
+
+
diff --git a/samples/thirdparty/sdl2-2.0.3/bin/linux64/libSDL2-2.0.so.0 b/samples/thirdparty/sdl2-2.0.3/bin/linux64/libSDL2-2.0.so.0
new file mode 100755
index 0000000..80584b6
--- /dev/null
+++ b/samples/thirdparty/sdl2-2.0.3/bin/linux64/libSDL2-2.0.so.0
Binary files differ
diff --git a/samples/thirdparty/sdl2-2.0.3/bin/linux64/libSDL2-2.0.so.0.dbg b/samples/thirdparty/sdl2-2.0.3/bin/linux64/libSDL2-2.0.so.0.dbg
new file mode 100755
index 0000000..c2f5599
--- /dev/null
+++ b/samples/thirdparty/sdl2-2.0.3/bin/linux64/libSDL2-2.0.so.0.dbg
Binary files differ
diff --git a/samples/thirdparty/sdl2-2.0.3/bin/linux64/libSDL2.so b/samples/thirdparty/sdl2-2.0.3/bin/linux64/libSDL2.so
new file mode 100644
index 0000000..80584b6
--- /dev/null
+++ b/samples/thirdparty/sdl2-2.0.3/bin/linux64/libSDL2.so
Binary files differ
diff --git a/samples/thirdparty/sdl2-2.0.3/bin/linux64/libSDL2_static.a b/samples/thirdparty/sdl2-2.0.3/bin/linux64/libSDL2_static.a
new file mode 100644
index 0000000..80ffbd8
--- /dev/null
+++ b/samples/thirdparty/sdl2-2.0.3/bin/linux64/libSDL2_static.a
Binary files differ
diff --git a/samples/tracked_camera_openvr_sample/CMakeLists.txt b/samples/tracked_camera_openvr_sample/CMakeLists.txt
index 15281a2..2061e46 100644
--- a/samples/tracked_camera_openvr_sample/CMakeLists.txt
+++ b/samples/tracked_camera_openvr_sample/CMakeLists.txt
@@ -1,5 +1,14 @@
set(TARGET_NAME tracked_camera_openvr_sample)
+if(APPLE)
+ if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
+ set_source_files_properties(../shared/pathtools.cpp PROPERTIES COMPILE_FLAGS "-x objective-c++")
+ find_library(FOUNDATION_FRAMEWORK Foundation)
+ mark_as_advanced(FOUNDATION_FRAMEWORK)
+ set(EXTRA_LIBS ${EXTRA_LIBS} ${FOUNDATION_FRAMEWORK})
+ endif()
+endif()
+
add_executable(${TARGET_NAME}
${SHARED_SRC_FILES}
main.cpp
@@ -16,6 +25,7 @@ target_link_libraries(${TARGET_NAME}
${QT_LIBRARIES}
${OPENVR_LIBRARIES}
${CMAKE_DL_LIBS}
+ ${EXTRA_LIBS}
)
set_target_properties(${TARGET_NAME}
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 24f80c6..5ad5cfa 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,14 +1,74 @@
-cmake_minimum_required(VERSION 2.8)
-
+# Project name.
project(openvr_api)
-IF(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
- add_definitions(-DOSX -DPOSIX)
- set_source_files_properties(vrcommon/pathtools_public.cpp vrcommon/vrpathregistry_public.cpp PROPERTIES COMPILE_FLAGS "-x objective-c++")
-ENDIF(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
+set( LIBNAME "openvr_api" )
+
+# Set some properies for specific files.
+if(APPLE)
+ set(CMAKE_MACOSX_RPATH 0)
+ if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+ set_source_files_properties(vrcommon/pathtools_public.cpp vrcommon/vrpathregistry_public.cpp PROPERTIES COMPILE_FLAGS "-x objective-c++")
+ endif()
+ if(BUILD_SHARED)
+ find_library(FOUNDATION_FRAMEWORK Foundation)
+ mark_as_advanced(FOUNDATION_FRAMEWORK)
+ set(EXTRA_LIBS ${EXTRA_LIBS} ${FOUNDATION_FRAMEWORK})
+ endif(BUILD_SHARED)
+elseif(WIN32)
+ if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+ add_definitions( -DWIN64 )
+ set( LIBNAME "openvr_api64" )
+ endif()
+endif()
+
+# Add include folders.
+include_directories(${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/headers ${CMAKE_SOURCE_DIR}/src/vrcommon)
+
+if(USE_CUSTOM_LIBCXX)
+ link_directories(
+ ${LIBCXX_LIB_DIR}
+ )
+endif()
+
+# Set the source group and files.
+set(CORE_FILES
+ openvr_api_public.cpp
+ jsoncpp.cpp
+)
+set(VRCOMMON_FILES
+ vrcommon/dirtools_public.cpp
+ vrcommon/envvartools_public.cpp
+ vrcommon/pathtools_public.cpp
+ vrcommon/sharedlibtools_public.cpp
+ vrcommon/hmderrors_public.cpp
+ vrcommon/vrpathregistry_public.cpp
+ vrcommon/strtools_public.cpp
+)
+
+set(SOURCE_FILES
+ ${CORE_FILES}
+ ${VRCOMMON_FILES}
+)
+
+source_group("Src" FILES
+ ${CORE_FILES}
+)
+
+source_group("VRCommon" FILES
+ ${VRCOMMON_FILES}
+)
+
+# Build the library.
+if(BUILD_SHARED)
+ add_library(${LIBNAME} SHARED ${SOURCE_FILES})
+else()
+ add_library(${LIBNAME} STATIC ${SOURCE_FILES})
+endif()
+
+if(USE_CUSTOM_LIBCXX)
+ set(EXTRA_LIBS ${EXTRA_LIBS} c++ c++abi)
+endif()
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
-include_directories(. ../headers)
-add_library(openvr_api STATIC openvr_api_public.cpp jsoncpp.cpp vrcommon/dirtools_public.cpp vrcommon/envvartools_public.cpp vrcommon/pathtools_public.cpp vrcommon/sharedlibtools_public.cpp vrcommon/hmderrors_public.cpp vrcommon/vrpathregistry_public.cpp vrcommon/strtools_public.cpp vrcommon/vrpathregistry_public.cpp)
+target_link_libraries(${LIBNAME} ${EXTRA_LIBS})
-install(TARGETS openvr_api DESTINATION lib) \ No newline at end of file
+install(TARGETS ${LIBNAME} DESTINATION lib)
diff --git a/src/openvr_api_public.cpp b/src/openvr_api_public.cpp
index b7d0643..3e303dd 100644
--- a/src/openvr_api_public.cpp
+++ b/src/openvr_api_public.cpp
@@ -2,11 +2,11 @@
#define VR_API_EXPORT 1
#include "openvr.h"
#include "ivrclientcore.h"
-#include "vrcommon/pathtools.h"
-#include "vrcommon/sharedlibtools.h"
-#include "vrcommon/envvartools.h"
-#include "vrcommon/hmderrors.h"
-#include "vrcommon/vrpathregistry.h"
+#include "pathtools_public.h"
+#include "sharedlibtools_public.h"
+#include "envvartools_public.h"
+#include "hmderrors_public.h"
+#include "vrpathregistry_public.h"
using vr::EVRInitError;
using vr::IVRSystem;
@@ -30,6 +30,8 @@ uint32_t VR_GetInitToken()
}
EVRInitError VR_LoadHmdSystemInternal();
+void CleanupInternalInterfaces();
+
uint32_t VR_InitInternal( EVRInitError *peError, vr::EVRApplicationType eApplicationType )
{
@@ -78,6 +80,10 @@ void VR_ShutdownInternal()
g_pVRModule = NULL;
}
+#if !defined( VR_API_PUBLIC )
+ CleanupInternalInterfaces();
+#endif
+
++g_nVRToken;
}
@@ -85,7 +91,7 @@ EVRInitError VR_LoadHmdSystemInternal()
{
std::string sRuntimePath, sConfigPath, sLogPath;
- bool bReadPathRegistry = CVRPathRegistry::GetPaths( &sRuntimePath, &sConfigPath, &sLogPath, NULL, NULL );
+ bool bReadPathRegistry = CVRPathRegistry_Public::GetPaths( &sRuntimePath, &sConfigPath, &sLogPath, NULL, NULL );
if( !bReadPathRegistry )
{
return vr::VRInitError_Init_PathRegistryNotFound;
@@ -203,7 +209,7 @@ bool VR_IsRuntimeInstalled()
// otherwise we need to do a bit more work
std::string sRuntimePath, sConfigPath, sLogPath;
- bool bReadPathRegistry = CVRPathRegistry::GetPaths( &sRuntimePath, &sConfigPath, &sLogPath, NULL, NULL );
+ bool bReadPathRegistry = CVRPathRegistry_Public::GetPaths( &sRuntimePath, &sConfigPath, &sLogPath, NULL, NULL );
if( !bReadPathRegistry )
{
return false;
@@ -229,7 +235,7 @@ const char *VR_RuntimePath()
static std::string sRuntimePath;
std::string sConfigPath, sLogPath;
- bool bReadPathRegistry = CVRPathRegistry::GetPaths( &sRuntimePath, &sConfigPath, &sLogPath, NULL, NULL );
+ bool bReadPathRegistry = CVRPathRegistry_Public::GetPaths( &sRuntimePath, &sConfigPath, &sLogPath, NULL, NULL );
if ( !bReadPathRegistry )
{
return nullptr;
diff --git a/src/vrcommon/dirtools_public.cpp b/src/vrcommon/dirtools_public.cpp
index 287832a..e5cfc02 100644
--- a/src/vrcommon/dirtools_public.cpp
+++ b/src/vrcommon/dirtools_public.cpp
@@ -1,9 +1,10 @@
//========= Copyright Valve Corporation ============//
-#include "dirtools.h"
-#include "strtools.h"
-#include "pathtools.h"
+#include "dirtools_public.h"
+#include "strtools_public.h"
+#include "pathtools_public.h"
#include <errno.h>
+#include <string.h>
#ifdef _WIN32
#include "windows.h"
diff --git a/src/vrcommon/dirtools.h b/src/vrcommon/dirtools_public.h
index b048b41..b048b41 100644
--- a/src/vrcommon/dirtools.h
+++ b/src/vrcommon/dirtools_public.h
diff --git a/src/vrcommon/envvartools_public.cpp b/src/vrcommon/envvartools_public.cpp
index 231dee4..bb050d6 100644
--- a/src/vrcommon/envvartools_public.cpp
+++ b/src/vrcommon/envvartools_public.cpp
@@ -1,5 +1,5 @@
//========= Copyright Valve Corporation ============//
-#include "envvartools.h"
+#include "envvartools_public.h"
#include <stdlib.h>
#if defined(_WIN32)
diff --git a/src/vrcommon/envvartools.h b/src/vrcommon/envvartools_public.h
index 7de981a..7de981a 100644
--- a/src/vrcommon/envvartools.h
+++ b/src/vrcommon/envvartools_public.h
diff --git a/src/vrcommon/hmderrors_public.cpp b/src/vrcommon/hmderrors_public.cpp
index f2409fe..5d9ecbc 100644
--- a/src/vrcommon/hmderrors_public.cpp
+++ b/src/vrcommon/hmderrors_public.cpp
@@ -1,5 +1,6 @@
//========= Copyright Valve Corporation ============//
-#include "hmderrors.h"
+#include "openvr.h"
+#include "hmderrors_public.h"
#include <stdio.h>
#include <algorithm>
diff --git a/src/vrcommon/hmderrors.h b/src/vrcommon/hmderrors_public.h
index 4bce5e3..ccd6c8a 100644
--- a/src/vrcommon/hmderrors.h
+++ b/src/vrcommon/hmderrors_public.h
@@ -1,7 +1,5 @@
//========= Copyright Valve Corporation ============//
#pragma once
-#include "openvr.h"
-
const char *GetEnglishStringForHmdError( vr::EVRInitError eError );
const char *GetIDForVRInitError( vr::EVRInitError eError );
diff --git a/src/vrcommon/pathtools_public.cpp b/src/vrcommon/pathtools_public.cpp
index f132c2e..6413c34 100644
--- a/src/vrcommon/pathtools_public.cpp
+++ b/src/vrcommon/pathtools_public.cpp
@@ -1,6 +1,6 @@
//========= Copyright Valve Corporation ============//
-#include "strtools.h"
-#include "pathtools.h"
+#include "strtools_public.h"
+#include "pathtools_public.h"
#if defined( _WIN32)
#include <Windows.h>
@@ -14,6 +14,7 @@
#include <dlfcn.h>
#include <stdio.h>
#include <unistd.h>
+#include <stdlib.h>
#endif
#if defined OSX
#include <Foundation/Foundation.h>
@@ -667,7 +668,7 @@ std::string Path_ReadTextFile( const std::string &strFilename )
return "";
// convert CRLF -> LF
- int outsize = 1;
+ size_t outsize = 1;
for (int i=1; i < size; i++)
{
if (buf[i] == '\n' && buf[i-1] == '\r') // CRLF
@@ -676,7 +677,7 @@ std::string Path_ReadTextFile( const std::string &strFilename )
buf[outsize++] = buf[i]; // just copy
}
- std::string ret((char *)buf, (char *)(buf + outsize));
+ std::string ret((char *)buf, outsize);
delete[] buf;
return ret;
}
diff --git a/src/vrcommon/pathtools.h b/src/vrcommon/pathtools_public.h
index 7c34a71..7c34a71 100644
--- a/src/vrcommon/pathtools.h
+++ b/src/vrcommon/pathtools_public.h
diff --git a/src/vrcommon/sharedlibtools_public.cpp b/src/vrcommon/sharedlibtools_public.cpp
index 99eb150..9c0661e 100644
--- a/src/vrcommon/sharedlibtools_public.cpp
+++ b/src/vrcommon/sharedlibtools_public.cpp
@@ -1,5 +1,5 @@
//========= Copyright Valve Corporation ============//
-#include "sharedlibtools.h"
+#include "sharedlibtools_public.h"
#include <string.h>
#if defined(_WIN32)
diff --git a/src/vrcommon/sharedlibtools.h b/src/vrcommon/sharedlibtools_public.h
index 10163db..10163db 100644
--- a/src/vrcommon/sharedlibtools.h
+++ b/src/vrcommon/sharedlibtools_public.h
diff --git a/src/vrcommon/strtools_public.cpp b/src/vrcommon/strtools_public.cpp
index 6166db4..9ab60d9 100644
--- a/src/vrcommon/strtools_public.cpp
+++ b/src/vrcommon/strtools_public.cpp
@@ -1,5 +1,5 @@
//========= Copyright Valve Corporation ============//
-#include "strtools.h"
+#include "strtools_public.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
diff --git a/src/vrcommon/strtools.h b/src/vrcommon/strtools_public.h
index 4bab9b7..4bab9b7 100644
--- a/src/vrcommon/strtools.h
+++ b/src/vrcommon/strtools_public.h
diff --git a/src/vrcommon/vrpathregistry_public.cpp b/src/vrcommon/vrpathregistry_public.cpp
index 5f171fa..cf61c86 100644
--- a/src/vrcommon/vrpathregistry_public.cpp
+++ b/src/vrcommon/vrpathregistry_public.cpp
@@ -1,11 +1,11 @@
//========= Copyright Valve Corporation ============//
-#include "vrpathregistry.h"
+#include "vrpathregistry_public.h"
#include "json/json.h"
-#include "pathtools.h"
-#include "envvartools.h"
-#include "strtools.h"
-#include "dirtools.h"
+#include "pathtools_public.h"
+#include "envvartools_public.h"
+#include "strtools_public.h"
+#include "dirtools_public.h"
#if defined( WIN32 )
#include <windows.h>
@@ -95,11 +95,10 @@ static std::string GetAppSettingsPath()
}
-
// ---------------------------------------------------------------------------
// Purpose: Constructor
// ---------------------------------------------------------------------------
-CVRPathRegistry::CVRPathRegistry()
+CVRPathRegistry_Public::CVRPathRegistry_Public()
{
}
@@ -107,7 +106,7 @@ CVRPathRegistry::CVRPathRegistry()
// ---------------------------------------------------------------------------
// Purpose: Computes the registry filename
// ---------------------------------------------------------------------------
-std::string CVRPathRegistry::GetOpenVRConfigPath()
+std::string CVRPathRegistry_Public::GetOpenVRConfigPath()
{
std::string sConfigPath = GetAppSettingsPath();
if( sConfigPath.empty() )
@@ -129,7 +128,7 @@ std::string CVRPathRegistry::GetOpenVRConfigPath()
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
-std::string CVRPathRegistry::GetVRPathRegistryFilename()
+std::string CVRPathRegistry_Public::GetVRPathRegistryFilename()
{
std::string sPath = GetOpenVRConfigPath();
if ( sPath.empty() )
@@ -188,7 +187,7 @@ static void StringListToJson( const std::vector< std::string > & vecHistory, Jso
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
-bool CVRPathRegistry::ToJsonString( std::string &sJsonString )
+bool CVRPathRegistry_Public::ToJsonString( std::string &sJsonString )
{
std::string sRegPath = GetVRPathRegistryFilename();
if( sRegPath.empty() )
@@ -207,7 +206,7 @@ bool CVRPathRegistry::ToJsonString( std::string &sJsonString )
// ---------------------------------------------------------------------------
// Purpose: Loads the config file from its well known location
// ---------------------------------------------------------------------------
-bool CVRPathRegistry::BLoadFromFile()
+bool CVRPathRegistry_Public::BLoadFromFile()
{
std::string sRegPath = GetVRPathRegistryFilename();
if( sRegPath.empty() )
@@ -247,7 +246,7 @@ bool CVRPathRegistry::BLoadFromFile()
// ---------------------------------------------------------------------------
// Purpose: Saves the config file to its well known location
// ---------------------------------------------------------------------------
-bool CVRPathRegistry::BSaveToFile() const
+bool CVRPathRegistry_Public::BSaveToFile() const
{
#if defined( DASHBOARD_BUILD_MODE )
return false;
@@ -257,6 +256,10 @@ bool CVRPathRegistry::BSaveToFile() const
return false;
Json::Value root;
+
+ root[ "version" ] = 1;
+ root[ "jsonid" ] = "vrpathreg";
+
StringListToJson( m_vecRuntimePath, root, "runtime" );
StringListToJson( m_vecConfigPath, root, "config" );
StringListToJson( m_vecLogPath, root, "log" );
@@ -287,7 +290,7 @@ bool CVRPathRegistry::BSaveToFile() const
// ---------------------------------------------------------------------------
// Purpose: Returns the current runtime path or NULL if no path is configured.
// ---------------------------------------------------------------------------
-std::string CVRPathRegistry::GetRuntimePath() const
+std::string CVRPathRegistry_Public::GetRuntimePath() const
{
if( m_vecRuntimePath.empty() )
return "";
@@ -299,7 +302,7 @@ std::string CVRPathRegistry::GetRuntimePath() const
// ---------------------------------------------------------------------------
// Purpose: Returns the current config path or NULL if no path is configured.
// ---------------------------------------------------------------------------
-std::string CVRPathRegistry::GetConfigPath() const
+std::string CVRPathRegistry_Public::GetConfigPath() const
{
if( m_vecConfigPath.empty() )
return "";
@@ -311,7 +314,7 @@ std::string CVRPathRegistry::GetConfigPath() const
// ---------------------------------------------------------------------------
// Purpose: Returns the current log path or NULL if no path is configured.
// ---------------------------------------------------------------------------
-std::string CVRPathRegistry::GetLogPath() const
+std::string CVRPathRegistry_Public::GetLogPath() const
{
if( m_vecLogPath.empty() )
return "";
@@ -325,9 +328,9 @@ std::string CVRPathRegistry::GetLogPath() const
// Purpose: Returns paths using the path registry and the provided override
// values. Pass NULL for any paths you don't care about.
// ---------------------------------------------------------------------------
-bool CVRPathRegistry::GetPaths( std::string *psRuntimePath, std::string *psConfigPath, std::string *psLogPath, const char *pchConfigPathOverride, const char *pchLogPathOverride, std::vector<std::string> *pvecExternalDrivers )
+bool CVRPathRegistry_Public::GetPaths( std::string *psRuntimePath, std::string *psConfigPath, std::string *psLogPath, const char *pchConfigPathOverride, const char *pchLogPathOverride, std::vector<std::string> *pvecExternalDrivers )
{
- CVRPathRegistry pathReg;
+ CVRPathRegistry_Public pathReg;
bool bLoadedRegistry = pathReg.BLoadFromFile();
int nCountEnvironmentVariables = 0;
diff --git a/src/vrcommon/vrpathregistry.h b/src/vrcommon/vrpathregistry_public.h
index 80ebeb7..4838a10 100644
--- a/src/vrcommon/vrpathregistry.h
+++ b/src/vrcommon/vrpathregistry_public.h
@@ -9,14 +9,14 @@ static const char *k_pchRuntimeOverrideVar = "VR_OVERRIDE";
static const char *k_pchConfigOverrideVar = "VR_CONFIG_PATH";
static const char *k_pchLogOverrideVar = "VR_LOG_PATH";
-class CVRPathRegistry
+class CVRPathRegistry_Public
{
public:
static std::string GetVRPathRegistryFilename();
static std::string GetOpenVRConfigPath();
public:
- CVRPathRegistry();
+ CVRPathRegistry_Public();
/** Returns paths using the path registry and the provided override values. Pass NULL for any paths you don't care about.
* Returns false if the path registry could not be read. Valid paths might still be returned based on environment variables. */
@@ -32,8 +32,7 @@ public:
std::string GetConfigPath() const;
std::string GetLogPath() const;
-
-private:
+protected:
typedef std::vector< std::string > StringVector_t;
// index 0 is the current setting