207 lines
5.6 KiB
C++
207 lines
5.6 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkOpenGLContextDevice3D.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 vtkOpenGLContextDevice3D
|
|
* @brief OpenGL class drawing 3D primitives.
|
|
*
|
|
*
|
|
* This defines the implementation of a 3D context device for drawing simple
|
|
* primitives.
|
|
*/
|
|
|
|
#ifndef vtkOpenGLContextDevice3D_h
|
|
#define vtkOpenGLContextDevice3D_h
|
|
|
|
#include "vtkContextDevice3D.h"
|
|
#include "vtkNew.h" // For ivars.
|
|
#include "vtkRenderingContextOpenGL2Module.h" // For export macro
|
|
#include <vector> // STL Header
|
|
|
|
class vtkBrush;
|
|
class vtkOpenGLContextDevice2D;
|
|
class vtkOpenGLHelper;
|
|
class vtkOpenGLRenderWindow;
|
|
class vtkPen;
|
|
class vtkRenderer;
|
|
class vtkShaderProgram;
|
|
class vtkTransform;
|
|
|
|
class VTKRENDERINGCONTEXTOPENGL2_EXPORT vtkOpenGLContextDevice3D : public vtkContextDevice3D
|
|
{
|
|
public:
|
|
vtkTypeMacro(vtkOpenGLContextDevice3D, vtkContextDevice3D);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
static vtkOpenGLContextDevice3D* New();
|
|
|
|
/**
|
|
* Draw a polyline between the specified points.
|
|
*/
|
|
void DrawPoly(const float* verts, int n, const unsigned char* colors, int nc) override;
|
|
|
|
/**
|
|
* Draw lines defined by specified pair of points.
|
|
* \sa DrawPoly()
|
|
*/
|
|
void DrawLines(const float* verts, int n, const unsigned char* colors, int nc) override;
|
|
|
|
/**
|
|
* Draw points at the vertex positions specified.
|
|
*/
|
|
void DrawPoints(const float* verts, int n, const unsigned char* colors, int nc) override;
|
|
|
|
/**
|
|
* Draw triangles to generate the specified mesh.
|
|
*/
|
|
void DrawTriangleMesh(const float* mesh, int n, const unsigned char* colors, int nc) override;
|
|
|
|
/**
|
|
* Apply the supplied pen which controls the outlines of shapes, as well as
|
|
* lines, points and related primitives. This makes a deep copy of the vtkPen
|
|
* object in the vtkContext2D, it does not hold a pointer to the supplied object.
|
|
*/
|
|
void ApplyPen(vtkPen* pen) override;
|
|
|
|
/**
|
|
* Apply the supplied brush which controls the outlines of shapes, as well as
|
|
* lines, points and related primitives. This makes a deep copy of the vtkBrush
|
|
* object in the vtkContext2D, it does not hold a pointer to the supplied object.
|
|
*/
|
|
void ApplyBrush(vtkBrush* brush) override;
|
|
|
|
/**
|
|
* Set the model view matrix for the display
|
|
*/
|
|
void SetMatrix(vtkMatrix4x4* m) override;
|
|
|
|
/**
|
|
* Set the model view matrix for the display
|
|
*/
|
|
void GetMatrix(vtkMatrix4x4* m) override;
|
|
|
|
/**
|
|
* Multiply the current model view matrix by the supplied one
|
|
*/
|
|
void MultiplyMatrix(vtkMatrix4x4* m) override;
|
|
|
|
/**
|
|
* Push the current matrix onto the stack.
|
|
*/
|
|
void PushMatrix() override;
|
|
|
|
/**
|
|
* Pop the current matrix off of the stack.
|
|
*/
|
|
void PopMatrix() override;
|
|
|
|
/**
|
|
* Supply a float array of length 4 with x1, y1, width, height specifying
|
|
* clipping region for the device in pixels.
|
|
*/
|
|
void SetClipping(const vtkRecti& rect) override;
|
|
|
|
/**
|
|
* Enable or disable the clipping of the scene.
|
|
*/
|
|
void EnableClipping(bool enable) override;
|
|
|
|
///@{
|
|
/**
|
|
* Enable/Disable the specified clipping plane.
|
|
* i is the index of the clipping plane being enabled or disabled (0 - 5).
|
|
* planeEquation points to the four coefficients of the equation for the
|
|
* clipping plane: Ax + By + Cz + D = 0. This is the equation format
|
|
* expected by glClipPlane.
|
|
*/
|
|
void EnableClippingPlane(int i, double* planeEquation) override;
|
|
void DisableClippingPlane(int i) override;
|
|
///@}
|
|
|
|
/**
|
|
* This must be set during initialization
|
|
*/
|
|
void Initialize(vtkRenderer*, vtkOpenGLContextDevice2D*);
|
|
|
|
/**
|
|
* Begin drawing, pass in the viewport to set up the view.
|
|
*/
|
|
virtual void Begin(vtkViewport* viewport);
|
|
|
|
protected:
|
|
vtkOpenGLContextDevice3D();
|
|
~vtkOpenGLContextDevice3D() override;
|
|
|
|
/**
|
|
* Begin drawing, turn on the depth buffer.
|
|
*/
|
|
virtual void EnableDepthBuffer();
|
|
|
|
/**
|
|
* End drawing, turn off the depth buffer.
|
|
*/
|
|
virtual void DisableDepthBuffer();
|
|
|
|
vtkOpenGLHelper* VCBO; // vertex + color
|
|
void ReadyVCBOProgram();
|
|
vtkOpenGLHelper* VBO; // vertex
|
|
void ReadyVBOProgram();
|
|
|
|
void SetMatrices(vtkShaderProgram* prog);
|
|
void BuildVBO(vtkOpenGLHelper* cbo, const float* v, int nv, const unsigned char* coolors, int nc,
|
|
float* tcoords);
|
|
void CoreDrawTriangles(std::vector<float>& tverts);
|
|
|
|
// do we have wide lines that require special handling
|
|
virtual bool HaveWideLines();
|
|
|
|
vtkTransform* ModelMatrix;
|
|
|
|
/**
|
|
* The OpenGL render window being used by the device
|
|
*/
|
|
vtkOpenGLRenderWindow* RenderWindow;
|
|
|
|
/**
|
|
* We need to store a pointer to get the camera mats
|
|
*/
|
|
vtkRenderer* Renderer;
|
|
|
|
std::vector<bool> ClippingPlaneStates;
|
|
std::vector<double> ClippingPlaneValues;
|
|
|
|
private:
|
|
vtkOpenGLContextDevice3D(const vtkOpenGLContextDevice3D&) = delete;
|
|
void operator=(const vtkOpenGLContextDevice3D&) = delete;
|
|
|
|
///@{
|
|
/**
|
|
* Private data pointer of the class
|
|
*/
|
|
class Private;
|
|
Private* Storage;
|
|
///@}
|
|
|
|
// we need a pointer to this because only
|
|
// the 2D device gets a Begin and sets up
|
|
// the ortho matrix
|
|
vtkOpenGLContextDevice2D* Device2D;
|
|
|
|
vtkNew<vtkBrush> Brush;
|
|
vtkNew<vtkPen> Pen;
|
|
};
|
|
|
|
#endif
|