Stellarium 0.13.3
StelPainter.hpp
1 /*
2  * Stellarium
3  * Copyright (C) 2008 Fabien Chereau
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
18  */
19 
20 #ifndef _STELPAINTER_HPP_
21 #define _STELPAINTER_HPP_
22 
23 #include "StelOpenGL.hpp"
24 #include "VecMath.hpp"
25 #include "StelSphereGeometry.hpp"
26 #include "StelProjectorType.hpp"
27 #include "StelProjector.hpp"
28 #include <QString>
29 #include <QVarLengthArray>
30 #include <QFontMetrics>
31 
32 class QOpenGLShaderProgram;
33 
41 {
42 public:
43  friend class VertexArrayProjector;
44 
47  {
52  };
53 
56  {
57  Points = 0x0000,
58  Lines = 0x0001,
59  LineLoop = 0x0002,
60  LineStrip = 0x0003,
61  Triangles = 0x0004,
62  TriangleStrip = 0x0005,
63  TriangleFan = 0x0006
64  };
65 
66  explicit StelPainter(const StelProjectorP& prj);
67  ~StelPainter();
68 
70  const StelProjectorP& getProjector() const {return prj;}
71  void setProjector(const StelProjectorP& p);
72 
74  void drawViewportShape(void);
75  void drawViewportShape(const GLfloat innerRadius);
76 
87  void drawText(float x, float y, const QString& str, float angleDeg=0.f,
88  float xshift=0.f, float yshift=0.f, bool noGravity=true);
89  void drawText(const Vec3d& v, const QString& str, float angleDeg=0.f,
90  float xshift=0.f, float yshift=0.f, bool noGravity=true);
91 
98  void drawSphericalRegion(const SphericalRegion* region, SphericalPolygonDrawMode drawMode=SphericalPolygonDrawModeFill, const SphericalCap* clippingCap=NULL, bool doSubDivise=true, double maxSqDistortion=5.);
99 
100  void drawGreatCircleArcs(const StelVertexArray& va, const SphericalCap* clippingCap=NULL);
101 
102  void drawSphericalTriangles(const StelVertexArray& va, bool textured, bool colored, const SphericalCap* clippingCap=NULL, bool doSubDivide=true, double maxSqDistortion=5.);
103 
111  void drawSmallCircleArc(const Vec3d& start, const Vec3d& stop, const Vec3d& rotCenter, void (*viewportEdgeIntersectCallback)(const Vec3d& screenPos, const Vec3d& direction, void* userData)=NULL, void* userData=NULL);
112 
119  void drawGreatCircleArc(const Vec3d& start, const Vec3d& stop, const SphericalCap* clippingCap=NULL, void (*viewportEdgeIntersectCallback)(const Vec3d& screenPos, const Vec3d& direction, void* userData)=NULL, void* userData=NULL);
120 
122  void drawCircle(float x, float y, float r);
123 
130  void drawSprite2dMode(float x, float y, float radius);
131  void drawSprite2dMode(const Vec3d& v, float radius);
132 
134  void drawSprite2dModeNoDeviceScale(float x, float y, float radius);
135 
142  void drawSprite2dMode(float x, float y, float radius, float rotation);
143 
147  void drawPoint2d(float x, float y);
148 
154  void drawLine2d(float x1, float y1, float x2, float y2);
155 
163  void drawRect2d(float x, float y, float width, float height, bool textured=true);
164 
180  void sSphere(float radius, float oneMinusOblateness, int slices, int stacks, int orientInside = 0, bool flipTexture = false,
181  float topAngle=0.0f, float bottomAngle=M_PI);
182 
194  static StelVertexArray computeSphereNoLight(float radius, float oneMinusOblateness, int slices, int stacks,
195  int orientInside = 0, bool flipTexture = false,
196  float topAngle=0.0f, float bottomAngle=M_PI);
197 
199  void sCylinder(float radius, float height, int slices, int orientInside = 0);
200 
209  static void computeFanDisk(float radius, int innerFanSlices, int level, QVector<double>& vertexArr, QVector<float>& texCoordArr);
210 
212  void sSphereMap(float radius, int slices, int stacks, float textureFov = 2.f*M_PI, int orientInside = 0);
213 
215  void setFont(const QFont& font);
216 
218  void setColor(float r, float g, float b, float a=1.f);
219 
221  Vec4f getColor() const;
222 
224  QFontMetrics getFontMetrics() const;
225 
228  static void initGLShaders();
229 
232  static void deinitGLShaders();
233 
235  void enableTexture2d(bool b);
236 
237  // Thoses methods should eventually be replaced by a single setVertexArray
239  void setVertexPointer(int size, int type, const void* pointer) {
240  vertexArray.size = size; vertexArray.type = type; vertexArray.pointer = pointer;
241  }
242 
244  void setTexCoordPointer(int size, int type, const void* pointer)
245  {
246  texCoordArray.size = size; texCoordArray.type = type; texCoordArray.pointer = pointer;
247  }
248 
250  void setColorPointer(int size, int type, const void* pointer)
251  {
252  colorArray.size = size; colorArray.type = type; colorArray.pointer = pointer;
253  }
254 
256  void setNormalPointer(int type, const void* pointer)
257  {
258  normalArray.size = 3; normalArray.type = type; normalArray.pointer = pointer;
259  }
260 
262  void enableClientStates(bool vertex, bool texture=false, bool color=false, bool normal=false);
263 
266  void setArrays(const Vec3d* vertices, const Vec2f* texCoords=NULL, const Vec3f* colorArray=NULL, const Vec3f* normalArray=NULL);
267  void setArrays(const Vec3f* vertices, const Vec2f* texCoords=NULL, const Vec3f* colorArray=NULL, const Vec3f* normalArray=NULL);
268 
274  void drawFromArray(DrawingMode mode, int count, int offset=0, bool doProj=true, const unsigned short *indices=NULL);
275 
278  void drawStelVertexArray(const StelVertexArray& arr, bool checkDiscontinuity=true);
279 
282  static bool linkProg(class QOpenGLShaderProgram* prog, const QString& name);
283 
284 private:
285 
286  friend class StelTextureMgr;
287  friend class StelTexture;
288 
291  class GLState
292  {
293  public:
294  GLState();
295  ~GLState();
296  private:
297  bool blend;
298  int blendSrcRGB, blendDstRGB, blendSrcAlpha, blendDstAlpha;
299  };
300 
302  typedef struct ArrayDesc
303  {
304  ArrayDesc() : size(0), type(0), pointer(NULL), enabled(false) {}
305  int size; // The number of coordinates per vertex.
306  int type; // The data type of each coordinate (GL_SHORT, GL_INT, GL_FLOAT, or GL_DOUBLE).
307  const void* pointer; // Pointer to the first coordinate of the first vertex in the array.
308  bool enabled; // Define whether the array is enabled or not.
309  } ArrayDesc;
310 
313  ArrayDesc projectArray(const ArrayDesc& array, int offset, int count, const unsigned short *indices=NULL);
314 
322  void projectSphericalTriangle(const SphericalCap* clippingCap, const Vec3d* vertices, QVarLengthArray<Vec3f, 4096>* outVertices,
323  const Vec2f* texturePos=NULL, QVarLengthArray<Vec2f, 4096>* outTexturePos=NULL,
324  const Vec3f* colors=NULL, QVarLengthArray<Vec3f, 4096>* outColors=NULL,
325  double maxSqDistortion=5., int nbI=0,
326  bool checkDisc1=true, bool checkDisc2=true, bool checkDisc3=true) const;
327 
328  void drawTextGravity180(float x, float y, const QString& str, float xshift = 0, float yshift = 0);
329 
330  // Used by the method below
331  static QVector<Vec2f> smallCircleVertexArray;
332  void drawSmallCircleVertexArray();
333 
335  StelProjectorP prj;
336 
337 #ifndef NDEBUG
338  static class QMutex* globalMutex;
340 #endif
341 
343  QFont currentFont;
344 
345  Vec4f currentColor;
346  bool texture2dEnabled;
347 
348  static QOpenGLShaderProgram* basicShaderProgram;
349  struct BasicShaderVars {
350  int projectionMatrix;
351  int color;
352  int vertex;
353  };
354  static BasicShaderVars basicShaderVars;
355 
356  static QOpenGLShaderProgram* colorShaderProgram;
357  static BasicShaderVars colorShaderVars;
358 
359  static QOpenGLShaderProgram* texturesShaderProgram;
360  struct TexturesShaderVars {
361  int projectionMatrix;
362  int texCoord;
363  int vertex;
364  int texColor;
365  int texture;
366  };
367  static TexturesShaderVars texturesShaderVars;
368  static QOpenGLShaderProgram* texturesColorShaderProgram;
369  struct TexturesColorShaderVars {
370  int projectionMatrix;
371  int texCoord;
372  int vertex;
373  int color;
374  int texture;
375  };
376  static TexturesColorShaderVars texturesColorShaderVars;
377 
378 
380  ArrayDesc vertexArray;
382  ArrayDesc texCoordArray;
384  ArrayDesc normalArray;
386  ArrayDesc colorArray;
387 };
388 
389 #endif // _STELPAINTER_HPP_
390 
void drawCircle(float x, float y, float r)
Draw a simple circle, 2d viewport coordinates in pixel.
void setArrays(const Vec3d *vertices, const Vec2f *texCoords=NULL, const Vec3f *colorArray=NULL, const Vec3f *normalArray=NULL)
convenience method that enable and set all the given arrays.
void setTexCoordPointer(int size, int type, const void *pointer)
use instead of glTexCoordPointer
void sCylinder(float radius, float height, int slices, int orientInside=0)
Re-implementation of gluCylinder : glu is overridden for non-standard projection. ...
static void deinitGLShaders()
Delete the OpenGL shaders objects.
Vec4f getColor() const
Get the color currently used for drawing.
Draw the interior of the polygon filled with the current texture multiplied by vertex colors...
Definition: StelPainter.hpp:51
void drawSprite2dMode(float x, float y, float radius)
Draw a square using the current texture at the given projected 2d position.
A SphericalCap is defined by a direction and an aperture.
void drawSmallCircleArc(const Vec3d &start, const Vec3d &stop, const Vec3d &rotCenter, void(*viewportEdgeIntersectCallback)(const Vec3d &screenPos, const Vec3d &direction, void *userData)=NULL, void *userData=NULL)
Draw a small circle arc between points start and stop with rotation point in rotCenter.
void enableClientStates(bool vertex, bool texture=false, bool color=false, bool normal=false)
use instead of glEnableClient
void setColor(float r, float g, float b, float a=1.f)
Set the color to use for subsequent drawing.
Draw the interior of the polygon filled with the current texture.
Definition: StelPainter.hpp:50
GL_TRIANGLE_FAN.
Definition: StelPainter.hpp:63
void setColorPointer(int size, int type, const void *pointer)
use instead of glColorPointer
static void initGLShaders()
Create the OpenGL shaders programs used by the StelPainter.
void drawSphericalRegion(const SphericalRegion *region, SphericalPolygonDrawMode drawMode=SphericalPolygonDrawModeFill, const SphericalCap *clippingCap=NULL, bool doSubDivise=true, double maxSqDistortion=5.)
Draw the given SphericalRegion.
const StelProjectorP & getProjector() const
Return the instance of projector associated to this painter.
Definition: StelPainter.hpp:70
void drawPoint2d(float x, float y)
Draw a GL_POINT at the given position.
A templatized 2d vector compatible with openGL.
Definition: VecMath.hpp:32
void drawLine2d(float x1, float y1, float x2, float y2)
Draw a line between the 2 points.
QSharedPointer< StelProjector > StelProjectorP
Shared pointer on a StelProjector instance (implement reference counting)
static StelVertexArray computeSphereNoLight(float radius, float oneMinusOblateness, int slices, int stacks, int orientInside=0, bool flipTexture=false, float topAngle=0.0f, float bottomAngle=M_PI)
Generate a StelVertexArray for a sphere.
static void computeFanDisk(float radius, int innerFanSlices, int level, QVector< double > &vertexArr, QVector< float > &texCoordArr)
Draw a disk with a special texturing mode having texture center at center of disk.
Draw the interior of the polygon.
Definition: StelPainter.hpp:48
Provides functions for performing openGL drawing operations.
Definition: StelPainter.hpp:40
void enableTexture2d(bool b)
Set whether texturing is enabled.
void drawText(float x, float y, const QString &str, float angleDeg=0.f, float xshift=0.f, float yshift=0.f, bool noGravity=true)
Draw the string at the given position and angle with the given font.
A templatized 4d vector compatible with openGL.
Definition: VecMath.hpp:34
void drawStelVertexArray(const StelVertexArray &arr, bool checkDiscontinuity=true)
Draws the primitives defined in the StelVertexArray.
void drawFromArray(DrawingMode mode, int count, int offset=0, bool doProj=true, const unsigned short *indices=NULL)
Draws primitives using vertices from the arrays specified by setVertexArray().
SphericalPolygonDrawMode
Define the drawing mode when drawing polygons.
Definition: StelPainter.hpp:46
void setNormalPointer(int type, const void *pointer)
use instead of glNormalPointer
GL_LINE_LOOP.
Definition: StelPainter.hpp:59
GL_TRIANGLE_STRIP.
Definition: StelPainter.hpp:62
void setVertexPointer(int size, int type, const void *pointer)
use instead of glVertexPointer
Abstract class defining a region of the sphere.
Base texture class.
Definition: StelTexture.hpp:41
void drawViewportShape(void)
Fill with black around the viewport.
Manage textures loading.
void setFont(const QFont &font)
Set the font to use for subsequent text drawing.
void drawSprite2dModeNoDeviceScale(float x, float y, float radius)
Same as drawSprite2dMode but don't scale according to display device scaling.
A templatized 3d vector compatible with openGL.
Definition: VecMath.hpp:33
Define the StelProjectorP type.
void drawRect2d(float x, float y, float width, float height, bool textured=true)
Draw a rectangle using the current texture at the given projected 2d position.
Draw the boundary of the polygon.
Definition: StelPainter.hpp:49
QFontMetrics getFontMetrics() const
Get the font metrics for the current font.
static bool linkProg(class QOpenGLShaderProgram *prog, const QString &name)
Link an opengl program and show a message in case of error or warnings.
Define all SphericalGeometry primitives as well as the SphericalRegionP type.
void sSphereMap(float radius, int slices, int stacks, float textureFov=2.f *M_PI, int orientInside=0)
Draw a fisheye texture in a sphere.
void drawGreatCircleArc(const Vec3d &start, const Vec3d &stop, const SphericalCap *clippingCap=NULL, void(*viewportEdgeIntersectCallback)(const Vec3d &screenPos, const Vec3d &direction, void *userData)=NULL, void *userData=NULL)
Draw a great circle arc between points start and stop.
DrawingMode
Define the drawing mode when drawing vertex.
Definition: StelPainter.hpp:55
GL_LINE_STRIP.
Definition: StelPainter.hpp:60