My end goal is to make a VRidge lightweight clone to understand the OpenVR API, but I'm struggling to understand how to get my code to display something. As a starting point, instead of my phone, I want to create a window as the HMD (SFML, SDL, you name it...) and having SteamVR rendering the VR view in it.
I understand that an object implementing IServerTrackedDeviceProvider
is the handler of my driver's devices, ITrackedDeviceServerDriver
is the interface of the device itself, and I suspect that my "HMD" device will have to implement IVRDisplayComponent
.
Aside from setting some properties and having callbacks to activate and deactivate my device, I have no clue where to get an actual frame to display on the screen. What am I missing ?
You are almost right.
A class inheriting
vr::IServerTrackedDeviceProvider
(I'll call it the device parent later on) is responsible for registering and maintaining the lifetime of your devices(creating them, registering them, etc.)Classes inheriting
vr::ITrackedDeviceServerDriver
after they have been registered by a device parent are considered a tracked device, device type is set by the device parent on register, also in case of the HMD deviceGetComponent()
method needs to return display components if requested, for other devices it can just returnNULL
GetComponent()
receives a c string with a component name and version, for example"IVRDisplayComponent_002"
stored invr::IVRDisplayComponent_Version
, and if the device has a component with a matching name version pair you need to return a pointer to it, if no match is found returnNULL
Also about components, in the driver example that Valve provides its done in a very lazy and bad way, DO NOT INHERIT COMPONENTS TO YOUR DEVICE CLASSES
Segment your components into separate objects that you initialize in your device and return them in
GetComponent()
accordinglyNow, the only thing left for your devices to be properly identified and used by SteamVR is registering them, but there is a catch, you need to specify the device type when you register it by passing one of the values from
vr::ETrackedDeviceClass
enum(these should be pretty self explanatory when you look at the enum)This is not all there is to openvr driver of course, for it all to work and for SteamVR to even acknowledge your driver's existence you need to implement an
HmdDriverFactory()
function, its similarly toGetComponent()
except you compare the input c string to a provider name version pair and in case of a device parent itsvr::IServerTrackedDeviceProvider_Version
, if you get a match return a pointer to the instance of your device parent or any other provider you implementedA few notes:
openvr_driver.h
,ValveSoftware/openvr
issue tracker and other people working with openvr drivers (even though there are only few...)This is not the best explanation of how openvr drivers work, so you're always welcomed to ask for more details in the comments