VTK  9.1.0
vtkOpenVRRenderWindow.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3 Program: Visualization Toolkit
4 
5 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
6 All rights reserved.
7 See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
8 
9 This software is distributed WITHOUT ANY WARRANTY; without even
10 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11 PURPOSE. See the above copyright notice for more information.
12 
13 =========================================================================*/
140 #ifndef vtkOpenVRRenderWindow_h
141 #define vtkOpenVRRenderWindow_h
142 
143 #include "vtkRenderingOpenVRModule.h" // For export macro
144 #include "vtkVRRenderWindow.h"
145 
146 #include "vtkEventData.h" // for enums
147 #include "vtkOpenGLHelper.h" // used for ivars
148 #include "vtk_glew.h" // used for methods
149 #include <openvr.h> // for ivars
150 #include <vector> // ivars
151 
152 class vtkCamera;
153 class vtkMatrix4x4;
154 class vtkOpenVRModel;
155 class vtkOpenVROverlay;
157 class vtkTransform;
158 
159 class VTKRENDERINGOPENVR_EXPORT vtkOpenVRRenderWindow : public vtkVRRenderWindow
160 {
161 public:
164 
165  void Initialize(void) override;
166 
167  void ReleaseGraphicsResources(vtkWindow* renWin) override;
168 
172  vr::IVRSystem* GetHMD() { return this->HMD; }
173 
174  static bool IsHMDPresent();
175 
181 
182  void Render() override;
183 
188  void StereoMidpoint() override;
189 
194  void StereoRenderComplete() override;
195 
200 
202  /*
203  * Set/Get the overlay to use on the VR dashboard
204  */
205  vtkGetObjectMacro(DashboardOverlay, vtkOpenVROverlay);
208 
210 
213  vtkGetMacro(BaseStationVisibility, bool);
214  vtkSetMacro(BaseStationVisibility, bool);
215  vtkBooleanMacro(BaseStationVisibility, bool);
217 
223  void UpdateHMDMatrixPose() override;
224 
226 
231 
235  vr::IVRRenderModels* GetOpenVRRenderModels() { return this->OpenVRRenderModels; }
236 
241 
246  {
247  return this->GetTrackedDeviceIndexForDevice(dev, 0);
248  }
249  vr::TrackedDeviceIndex_t GetTrackedDeviceIndexForDevice(vtkEventDataDevice dev, uint32_t index);
251 
255  vr::TrackedDevicePose_t* GetTrackedDevicePose(vtkEventDataDevice idx)
256  {
257  return this->GetTrackedDevicePose(idx, 0);
258  }
259  vr::TrackedDevicePose_t* GetTrackedDevicePose(vtkEventDataDevice idx, uint32_t index);
260  vr::TrackedDevicePose_t& GetTrackedDevicePose(vr::TrackedDeviceIndex_t idx)
261  {
262  return this->TrackedDevicePose[idx];
263  }
264 
268  void RenderModels() override;
269 
271  vtkEventDataDevice device, vtkMatrix4x4* poseMatrixWorld) override;
272 
273  void ConvertOpenVRPoseToMatrices(const vr::TrackedDevicePose_t& tdPose,
274  vtkMatrix4x4* poseMatrixWorld, vtkMatrix4x4* poseMatrixPhysical = nullptr);
275 
276 protected:
279 
281 
282  bool GetSizeFromAPI() override;
283 
285 
286  vr::IVRSystem* HMD;
287  vr::IVRRenderModels* OpenVRRenderModels;
288 
289  bool CreateFramebuffers() override;
290 
291  bool CreateOneFramebuffer(int nWidth, int nHeight, FramebufferDesc& framebufferDesc);
292 
293  // convert a device index to a human string
294  std::string GetTrackedDeviceString(vr::IVRSystem* pHmd, vr::TrackedDeviceIndex_t unDevice,
295  vr::TrackedDeviceProperty prop, vr::TrackedPropertyError* peError = nullptr);
296 
297  // devices may have polygonal models
298  // load them
299  vtkOpenVRModel* FindOrLoadRenderModel(const char* modelName);
300 
301  vr::TrackedDevicePose_t TrackedDevicePose[vr::k_unMaxTrackedDeviceCount];
302 
304 
305 private:
307  void operator=(const vtkOpenVRRenderWindow&) = delete;
308 };
309 
310 #endif
a virtual camera for 3D rendering
Definition: vtkCamera.h:155
represent and manipulate 4x4 transformation matrices
Definition: vtkMatrix4x4.h:145
OpenVR device model.
OpenVR overlay.
OpenVR rendering window.
bool GetPoseMatrixWorldFromDevice(vtkEventDataDevice device, vtkMatrix4x4 *poseMatrixWorld) override
Store in poseMatrixWorld the pose matrix in world coordinate from an event data device.
bool GetSizeFromAPI() override
Attempt to get the size of the display from the API and store it in this->Size.
void UpdateHMDMatrixPose() override
Update the HMD pose based on hardware pose and physical to world transform.
vr::TrackedDevicePose_t * GetTrackedDevicePose(vtkEventDataDevice idx)
Get the most recent pose corresponding to the tracked device.
vr::IVRRenderModels * GetOpenVRRenderModels()
Get the openVR Render Models.
void ConvertOpenVRPoseToMatrices(const vr::TrackedDevicePose_t &tdPose, vtkMatrix4x4 *poseMatrixWorld, vtkMatrix4x4 *poseMatrixPhysical=nullptr)
vr::TrackedDevicePose_t * GetTrackedDevicePose(vtkEventDataDevice idx, uint32_t index)
void SetDashboardOverlay(vtkOpenVROverlay *)
vr::TrackedDeviceIndex_t GetTrackedDeviceIndexForDevice(vtkEventDataDevice dev)
Get the index corresponding to the tracked device.
void RenderModels() override
Render the controller and base station models.
bool CreateFramebuffers() override
vr::TrackedDevicePose_t & GetTrackedDevicePose(vr::TrackedDeviceIndex_t idx)
vr::TrackedDeviceIndex_t GetTrackedDeviceIndexForDevice(vtkEventDataDevice dev, uint32_t index)
std::string GetWindowTitleFromAPI() override
bool CreateOneFramebuffer(int nWidth, int nHeight, FramebufferDesc &framebufferDesc)
~vtkOpenVRRenderWindow() override
vtkEventDataDevice GetDeviceFromDeviceIndex(vr::TrackedDeviceIndex_t index)
Get the EventDataDevice corresponding to the OpenVR index.
static vtkOpenVRRenderWindow * New()
uint32_t GetNumberOfTrackedDevicesForDevice(vtkEventDataDevice dev)
void StereoRenderComplete() override
Handles work required once both views have been rendered when using stereo rendering.
void ReleaseGraphicsResources(vtkWindow *renWin) override
Free up any graphics resources associated with this window a value of NULL means the context may alre...
void RenderOverlay()
Draw the overlay.
void StereoMidpoint() override
Intermediate method performs operations required between the rendering of the left and right eye.
vtkRenderWindowInteractor * MakeRenderWindowInteractor() override
Create an interactor to control renderers in this window.
std::string GetTrackedDeviceString(vr::IVRSystem *pHmd, vr::TrackedDeviceIndex_t unDevice, vr::TrackedDeviceProperty prop, vr::TrackedPropertyError *peError=nullptr)
vr::IVRSystem * GetHMD()
Get the system pointer.
vtkVRModel * GetTrackedDeviceModel(vtkEventDataDevice idx, uint32_t index) override
Get the VRModel corresponding to the tracked device.
vtkOpenVRModel * FindOrLoadRenderModel(const char *modelName)
void Render() override
Overridden to not release resources that would interfere with an external application's rendering.
void Initialize(void) override
Initialize the rendering window.
vtkOpenVROverlay * DashboardOverlay
vr::IVRRenderModels * OpenVRRenderModels
static bool IsHMDPresent()
platform-independent render window interaction including picking and frame rate control.
describes linear transformations via a 4x4 matrix
Definition: vtkTransform.h:164
VR device model.
Definition: vtkVRModel.h:41
VR rendering window.
vtkVRModel * GetTrackedDeviceModel(vtkEventDataDevice idx)
Get the VRModel corresponding to the tracked device.
window superclass for vtkRenderWindow
Definition: vtkWindow.h:36
@ index
Definition: vtkX3D.h:252
@ string
Definition: vtkX3D.h:496
vtkEventDataDevice
platform-independent event data structures
Definition: vtkEventData.h:26