VTK  9.2.5
vtkOpenGLRenderWindow.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkOpenGLRenderWindow.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
67 #ifndef vtkOpenGLRenderWindow_h
68 #define vtkOpenGLRenderWindow_h
69 
70 #include "vtkDeprecation.h" // for VTK_DEPRECATED_IN_9_1_0
71 #include "vtkRect.h" // for vtkRecti
72 #include "vtkRenderWindow.h"
73 #include "vtkRenderingOpenGL2Module.h" // For export macro
74 #include "vtkType.h" // for ivar
75 #include <map> // for ivar
76 #include <set> // for ivar
77 #include <string> // for ivar
78 
79 class vtkIdList;
82 class vtkOpenGLHardwareSupport;
87 class vtkShaderProgram;
88 class vtkStdString;
89 class vtkTexture;
90 class vtkTextureObject;
93 class vtkOpenGLState;
94 
95 class VTKRENDERINGOPENGL2_EXPORT vtkOpenGLRenderWindow : public vtkRenderWindow
96 {
97 public:
99  void PrintSelf(ostream& os, vtkIndent indent) override;
100 
104  void Start(void) override;
105 
110  void Frame() override;
111 
115  const char* GetRenderingBackend() override;
116 
118 
124 
126 
131  unsigned char* GetPixelData(int x, int y, int x2, int y2, int front, int right) override;
133  int x, int y, int x2, int y2, int front, vtkUnsignedCharArray* data, int right) override;
135  int x, int y, int x2, int y2, unsigned char* data, int front, int right) override;
137  int x, int y, int x2, int y2, vtkUnsignedCharArray* data, int front, int right) override;
139 
141 
144  float* GetRGBAPixelData(int x, int y, int x2, int y2, int front, int right = 0) override;
146  int x, int y, int x2, int y2, int front, vtkFloatArray* data, int right = 0) override;
148  int x, int y, int x2, int y2, float* data, int front, int blend = 0, int right = 0) override;
149  int SetRGBAPixelData(int x, int y, int x2, int y2, vtkFloatArray* data, int front, int blend = 0,
150  int right = 0) override;
151  void ReleaseRGBAPixelData(float* data) override;
152  unsigned char* GetRGBACharPixelData(
153  int x, int y, int x2, int y2, int front, int right = 0) override;
155  int x, int y, int x2, int y2, int front, vtkUnsignedCharArray* data, int right = 0) override;
156  int SetRGBACharPixelData(int x, int y, int x2, int y2, unsigned char* data, int front,
157  int blend = 0, int right = 0) override;
158  int SetRGBACharPixelData(int x, int y, int x2, int y2, vtkUnsignedCharArray* data, int front,
159  int blend = 0, int right = 0) override;
161 
163 
166  float* GetZbufferData(int x1, int y1, int x2, int y2) override;
167  int GetZbufferData(int x1, int y1, int x2, int y2, float* z) override;
168  int GetZbufferData(int x1, int y1, int x2, int y2, vtkFloatArray* buffer) override;
169  int SetZbufferData(int x1, int y1, int x2, int y2, float* buffer) override;
170  int SetZbufferData(int x1, int y1, int x2, int y2, vtkFloatArray* buffer) override;
172 
177 
182 
187 
191  int GetDepthBufferSize() override;
192 
197 
202  int GetColorBufferSizes(int* rgba) override;
203 
209  int GetColorBufferInternalFormat(int attachmentPoint);
210 
214  virtual void OpenGLInit();
215 
216  // Initialize the state of OpenGL that VTK wants for this window
217  virtual void OpenGLInitState();
218 
219  // Initialize VTK for rendering in a new OpenGL context
220  virtual void OpenGLInitContext();
221 
227  void GetOpenGLVersion(int& major, int& minor);
228 
230  VTK_DEPRECATED_IN_9_1_0("Removed in 9.1, now always returns 0")
231  unsigned int GetBackLeftBuffer();
232  VTK_DEPRECATED_IN_9_1_0("Removed in 9.1, now always returns 0")
233  unsigned int GetBackRightBuffer();
234  VTK_DEPRECATED_IN_9_1_0("Removed in 9.1, now always returns 0")
235  unsigned int GetFrontLeftBuffer();
236  VTK_DEPRECATED_IN_9_1_0("Removed in 9.1, now always returns 0")
237  unsigned int GetFrontRightBuffer();
238  VTK_DEPRECATED_IN_9_1_0("Removed in 9.1, now always returns 0")
239  unsigned int GetBackBuffer();
240  VTK_DEPRECATED_IN_9_1_0("Removed in 9.1, now always returns 0")
241  unsigned int GetFrontBuffer();
243 
247  virtual vtkMTimeType GetContextCreationTime();
248 
252  vtkOpenGLShaderCache* GetShaderCache();
253 
258 
260 
263  vtkGetObjectMacro(RenderFramebuffer, vtkOpenGLFramebufferObject);
264  VTK_DEPRECATED_IN_9_1_0("Removed in 9.1")
265  vtkOpenGLFramebufferObject* GetOffScreenFramebuffer() { return this->RenderFramebuffer; }
267 
271  vtkGetObjectMacro(DisplayFramebuffer, vtkOpenGLFramebufferObject);
272 
278 
283  void WaitForCompletion() override;
284 
288  virtual void DrawPixels(
289  int x1, int y1, int x2, int y2, int numComponents, int dataType, void* data);
290 
295  virtual void DrawPixels(int dstXmin, int dstYmin, int dstXmax, int dstYmax, int srcXmin,
296  int srcYmin, int srcXmax, int srcYmax, int srcWidth, int srcHeight, int numComponents,
297  int dataType, void* data);
298 
303  virtual void DrawPixels(int srcWidth, int srcHeight, int numComponents, int dataType, void* data);
304 
308  virtual float GetMaximumHardwareLineWidth() { return this->MaximumHardwareLineWidth; }
309 
316  virtual bool IsPointSpriteBugPresent() { return false; }
317 
324  int vtktype, int numComponents, bool needInteger, bool needFloat, bool needSRGB);
325 
331  std::string GetOpenGLSupportMessage() { return this->OpenGLSupportMessage; }
332 
336  int SupportsOpenGL() override;
337 
341  const char* ReportCapabilities() override;
342 
349  virtual void Initialize(void) {}
350 
351  std::set<vtkGenericOpenGLResourceFreeCallback*> Resources;
352 
354  {
355  std::set<vtkGenericOpenGLResourceFreeCallback*>::iterator it = this->Resources.find(cb);
356  if (it == this->Resources.end())
357  {
358  this->Resources.insert(cb);
359  }
360  }
361 
363  {
364  std::set<vtkGenericOpenGLResourceFreeCallback*>::iterator it = this->Resources.find(cb);
365  if (it != this->Resources.end())
366  {
367  this->Resources.erase(it);
368  }
369  }
370 
380  virtual void PushContext() { this->MakeCurrent(); }
381  virtual void PopContext() {}
382 
388 
398  virtual bool SetSwapControl(int) { return false; }
399 
400  // Get the state object used to keep track of
401  // OpenGL state
402  virtual vtkOpenGLState* GetState() { return this->State; }
403 
404  // Get a VBO that can be shared by many
405  // It consists of normalized display
406  // coordinates for a quad and tcoords
408 
409  // Activate and return thje texture unit for a generic 2d 64x64
410  // float greyscale noise texture ranging from 0 to 1. The texture is
411  // generated using PerlinNoise. This textur eunit will automatically
412  // be deactivated at the end of the render process.
414 
418  void End() override;
419 
423  void Render() override;
424 
429  void StereoMidpoint() override;
430 
431  // does VTKs framebuffer require resolving for reading pixels
433 
439 
444 
448  void BlitDisplayFramebuffer(int right, int srcX, int srcY, int srcWidth, int srcHeight, int destX,
449  int destY, int destWidth, int destHeight, int bufferMode, int interpolation);
450 
452 
456  void BlitToRenderFramebuffer(bool includeDepth);
457  void BlitToRenderFramebuffer(int srcX, int srcY, int srcWidth, int srcHeight, int destX,
458  int destY, int destWidth, int destHeight, int bufferMode, int interpolation);
460 
466  {
467  BlitToHardware, // hardware buffers
468  BlitToCurrent, // currently bound draw framebuffer
469  NoBlit // no blit, GUI or external code will handle the blit
470  };
471 
473 
477  vtkSetClampMacro(FrameBlitMode, FrameBlitModes, BlitToHardware, NoBlit);
478  vtkGetMacro(FrameBlitMode, FrameBlitModes);
479  void SetFrameBlitModeToBlitToHardware() { this->SetFrameBlitMode(BlitToHardware); }
480  void SetFrameBlitModeToBlitToCurrent() { this->SetFrameBlitMode(BlitToCurrent); }
481  void SetFrameBlitModeToNoBlit() { this->SetFrameBlitMode(NoBlit); }
483 
485 
488  vtkSetMacro(FramebufferFlipY, bool);
489  vtkGetMacro(FramebufferFlipY, bool);
490  vtkBooleanMacro(FramebufferFlipY, bool);
492 
494  // copy depth values from a source framebuffer to a destination framebuffer
495  // using texture maps to do the copy. The source framebufferobject must be texture
496  // backed. This method is designed to work around issues with trying to blit depth
497  // values between framebuffers that have different depth formats.
498 
499  // blit entire source texture to active viewport
501 
502  // blit specified source texels to active viewport
503  virtual void TextureDepthBlit(vtkTextureObject* source, int srcX, int srcY, int srcX2, int srcY2);
504 
505  // blit specified source texels to specified viewport
506  virtual void TextureDepthBlit(vtkTextureObject* source, int srcX, int srcY, int srcX2, int srcY2,
507  int destX, int destY, int destX2, int destY2);
509 
510 protected:
513 
514  // blits the display buffers to the appropriate hardware buffers
516 
517  // when frame is called, at the end blit to the hardware buffers
519 
520  // a FSQ we use to resolve MSAA that handles gamma
522 
523  // a FSQ we use to blit depth values
525 
526  // a FSQ we use to flip framebuffer texture
528 
529  // flip quad helpers Y tcoord
531 
532  // resolve and flip renderframebuffer as needed
533  // when copying to displayframebuffer. Returns
534  // true if the color buffer was copied.
536 
537  // used in testing for opengl support
538  // in the SupportsOpenGL() method
542 
543  virtual int ReadPixels(
544  const vtkRecti& rect, int front, int glFormat, int glType, void* data, int right = 0);
545 
554  int CreateFramebuffers(int width, int height);
557 
558  // used when we need to resolve a multisampled
559  // framebuffer
561 
565  virtual void CreateAWindow() = 0;
566 
570  virtual void DestroyWindow() = 0;
571 
575  void SaveGLState();
576 
581 
582  std::map<std::string, int> GLStateIntegers;
583 
588 
590 
592 
593  bool Initialized; // ensure glewinit has been called
594  bool GlewInitValid; // Did glewInit initialize with a valid state?
595 
597 
599 
600  // used for fast quad rendering
602 
603  // noise texture
605 
607 
608  // keep track of in case we need to recreate the framebuffer
610 
611  int ScreenSize[2];
612 
613 private:
615  void operator=(const vtkOpenGLRenderWindow&) = delete;
616 
617  // Keeping `State` private so the only way to access it is through
618  // `this->GetState()`.
619  vtkOpenGLState* State;
620 };
621 
622 #endif
dynamic, self-adjusting array of float
list of point or cell ids
Definition: vtkIdList.h:143
a simple class to control print indentation
Definition: vtkIndent.h:119
OpenGL buffer object.
Internal class which encapsulates OpenGL FramebufferObject.
Class to make rendering a full screen quad easier.
OpenGL rendering window.
void ReleaseGraphicsResources(vtkWindow *) override
Free up any graphics resources associated with this window a value of NULL means the context may alre...
int GetColorBufferInternalFormat(int attachmentPoint)
Get the internal format of current attached texture or render buffer.
int SetRGBACharPixelData(int x, int y, int x2, int y2, vtkUnsignedCharArray *data, int front, int blend=0, int right=0) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
virtual void DrawPixels(int dstXmin, int dstYmin, int dstXmax, int dstYmax, int srcXmin, int srcYmin, int srcXmax, int srcYmax, int srcWidth, int srcHeight, int numComponents, int dataType, void *data)
Replacement for the old glDrawPixels function, but it allows for scaling the data and using only part...
vtkOpenGLFramebufferObject * DisplayFramebuffer
std::map< std::string, int > GLStateIntegers
std::string GetOpenGLSupportMessage()
Return a message profiding additional details about the results of calling SupportsOpenGL() This can ...
int GetRGBAPixelData(int x, int y, int x2, int y2, int front, vtkFloatArray *data, int right=0) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
vtkOpenGLBufferObject * GetTQuad2DVBO()
virtual void DrawPixels(int x1, int y1, int x2, int y2, int numComponents, int dataType, void *data)
Replacement for the old glDrawPixels function.
int SetRGBAPixelData(int x, int y, int x2, int y2, float *data, int front, int blend=0, int right=0) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
int GetTextureUnitForTexture(vtkTextureObject *)
Get the texture unit for a given texture object.
void RegisterGraphicsResources(vtkGenericOpenGLResourceFreeCallback *cb)
virtual void DestroyWindow()=0
Destroy a not-off-screen window.
FrameBlitModes
Define how the resulting image should be blitted when at the end of the Frame() call if SwapBuffers i...
virtual void TextureDepthBlit(vtkTextureObject *source)
vtkTypeBool OwnContext
Flag telling if the context has been created here or was inherited.
int GetZbufferData(int x1, int y1, int x2, int y2, float *z) override
Set/Get the zbuffer data from an image.
virtual void TextureDepthBlit(vtkTextureObject *source, int srcX, int srcY, int srcX2, int srcY2, int destX, int destY, int destX2, int destY2)
void StereoMidpoint() override
Intermediate method performs operations required between the rendering of the left and right eye.
vtkTextureObject * NoiseTextureObject
vtkOpenGLFramebufferObject * ResolveFramebuffer
int GetZbufferData(int x1, int y1, int x2, int y2, vtkFloatArray *buffer) override
Set/Get the zbuffer data from an image.
unsigned char * GetRGBACharPixelData(int x, int y, int x2, int y2, int front, int right=0) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
void End() override
Update the system, if needed, at end of render process.
unsigned char * GetPixelData(int x, int y, int x2, int y2, int front, int right) override
Set/Get the pixel data of an image, transmitted as RGBRGB...
void BlitToRenderFramebuffer(bool includeDepth)
Blit the currently bound read buffer to the renderbuffer.
static void SetGlobalMaximumNumberOfMultiSamples(int val)
Set/Get the maximum number of multisamples.
virtual float GetMaximumHardwareLineWidth()
Return the largest line width supported by the hardware.
vtkTextureUnitManager * GetTextureUnitManager()
Returns its texture unit manager object.
int GetDefaultTextureInternalFormat(int vtktype, int numComponents, bool needInteger, bool needFloat, bool needSRGB)
Get a mapping of vtk data types to native texture formats for this window we put this on the RenderWi...
void ActivateTexture(vtkTextureObject *)
Activate a texture unit for this texture.
vtkTextureObject * DrawPixelsTextureObject
bool GetUsingSRGBColorSpace()
Is this window/fo in sRGB colorspace.
void Start(void) override
Begin the rendering process.
int GetColorBufferSizes(int *rgba) override
Get the size of the color buffer.
int SetPixelData(int x, int y, int x2, int y2, unsigned char *data, int front, int right) override
Set/Get the pixel data of an image, transmitted as RGBRGB...
int SetRGBACharPixelData(int x, int y, int x2, int y2, unsigned char *data, int front, int blend=0, int right=0) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
void Render() override
Handle opengl specific code and calls superclass.
void UnregisterGraphicsResources(vtkGenericOpenGLResourceFreeCallback *cb)
void BlitDisplayFramebuffer(int right, int srcX, int srcY, int srcWidth, int srcHeight, int destX, int destY, int destWidth, int destHeight, int bufferMode, int interpolation)
Blit a display buffer into a currently bound draw destination.
void Frame() override
A termination method performed at the end of the rendering process to do things like swapping buffers...
virtual bool IsPointSpriteBugPresent()
Returns true if driver has an EGL/OpenGL bug that makes vtkChartsCoreCxx-TestChartDoubleColors and ot...
void ReleaseRGBAPixelData(float *data) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
std::set< vtkGenericOpenGLResourceFreeCallback * > Resources
const char * GetRenderingBackend() override
What rendering backend has the user requested.
virtual void OpenGLInitContext()
vtkOpenGLQuadHelper * DepthBlitQuad
virtual void TextureDepthBlit(vtkTextureObject *source, int srcX, int srcY, int srcX2, int srcY2)
void WaitForCompletion() override
Block the thread until the actual rendering is finished().
virtual bool ResolveFlipRenderFramebuffer()
virtual void PushContext()
Ability to push and pop this window's context as the current context.
float * GetRGBAPixelData(int x, int y, int x2, int y2, int front, int right=0) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
vtkOpenGLQuadHelper * FlipQuad
virtual void OpenGLInitState()
vtkOpenGLFramebufferObject * RenderFramebuffer
static int GetGlobalMaximumNumberOfMultiSamples()
Set/Get the maximum number of multisamples.
virtual void CreateAWindow()=0
Create a not-off-screen window.
void BlitToRenderFramebuffer(int srcX, int srcY, int srcWidth, int srcHeight, int destX, int destY, int destWidth, int destHeight, int bufferMode, int interpolation)
Blit the currently bound read buffer to the renderbuffer.
virtual int ReadPixels(const vtkRecti &rect, int front, int glFormat, int glType, void *data, int right=0)
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
int SupportsOpenGL() override
Does this render window support OpenGL? 0-false, 1-true.
int SetZbufferData(int x1, int y1, int x2, int y2, vtkFloatArray *buffer) override
Set/Get the zbuffer data from an image.
const char * ReportCapabilities() override
Get report of capabilities for the render window.
int SetPixelData(int x, int y, int x2, int y2, vtkUnsignedCharArray *data, int front, int right) override
Set/Get the pixel data of an image, transmitted as RGBRGB...
int GetDepthBufferSize() override
Get the size of the depth buffer.
void SetFrameBlitModeToBlitToCurrent()
SetGet how to handle blits at the end of a Frame() call.
bool InitializeFromCurrentContext() override
Initialize the render window from the information associated with the currently activated OpenGL cont...
virtual vtkOpenGLState * GetState()
virtual bool SetSwapControl(int)
Set the number of vertical syncs required between frames.
vtkOpenGLBufferObject * TQuad2DVBO
~vtkOpenGLRenderWindow() override
virtual void Initialize(void)
Initialize the rendering window.
void SetFrameBlitModeToNoBlit()
SetGet how to handle blits at the end of a Frame() call.
int CreateFramebuffers(int width, int height)
Create the offScreen framebuffer Return if the creation was successful or not.
virtual void OpenGLInit()
Initialize OpenGL for this window.
int SetZbufferData(int x1, int y1, int x2, int y2, float *buffer) override
Set/Get the zbuffer data from an image.
void BlitDisplayFramebuffer()
Blit a display framebuffer into a currently bound draw destination.
virtual void BlitDisplayFramebuffersToHardware()
void DeactivateTexture(vtkTextureObject *)
Deactivate a previously activated texture.
void RestoreGLState()
Restore OpenGL state at end of the rendering.
void GetOpenGLVersion(int &major, int &minor)
Get the major and minor version numbers of the OpenGL context we are using ala 3.2,...
void SaveGLState()
Query and save OpenGL state.
int SetRGBAPixelData(int x, int y, int x2, int y2, vtkFloatArray *data, int front, int blend=0, int right=0) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
int GetRGBACharPixelData(int x, int y, int x2, int y2, int front, vtkUnsignedCharArray *data, int right=0) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
float * GetZbufferData(int x1, int y1, int x2, int y2) override
Set/Get the zbuffer data from an image.
void SetFrameBlitModeToBlitToHardware()
SetGet how to handle blits at the end of a Frame() call.
int GetPixelData(int x, int y, int x2, int y2, int front, vtkUnsignedCharArray *data, int right) override
Set/Get the pixel data of an image, transmitted as RGBRGB...
virtual void DrawPixels(int srcWidth, int srcHeight, int numComponents, int dataType, void *data)
Replacement for the old glDrawPixels function.
vtkOpenGLQuadHelper * ResolveQuad
manage Shader Programs within a context
OpenGL state storage.
The VertexArrayObject class uses, or emulates, vertex array objects.
manage vertex buffer objects shared within a context
create a window for renderers to draw into
The ShaderProgram uses one or more Shader objects.
Wrapper around std::string to keep symbols short.
Definition: vtkStdString.h:108
abstracts an OpenGL texture object.
allocate/free texture units.
handles properties associated with a texture map
Definition: vtkTexture.h:178
record modification and/or execution time
Definition: vtkTimeStamp.h:55
dynamic, self-adjusting array of unsigned char
window superclass for vtkRenderWindow
Definition: vtkWindow.h:39
virtual void MakeCurrent()
Make the window current.
Definition: vtkWindow.h:246
@ height
Definition: vtkX3D.h:260
@ data
Definition: vtkX3D.h:321
@ string
Definition: vtkX3D.h:496
int vtkTypeBool
Definition: vtkABI.h:69
boost::graph_traits< vtkGraph * >::vertex_descriptor source(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
#define VTK_DEPRECATED_IN_9_1_0(reason)
vtkTypeUInt32 vtkMTimeType
Definition: vtkType.h:287