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 =========================================================================*/
51 #ifndef vtkOpenVRRenderWindow_h
52 #define vtkOpenVRRenderWindow_h
53 
54 #include "vtkRenderingOpenVRModule.h" // For export macro
55 #include "vtkVRRenderWindow.h"
56 
57 #include "vtkEventData.h" // for enums
58 #include "vtkOpenGLHelper.h" // used for ivars
59 #include "vtk_glew.h" // used for methods
60 #include <openvr.h> // for ivars
61 #include <vector> // ivars
62 
63 class vtkCamera;
64 class vtkMatrix4x4;
65 class vtkOpenVRModel;
66 class vtkOpenVROverlay;
68 class vtkTransform;
69 
70 class VTKRENDERINGOPENVR_EXPORT vtkOpenVRRenderWindow : public vtkVRRenderWindow
71 {
72 public:
75 
76  void Initialize(void) override;
77 
78  void ReleaseGraphicsResources(vtkWindow* renWin) override;
79 
83  vr::IVRSystem* GetHMD() { return this->HMD; }
84 
85  static bool IsHMDPresent();
86 
92 
93  void Render() override;
94 
99  void StereoMidpoint() override;
100 
105  void StereoRenderComplete() override;
106 
111 
113  /*
114  * Set/Get the overlay to use on the VR dashboard
115  */
116  vtkGetObjectMacro(DashboardOverlay, vtkOpenVROverlay);
119 
121 
124  vtkGetMacro(BaseStationVisibility, bool);
125  vtkSetMacro(BaseStationVisibility, bool);
126  vtkBooleanMacro(BaseStationVisibility, bool);
128 
134  void UpdateHMDMatrixPose() override;
135 
137 
142 
146  vr::IVRRenderModels* GetOpenVRRenderModels() { return this->OpenVRRenderModels; }
147 
152 
157  {
158  return this->GetTrackedDeviceIndexForDevice(dev, 0);
159  }
160  vr::TrackedDeviceIndex_t GetTrackedDeviceIndexForDevice(vtkEventDataDevice dev, uint32_t index);
162 
166  vr::TrackedDevicePose_t* GetTrackedDevicePose(vtkEventDataDevice idx)
167  {
168  return this->GetTrackedDevicePose(idx, 0);
169  }
170  vr::TrackedDevicePose_t* GetTrackedDevicePose(vtkEventDataDevice idx, uint32_t index);
171  vr::TrackedDevicePose_t& GetTrackedDevicePose(vr::TrackedDeviceIndex_t idx)
172  {
173  return this->TrackedDevicePose[idx];
174  }
175 
179  void RenderModels() override;
180 
182  vtkEventDataDevice device, vtkMatrix4x4* poseMatrixWorld) override;
183 
184  void ConvertOpenVRPoseToMatrices(const vr::TrackedDevicePose_t& tdPose,
185  vtkMatrix4x4* poseMatrixWorld, vtkMatrix4x4* poseMatrixPhysical = nullptr);
186 
187 protected:
190 
192 
193  bool GetSizeFromAPI() override;
194 
196 
197  vr::IVRSystem* HMD;
198  vr::IVRRenderModels* OpenVRRenderModels;
199 
200  bool CreateFramebuffers() override;
201 
202  bool CreateOneFramebuffer(int nWidth, int nHeight, FramebufferDesc& framebufferDesc);
203 
204  // convert a device index to a human string
205  std::string GetTrackedDeviceString(vr::IVRSystem* pHmd, vr::TrackedDeviceIndex_t unDevice,
206  vr::TrackedDeviceProperty prop, vr::TrackedPropertyError* peError = nullptr);
207 
208  // devices may have polygonal models
209  // load them
210  vtkOpenVRModel* FindOrLoadRenderModel(const char* modelName);
211 
212  vr::TrackedDevicePose_t TrackedDevicePose[vr::k_unMaxTrackedDeviceCount];
213 
215 
216 private:
218  void operator=(const vtkOpenVRRenderWindow&) = delete;
219 };
220 
221 #endif
a virtual camera for 3D rendering
Definition: vtkCamera.h:46
represent and manipulate 4x4 transformation matrices
Definition: vtkMatrix4x4.h:36
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:55
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:39
@ index
Definition: vtkX3D.h:252
@ string
Definition: vtkX3D.h:496
vtkEventDataDevice
platform-independent event data structures
Definition: vtkEventData.h:26