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.
140 lines
4.3 KiB
C++
140 lines
4.3 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkPanoramicProjectionPass.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 vtkPanoramicProjectionPass
|
|
* @brief Render pass that render the scene in a cubemap and project
|
|
* these six renderings to a single quad.
|
|
* There are currently two different projections implemented (Equirectangular and Azimuthal).
|
|
* This pass can be used to produce images that can be visualize with specific devices that re-maps
|
|
* the distorted image to a panoramic view (for instance VR headsets, domes, panoramic screens)
|
|
*
|
|
* Note that it is often necessary to disable frustum cullers in order to render
|
|
* properly objects that are behind the camera.
|
|
*
|
|
* @sa
|
|
* vtkRenderPass
|
|
*/
|
|
|
|
#ifndef vtkPanoramicProjectionPass_h
|
|
#define vtkPanoramicProjectionPass_h
|
|
|
|
#include "vtkImageProcessingPass.h"
|
|
#include "vtkRenderingOpenGL2Module.h" // For export macro
|
|
|
|
class vtkOpenGLFramebufferObject;
|
|
class vtkOpenGLQuadHelper;
|
|
class vtkTextureObject;
|
|
|
|
class VTKRENDERINGOPENGL2_EXPORT vtkPanoramicProjectionPass : public vtkImageProcessingPass
|
|
{
|
|
public:
|
|
static vtkPanoramicProjectionPass* New();
|
|
vtkTypeMacro(vtkPanoramicProjectionPass, vtkImageProcessingPass);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
/**
|
|
* Perform rendering according to a render state.
|
|
*/
|
|
void Render(const vtkRenderState* s) override;
|
|
|
|
/**
|
|
* Release graphics resources and ask components to release their own resources.
|
|
*/
|
|
void ReleaseGraphicsResources(vtkWindow* w) override;
|
|
|
|
//@{
|
|
/**
|
|
* Get/Set the cubemap textures resolution used to render (offscreen) all directions.
|
|
* Default is 300.
|
|
*/
|
|
vtkGetMacro(CubeResolution, unsigned int);
|
|
vtkSetMacro(CubeResolution, unsigned int);
|
|
//@}
|
|
|
|
/**
|
|
* Enumeration of projection types.
|
|
*/
|
|
enum : int
|
|
{
|
|
Equirectangular = 1, /**< Equirectangular projection */
|
|
Azimuthal = 2 /**< Azimuthal equidistant projection */
|
|
};
|
|
|
|
//@{
|
|
/**
|
|
* Get/Set the type of projection.
|
|
* Equirectangular projection maps meridians to vertical straight lines and circles of latitude to
|
|
* horizontal straight lines.
|
|
* Azimuthal equidistant projection maps all points of the scene based on their distance to the
|
|
* view direction. This projection produces a fisheye effect.
|
|
* Default is Equirectangular.
|
|
*/
|
|
vtkGetMacro(ProjectionType, int);
|
|
vtkSetClampMacro(ProjectionType, int, Equirectangular, Azimuthal);
|
|
void SetProjectionTypeToEquirectangular() { this->SetProjectionType(Equirectangular); }
|
|
void SetProjectionTypeToAzimuthal() { this->SetProjectionType(Azimuthal); }
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Get/Set the vertical angle of projection.
|
|
* 180 degrees is a half sphere, 360 degrees is a full sphere,
|
|
* but any values in the range (90;360) can be set.
|
|
* Default is 180 degrees.
|
|
*/
|
|
vtkGetMacro(Angle, double);
|
|
vtkSetClampMacro(Angle, double, 90.0, 360.0);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Get/Set the interpolation mode.
|
|
* If true, the projection of the cubemap use hardware interpolation.
|
|
* Default is off.
|
|
*/
|
|
vtkGetMacro(Interpolate, bool);
|
|
vtkSetMacro(Interpolate, bool);
|
|
vtkBooleanMacro(Interpolate, bool);
|
|
//@}
|
|
|
|
protected:
|
|
vtkPanoramicProjectionPass() = default;
|
|
~vtkPanoramicProjectionPass() override = default;
|
|
|
|
void RenderOnFace(const vtkRenderState* s, int index);
|
|
|
|
void Project(vtkOpenGLRenderWindow* renWin);
|
|
|
|
void InitOpenGLResources(vtkOpenGLRenderWindow* renWin);
|
|
|
|
/**
|
|
* Graphics resources.
|
|
*/
|
|
vtkOpenGLFramebufferObject* FrameBufferObject = nullptr;
|
|
vtkTextureObject* CubeMapTexture = nullptr;
|
|
vtkOpenGLQuadHelper* QuadHelper = nullptr;
|
|
|
|
unsigned int CubeResolution = 300;
|
|
int ProjectionType = Equirectangular;
|
|
double Angle = 180.0;
|
|
bool Interpolate = false;
|
|
|
|
private:
|
|
vtkPanoramicProjectionPass(const vtkPanoramicProjectionPass&) = delete;
|
|
void operator=(const vtkPanoramicProjectionPass&) = delete;
|
|
};
|
|
|
|
#endif
|