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++

/*=========================================================================
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