You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
203 lines
6.7 KiB
C
203 lines
6.7 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: vtkRenderWindow.h
|
||
|
|
||
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
||
|
All rights reserved.
|
||
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
||
|
|
||
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
||
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||
|
PURPOSE. See the above copyright notice for more information.
|
||
|
|
||
|
=========================================================================*/
|
||
|
/**
|
||
|
* @class vtkGenericOpenGLRenderWindow
|
||
|
* @brief platform independent render window
|
||
|
*
|
||
|
*
|
||
|
* vtkGenericOpenGLRenderWindow provides a skeleton for implementing a render window
|
||
|
* using one's own OpenGL context and drawable.
|
||
|
* To be effective, one must register an observer for WindowMakeCurrentEvent,
|
||
|
* WindowIsCurrentEvent and WindowFrameEvent. When this class sends a WindowIsCurrentEvent,
|
||
|
* the call data is an bool* which one can use to return whether the context is current.
|
||
|
*/
|
||
|
|
||
|
#ifndef vtkGenericOpenGLRenderWindow_h
|
||
|
#define vtkGenericOpenGLRenderWindow_h
|
||
|
|
||
|
#include "vtkOpenGLRenderWindow.h"
|
||
|
#include "vtkRenderingOpenGL2Module.h" // For export macro
|
||
|
|
||
|
class VTKRENDERINGOPENGL2_EXPORT vtkGenericOpenGLRenderWindow : public vtkOpenGLRenderWindow
|
||
|
{
|
||
|
public:
|
||
|
static vtkGenericOpenGLRenderWindow* New();
|
||
|
vtkTypeMacro(vtkGenericOpenGLRenderWindow, vtkOpenGLRenderWindow);
|
||
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
||
|
|
||
|
protected:
|
||
|
vtkGenericOpenGLRenderWindow();
|
||
|
~vtkGenericOpenGLRenderWindow() override;
|
||
|
|
||
|
public:
|
||
|
//! Cleans up graphics resources allocated in the context for this VTK scene.
|
||
|
void Finalize() override;
|
||
|
|
||
|
//! flush the pending drawing operations
|
||
|
//! Class user may to watch for WindowFrameEvent and act on it
|
||
|
void Frame() override;
|
||
|
|
||
|
//! Makes the context current. It is the class user's
|
||
|
//! responsibility to watch for WindowMakeCurrentEvent and set it current.
|
||
|
void MakeCurrent() override;
|
||
|
|
||
|
//! Returns if the context is current. It is the class user's
|
||
|
//! responsibility to watch for WindowIsCurrentEvent and set the bool* flag
|
||
|
//! passed through the call data parameter.
|
||
|
bool IsCurrent() override;
|
||
|
|
||
|
//! Returns if OpenGL is supported. It is the class user's
|
||
|
//! responsibility to watch for WindowSupportsOpenGLEvent and set the int* flag
|
||
|
//! passed through the call data parameter.
|
||
|
int SupportsOpenGL() override;
|
||
|
|
||
|
//! Returns if the context is direct. It is the class user's
|
||
|
//! responsibility to watch for WindowIsDirectEvent and set the int* flag
|
||
|
//! passed through the call data parameter.
|
||
|
vtkTypeBool IsDirect() override;
|
||
|
|
||
|
// {@
|
||
|
//! set the drawing buffers to use
|
||
|
void SetFrontLeftBuffer(unsigned int);
|
||
|
void SetFrontRightBuffer(unsigned int);
|
||
|
void SetBackLeftBuffer(unsigned int);
|
||
|
void SetBackRightBuffer(unsigned int);
|
||
|
// }@
|
||
|
|
||
|
void SetDefaultFrameBufferId(unsigned int);
|
||
|
void SetOwnContext(int);
|
||
|
|
||
|
//! no-op (for API compat with OpenGL1).
|
||
|
void PushState() {}
|
||
|
//! no-op (for API compat with OpenGL1).
|
||
|
void PopState() {}
|
||
|
|
||
|
// {@
|
||
|
//! does nothing
|
||
|
void SetWindowId(void*) override;
|
||
|
void* GetGenericWindowId() override;
|
||
|
void SetDisplayId(void*) override;
|
||
|
void SetParentId(void*) override;
|
||
|
void* GetGenericDisplayId() override;
|
||
|
void* GetGenericParentId() override;
|
||
|
void* GetGenericContext() override;
|
||
|
void* GetGenericDrawable() override;
|
||
|
void SetWindowInfo(const char*) override;
|
||
|
void SetParentInfo(const char*) override;
|
||
|
int* GetScreenSize() VTK_SIZEHINT(2) override;
|
||
|
void HideCursor() override;
|
||
|
void ShowCursor() override;
|
||
|
void SetFullScreen(vtkTypeBool) override;
|
||
|
void WindowRemap() override;
|
||
|
vtkTypeBool GetEventPending() override;
|
||
|
void SetNextWindowId(void*) override;
|
||
|
void SetNextWindowInfo(const char*) override;
|
||
|
void CreateAWindow() override;
|
||
|
void DestroyWindow() override;
|
||
|
// }@
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Allow to update state within observer callback without changing
|
||
|
* data argument and MTime.
|
||
|
*/
|
||
|
void SetIsDirect(vtkTypeBool newValue);
|
||
|
void SetSupportsOpenGL(int newValue);
|
||
|
void SetIsCurrent(bool newValue);
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Override the Render method to do some state management.
|
||
|
* This method saves the OpenGL state before asking its child renderers to
|
||
|
* render their image. Once this is done, the OpenGL state is restored.
|
||
|
* \sa vtkOpenGLRenderWindow::SaveGLState()
|
||
|
* \sa vtkOpenGLRenderWindow::RestoreGLState()
|
||
|
*/
|
||
|
void Render() override;
|
||
|
|
||
|
/**
|
||
|
* Overridden to pass explicitly specified MaximumHardwareLineWidth, if any.
|
||
|
*/
|
||
|
float GetMaximumHardwareLineWidth() override;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Specify a non-zero line width to force the hardware line width determined
|
||
|
* by the window.
|
||
|
*/
|
||
|
vtkSetClampMacro(ForceMaximumHardwareLineWidth, float, 0, VTK_FLOAT_MAX);
|
||
|
vtkGetMacro(ForceMaximumHardwareLineWidth, float);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set this to true to indicate that the context is now ready. For backwards
|
||
|
* compatibility reasons, it's set to true by default. If set to false, the
|
||
|
* `Render` call will be skipped entirely.
|
||
|
*/
|
||
|
vtkSetMacro(ReadyForRendering, bool);
|
||
|
vtkGetMacro(ReadyForRendering, bool);
|
||
|
|
||
|
/**
|
||
|
* Set the size of the screen in pixels.
|
||
|
* An HDTV for example would be 1920 x 1080 pixels.
|
||
|
*/
|
||
|
vtkSetVector2Macro(ScreenSize, int);
|
||
|
|
||
|
/**
|
||
|
* Overridden to invoke vtkCommand::CursorChangedEvent
|
||
|
*/
|
||
|
void SetCurrentCursor(int cShape) override;
|
||
|
|
||
|
// since we are using an external context it must
|
||
|
// specify if the window is mapped or not.
|
||
|
vtkSetMacro(Mapped, vtkTypeBool);
|
||
|
|
||
|
/**
|
||
|
* Overridden to simply call `GetReadyForRendering`
|
||
|
*/
|
||
|
VTK_LEGACY(bool IsDrawable() override);
|
||
|
|
||
|
protected:
|
||
|
/**
|
||
|
* Overridden to not attempt to read pixels if `this->ReadyForRendering` is
|
||
|
* false. In that case, this method will simply return `VTK_ERROR`. Otherwise,
|
||
|
* the superclass' implementation will be called.
|
||
|
*/
|
||
|
int ReadPixels(
|
||
|
const vtkRecti& rect, int front, int glFormat, int glType, void* data, int right) override;
|
||
|
|
||
|
int SetPixelData(
|
||
|
int x1, int y1, int x2, int y2, unsigned char* data, int front, int right) override;
|
||
|
int SetPixelData(
|
||
|
int x1, int y1, int x2, int y2, vtkUnsignedCharArray* data, int front, int right) override;
|
||
|
int SetRGBACharPixelData(
|
||
|
int x1, int y1, int x2, int y2, unsigned char* data, int front, int blend, int right) override;
|
||
|
int SetRGBACharPixelData(int x, int y, int x2, int y2, vtkUnsignedCharArray* data, int front,
|
||
|
int blend = 0, int right = 0) override;
|
||
|
|
||
|
int DirectStatus;
|
||
|
int SupportsOpenGLStatus;
|
||
|
bool CurrentStatus;
|
||
|
float ForceMaximumHardwareLineWidth;
|
||
|
bool ReadyForRendering;
|
||
|
|
||
|
private:
|
||
|
vtkGenericOpenGLRenderWindow(const vtkGenericOpenGLRenderWindow&) = delete;
|
||
|
void operator=(const vtkGenericOpenGLRenderWindow&) = delete;
|
||
|
};
|
||
|
|
||
|
#endif
|