VTK  9.0.1
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 "vtkOpenGLRenderWindow.h"
55 #include "vtkRenderingOpenVRModule.h" // For export macro
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 vtkOpenGLRenderWindow
71 {
72 public:
73  enum
74  {
75  PhysicalToWorldMatrixModified = vtkCommand::UserEvent + 200
76  };
77 
78  static vtkOpenVRRenderWindow* New();
80  void PrintSelf(ostream& os, vtkIndent indent);
81 
85  vr::IVRSystem* GetHMD() { return this->HMD; }
86 
92 
96  void RenderOverlay();
97 
99 
102  vtkGetObjectMacro(DashboardOverlay, vtkOpenVROverlay);
103  void SetDashboardOverlay(vtkOpenVROverlay*);
105 
111  void UpdateHMDMatrixPose();
112 
114 
117  GLuint GetLeftResolveBufferId() { return this->LeftEyeDesc.m_nResolveFramebufferId; }
118  GLuint GetRightResolveBufferId() { return this->RightEyeDesc.m_nResolveFramebufferId; }
119  void GetRenderBufferSize(int& width, int& height)
120  {
121  width = this->Size[0];
122  height = this->Size[1];
123  }
125 
130  {
131  return this->GetTrackedDeviceModel(idx, 0);
132  }
133  vtkOpenVRModel* GetTrackedDeviceModel(vr::TrackedDeviceIndex_t idx)
134  {
135  return this->TrackedDeviceToRenderModel[idx];
136  }
137  vtkOpenVRModel* GetTrackedDeviceModel(vtkEventDataDevice idx, uint32_t index);
138 
142  vr::IVRRenderModels* GetOpenVRRenderModels() { return this->OpenVRRenderModels; }
143 
148  {
149  return this->GetTrackedDeviceIndexForDevice(dev, 0);
150  }
151  vr::TrackedDeviceIndex_t GetTrackedDeviceIndexForDevice(vtkEventDataDevice dev, uint32_t index);
152  uint32_t GetNumberOfTrackedDevicesForDevice(vtkEventDataDevice dev);
153 
157  void GetTrackedDevicePose(vtkEventDataDevice idx, vr::TrackedDevicePose_t** pose)
158  {
159  return this->GetTrackedDevicePose(idx, 0, pose);
160  }
161  void GetTrackedDevicePose(vtkEventDataDevice idx, uint32_t index, vr::TrackedDevicePose_t** pose);
162  vr::TrackedDevicePose_t& GetTrackedDevicePose(vr::TrackedDeviceIndex_t idx)
163  {
164  return this->TrackedDevicePose[idx];
165  }
166 
175  void InitializeViewFromCamera(vtkCamera* cam);
176 
178 
186  virtual void SetPhysicalViewDirection(double, double, double);
187  virtual void SetPhysicalViewDirection(double[3]);
188  vtkGetVector3Macro(PhysicalViewDirection, double);
190 
192 
200  virtual void SetPhysicalViewUp(double, double, double);
201  virtual void SetPhysicalViewUp(double[3]);
202  vtkGetVector3Macro(PhysicalViewUp, double);
204 
206 
214  virtual void SetPhysicalTranslation(double, double, double);
215  virtual void SetPhysicalTranslation(double[3]);
216  vtkGetVector3Macro(PhysicalTranslation, double);
218 
220 
229  virtual void SetPhysicalScale(double);
230  vtkGetMacro(PhysicalScale, double);
232 
238  void SetPhysicalToWorldMatrix(vtkMatrix4x4* matrix);
243  void GetPhysicalToWorldMatrix(vtkMatrix4x4* matrix);
244 
246 
250  vtkSetMacro(TrackHMD, bool);
251  vtkGetMacro(TrackHMD, bool);
253 
257  virtual void AddRenderer(vtkRenderer*) override;
258 
262  virtual void Start(void);
263 
268  virtual void StereoUpdate();
269 
274  virtual void StereoMidpoint();
275 
280  virtual void StereoRenderComplete();
281 
288  virtual void Initialize(void);
289 
295  virtual void Finalize(void);
296 
300  void MakeCurrent();
301 
305  virtual bool IsCurrent();
306 
310  const char* ReportCapabilities() { return "OpenVR System"; }
311 
315  vtkTypeBool IsDirect() { return 1; }
316 
322  virtual vtkTypeBool GetEventPending() { return 0; }
323 
327  virtual int* GetScreenSize();
328 
330 
337  void SetSize(int width, int height) override;
338  void SetSize(int a[2]) override { this->SetSize(a[0], a[1]); }
340 
342 
347  void SetPosition(int x, int y) override;
348  void SetPosition(int a[2]) override { this->SetPosition(a[0], a[1]); }
350 
351  // implement required virtual functions
352  void SetWindowInfo(const char*) {}
353  void SetNextWindowInfo(const char*) {}
354  void SetParentInfo(const char*) {}
355  virtual void* GetGenericDisplayId() { return (void*)this->HelperWindow->GetGenericDisplayId(); }
356  virtual void* GetGenericWindowId() { return (void*)this->HelperWindow->GetGenericWindowId(); }
357  virtual void* GetGenericParentId() { return (void*)nullptr; }
358  virtual void* GetGenericContext() { return (void*)this->HelperWindow->GetGenericContext(); }
359  virtual void* GetGenericDrawable() { return (void*)this->HelperWindow->GetGenericDrawable(); }
360  virtual void SetDisplayId(void*) {}
361  void SetWindowId(void*) {}
362  void SetParentId(void*) {}
363  void HideCursor() {}
364  void ShowCursor() {}
365  virtual void SetFullScreen(vtkTypeBool) {}
366  virtual void WindowRemap(void) {}
367  virtual void SetNextWindowId(void*) {}
368 
372  virtual int SupportsOpenGL() { return 1; }
373 
378  void Render();
379 
383  vtkGetObjectMacro(HelperWindow, vtkOpenGLRenderWindow);
384  void SetHelperWindow(vtkOpenGLRenderWindow* val);
385 
386  // Get the state object used to keep track of
387  // OpenGL state
388  vtkOpenGLState* GetState() override;
389 
394  void ReleaseGraphicsResources(vtkWindow*) override;
395 
396 protected:
398  ~vtkOpenVRRenderWindow() override;
399 
400  virtual void CreateAWindow() {}
401  virtual void DestroyWindow() {}
402 
405  vr::IVRSystem* HMD;
406  vr::IVRRenderModels* OpenVRRenderModels;
407 
409  {
412  };
415  bool CreateFrameBuffer(int nWidth, int nHeight, FramebufferDesc& framebufferDesc);
416 
417  // convert a device index to a human string
418  std::string GetTrackedDeviceString(vr::IVRSystem* pHmd, vr::TrackedDeviceIndex_t unDevice,
419  vr::TrackedDeviceProperty prop, vr::TrackedPropertyError* peError = nullptr);
420 
421  // devices may have polygonal models
422  // load them
423  vtkOpenVRModel* FindOrLoadRenderModel(const char* modelName);
424  void RenderModels();
425  std::vector<vtkOpenVRModel*> VTKRenderModels;
426  vtkOpenVRModel* TrackedDeviceToRenderModel[vr::k_unMaxTrackedDeviceCount];
427  vr::TrackedDevicePose_t TrackedDevicePose[vr::k_unMaxTrackedDeviceCount];
428 
429  // used in computing the pose
432  double PhysicalViewDirection[3];
434  double PhysicalViewUp[3];
436  double PhysicalTranslation[3];
439 
440  // for the overlay
442 
443  bool TrackHMD;
444 
446 
447 private:
449  void operator=(const vtkOpenVRRenderWindow&) = delete;
450 };
451 
452 #endif
OpenGL rendering window.
represent and manipulate 4x4 transformation matrices
Definition: vtkMatrix4x4.h:35
vr::TrackedDevicePose_t & GetTrackedDevicePose(vr::TrackedDeviceIndex_t idx)
virtual void * GetGenericParentId()
Dummy stubs for vtkWindow API.
vtkTypeBool IsDirect()
Is this render window using hardware acceleration? 0-false, 1-true.
void Start(void) override
Begin the rendering process.
void Render() override
Handle opengl specific code and calls superclass.
static vtkRenderWindow * New()
Construct an instance of vtkRenderWindow with its screen size set to 300x300, borders turned on...
void MakeCurrent() override
Attempt to make this window the current graphics context for the calling thread.
virtual void SetNextWindowId(void *)
Dummy stubs for vtkWindow API.
vr::IVRRenderModels * OpenVRRenderModels
virtual void SetDisplayId(void *)
Dummy stubs for vtkWindow API.
vtkOpenVROverlay * DashboardOverlay
vtkOpenVRModel * GetTrackedDeviceModel(vr::TrackedDeviceIndex_t idx)
abstract specification for renderers
Definition: vtkRenderer.h:67
virtual int SupportsOpenGL()
Does this render window support OpenGL? 0-false, 1-true.
virtual void AddRenderer(vtkRenderer *)
Add a renderer to the list of renderers.
virtual vtkRenderWindowInteractor * MakeRenderWindowInteractor()
Create an interactor to control renderers in this window.
virtual void SetPosition(int x, int y)
Set the position (x and y) of the rendering window in screen coordinates (in pixels).
describes linear transformations via a 4x4 matrix
Definition: vtkTransform.h:54
virtual bool IsCurrent()
Tells if this window is the current graphics context for the calling thread.
virtual void Finalize()
Finalize the rendering process.
void GetRenderBufferSize(int &width, int &height)
Get the frame buffers used for rendering.
virtual void WindowRemap(void)
Remap the rendering window.
virtual void DestroyWindow()
Destroy a not-off-screen window.
void SetWindowId(void *)
Dummy stubs for vtkWindow API.
void ShowCursor()
Hide or Show the mouse cursor, it is nice to be able to hide the default cursor if you want VTK to di...
virtual vtkTypeBool GetEventPending()
Check to see if a mouse button has been pressed or mouse wheel activated.
double PhysicalScale
Scale of the Physical to World matrix.
int vtkTypeBool
Definition: vtkABI.h:69
window superclass for vtkRenderWindow
Definition: vtkWindow.h:37
platform-independent render window interaction including picking and frame rate control.
void SetParentId(void *)
Dummy stubs for vtkWindow API.
vr::IVRRenderModels * GetOpenVRRenderModels()
Get the openVR Render Models.
virtual void CreateAWindow()
Create a not-off-screen window.
GLuint GetRightResolveBufferId()
Get the frame buffers used for rendering.
OpenGL state storage.
void SetPosition(int a[2]) override
Set the position (x and y) of the rendering window in screen coordinates (in pixels).
a simple class to control print indentation
Definition: vtkIndent.h:33
a virtual camera for 3D rendering
Definition: vtkCamera.h:45
OpenVR overlay.
const char * ReportCapabilities()
Get report of capabilities for the render window.
virtual int * GetScreenSize()
Get the current size of the screen in pixels.
Definition: vtkWindow.h:104
void SetSize(int a[2]) override
Set the size of the window in screen coordinates in pixels.
virtual void StereoUpdate()
Update the system, if needed, due to stereo rendering.
vtkEventDataDevice
platform-independent event data structures
Definition: vtkEventData.h:25
vtkOpenGLRenderWindow * HelperWindow
void SetSize(int width, int height) override
Set the size (width and height) of the rendering window in screen coordinates (in pixels)...
void SetParentInfo(const char *)
Dummy stubs for vtkWindow API.
void SetNextWindowInfo(const char *)
Dummy stubs for vtkWindow API.
void GetTrackedDevicePose(vtkEventDataDevice idx, vr::TrackedDevicePose_t **pose)
Get the most recent pose corresponding to the tracked device.
OpenVR rendering window.
void SetWindowInfo(const char *)
Dummy stubs for vtkWindow API.
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
virtual void StereoRenderComplete()
Handles work required once both views have been rendered when using stereo rendering.
virtual void SetFullScreen(vtkTypeBool)
Turn on/off rendering full screen window size.
virtual void * GetGenericContext()
Dummy stubs for vtkWindow API.
virtual void * GetGenericDrawable()
Dummy stubs for vtkWindow API.
std::vector< vtkOpenVRModel * > VTKRenderModels
vtkOpenVRModel * GetTrackedDeviceModel(vtkEventDataDevice idx)
Get the VRModel corresponding to the tracked device.
GLuint GetLeftResolveBufferId()
Get the frame buffers used for rendering.
virtual vtkOpenGLState * GetState()
virtual void * GetGenericDisplayId()
Dummy stubs for vtkWindow API.
virtual void Initialize(void)
Initialize the rendering window.
void ReleaseGraphicsResources(vtkWindow *) override
Free up any graphics resources associated with this window a value of NULL means the context may alre...
virtual void * GetGenericWindowId()
Dummy stubs for vtkWindow API.
OpenVR device model.
void StereoMidpoint() override
Intermediate method performs operations required between the rendering of the left and right eye...
vr::IVRSystem * GetHMD()
Get the system pointer.
void HideCursor()
Hide or Show the mouse cursor, it is nice to be able to hide the default cursor if you want VTK to di...
vr::TrackedDeviceIndex_t GetTrackedDeviceIndexForDevice(vtkEventDataDevice dev)
Get the index corresponding to the tracked device.