Stellarium 0.13.2
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  {
51  };
52 
55  {
56  Points = 0x0000,
57  Lines = 0x0001,
58  LineLoop = 0x0002,
59  LineStrip = 0x0003,
60  Triangles = 0x0004,
61  TriangleStrip = 0x0005,
62  TriangleFan = 0x0006
63  };
64 
65  explicit StelPainter(const StelProjectorP& prj);
66  ~StelPainter();
67 
69  const StelProjectorP& getProjector() const {return prj;}
70  void setProjector(const StelProjectorP& p);
71 
73  void drawViewportShape();
74 
85  void drawText(float x, float y, const QString& str, float angleDeg=0.f,
86  float xshift=0.f, float yshift=0.f, const bool noGravity=true);
87  void drawText(const Vec3d& v, const QString& str, const float angleDeg=0.f,
88  const float xshift=0.f, const float yshift=0.f, const bool noGravity=true);
89 
96  void drawSphericalRegion(const SphericalRegion* region, SphericalPolygonDrawMode drawMode=SphericalPolygonDrawModeFill, const SphericalCap* clippingCap=NULL, bool doSubDivise=true, double maxSqDistortion=5.);
97 
98  void drawGreatCircleArcs(const StelVertexArray& va, const SphericalCap* clippingCap=NULL);
99 
100  void drawSphericalTriangles(const StelVertexArray& va, const bool textured, const SphericalCap* clippingCap=NULL, const bool doSubDivide=true, const double maxSqDistortion=5.);
101 
108  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);
109 
116  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);
117 
119  void drawCircle(const float x, const float y, float r);
120 
127  void drawSprite2dMode(const float x, const float y, float radius);
128  void drawSprite2dMode(const Vec3d& v, const float radius);
129 
131  void drawSprite2dModeNoDeviceScale(const float x, const float y, const float radius);
132 
139  void drawSprite2dMode(float x, float y, float radius, float rotation);
140 
144  void drawPoint2d(const float x, const float y);
145 
151  void drawLine2d(const float x1, const float y1, const float x2, const float y2);
152 
160  void drawRect2d(const float x, const float y, const float width, const float height, const bool textured=true);
161 
177  void sSphere(const float radius, const float oneMinusOblateness, const int slices, const int stacks, const int orientInside = 0, const bool flipTexture = false,
178  const float topAngle=0.0f, const float bottomAngle=M_PI);
179 
181  static StelVertexArray computeSphereNoLight(const float radius, const float oneMinusOblateness, const int slices, const int stacks,
182  const int orientInside = 0, const bool flipTexture = false);
183 
185  void sCylinder(const float radius, const float height, const int slices, const int orientInside = 0);
186 
195  static void computeFanDisk(float radius, int innerFanSlices, int level, QVector<double>& vertexArr, QVector<float>& texCoordArr);
196 
198  void sSphereMap(const float radius, const int slices, const int stacks, const float textureFov = 2.f*M_PI, const int orientInside = 0);
199 
201  void setFont(const QFont& font);
202 
204  void setColor(float r, float g, float b, float a=1.f);
205 
207  Vec4f getColor() const;
208 
210  QFontMetrics getFontMetrics() const;
211 
214  static void initGLShaders();
215 
218  static void deinitGLShaders();
219 
221  void enableTexture2d(const bool b);
222 
223  // Thoses methods should eventually be replaced by a single setVertexArray
225  void setVertexPointer(const int size, const int type, const void* pointer) {
226  vertexArray.size = size; vertexArray.type = type; vertexArray.pointer = pointer;
227  }
228 
230  void setTexCoordPointer(const int size, const int type, const void* pointer)
231  {
232  texCoordArray.size = size; texCoordArray.type = type; texCoordArray.pointer = pointer;
233  }
234 
236  void setColorPointer(const int size, const int type, const void* pointer)
237  {
238  colorArray.size = size; colorArray.type = type; colorArray.pointer = pointer;
239  }
240 
242  void setNormalPointer(const int type, const void* pointer)
243  {
244  normalArray.size = 3; normalArray.type = type; normalArray.pointer = pointer;
245  }
246 
248  void enableClientStates(const bool vertex, const bool texture=false, const bool color=false, const bool normal=false);
249 
252  void setArrays(const Vec3d* vertices, const Vec2f* texCoords=NULL, const Vec3f* colorArray=NULL, const Vec3f* normalArray=NULL);
253  void setArrays(const Vec3f* vertices, const Vec2f* texCoords=NULL, const Vec3f* colorArray=NULL, const Vec3f* normalArray=NULL);
254 
260  void drawFromArray(const DrawingMode mode, const int count, const int offset=0, const bool doProj=true, const unsigned short *indices=NULL);
261 
264  void drawStelVertexArray(const StelVertexArray& arr, const bool checkDiscontinuity=true);
265 
268  static bool linkProg(class QOpenGLShaderProgram* prog, const QString& name);
269 
270 private:
271 
272  friend class StelTextureMgr;
273  friend class StelTexture;
274 
277  class GLState
278  {
279  public:
280  GLState();
281  ~GLState();
282  private:
283  bool blend;
284  int blendSrcRGB, blendDstRGB, blendSrcAlpha, blendDstAlpha;
285  };
286 
288  typedef struct ArrayDesc
289  {
290  ArrayDesc() : size(0), type(0), pointer(NULL), enabled(false) {}
291  int size; // The number of coordinates per vertex.
292  int type; // The data type of each coordinate (GL_SHORT, GL_INT, GL_FLOAT, or GL_DOUBLE).
293  const void* pointer; // Pointer to the first coordinate of the first vertex in the array.
294  bool enabled; // Define whether the array is enabled or not.
295  } ArrayDesc;
296 
299  ArrayDesc projectArray(const ArrayDesc& array, int offset, int count, const unsigned short *indices=NULL);
300 
307  void projectSphericalTriangle(const SphericalCap* clippingCap, const Vec3d* vertices, QVarLengthArray<Vec3f, 4096>* outVertices,
308  const Vec2f* texturePos=NULL, QVarLengthArray<Vec2f, 4096>* outTexturePos=NULL, const double maxSqDistortion=5., const int nbI=0,
309  const bool checkDisc1=true, const bool checkDisc2=true, const bool checkDisc3=true) const;
310 
311  void drawTextGravity180(float x, float y, const QString& str, const float xshift = 0, const float yshift = 0);
312 
313  // Used by the method below
314  static QVector<Vec2f> smallCircleVertexArray;
315  void drawSmallCircleVertexArray();
316 
318  StelProjectorP prj;
319 
320 #ifndef NDEBUG
321  static class QMutex* globalMutex;
323 #endif
324 
326  QFont currentFont;
327 
328  Vec4f currentColor;
329  bool texture2dEnabled;
330 
331  static QOpenGLShaderProgram* basicShaderProgram;
332  struct BasicShaderVars {
333  int projectionMatrix;
334  int color;
335  int vertex;
336  };
337  static BasicShaderVars basicShaderVars;
338 
339  static QOpenGLShaderProgram* colorShaderProgram;
340  static BasicShaderVars colorShaderVars;
341 
342  static QOpenGLShaderProgram* texturesShaderProgram;
343  struct TexturesShaderVars {
344  int projectionMatrix;
345  int texCoord;
346  int vertex;
347  int texColor;
348  int texture;
349  };
350  static TexturesShaderVars texturesShaderVars;
351  static QOpenGLShaderProgram* texturesColorShaderProgram;
352  struct TexturesColorShaderVars {
353  int projectionMatrix;
354  int texCoord;
355  int vertex;
356  int color;
357  int texture;
358  };
359  static TexturesColorShaderVars texturesColorShaderVars;
360 
361 
363  ArrayDesc vertexArray;
365  ArrayDesc texCoordArray;
367  ArrayDesc normalArray;
369  ArrayDesc colorArray;
370 };
371 
372 #endif // _STELPAINTER_HPP_
373 
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 drawText(float x, float y, const QString &str, float angleDeg=0.f, float xshift=0.f, float yshift=0.f, const bool noGravity=true)
Draw the string at the given position and angle with the given font.
void drawLine2d(const float x1, const float y1, const float x2, const float y2)
Draw a line between the 2 points.
void setTexCoordPointer(const int size, const int type, const void *pointer)
use instead of glTexCoordPointer
void drawRect2d(const float x, const float y, const float width, const float height, const bool textured=true)
Draw a rectangle using the current texture at the given projected 2d position.
void drawSprite2dMode(const float x, const float y, float radius)
Draw a square using the current texture at the given projected 2d position.
static void deinitGLShaders()
Delete the OpenGL shaders objects.
void setVertexPointer(const int size, const int type, const void *pointer)
use instead of glVertexPointer
Vec4f getColor() const
Get the color currently used for drawing.
static StelVertexArray computeSphereNoLight(const float radius, const float oneMinusOblateness, const int slices, const int stacks, const int orientInside=0, const bool flipTexture=false)
Generate a StelVertexArray for a sphere.
void sCylinder(const float radius, const float height, const int slices, const int orientInside=0)
Re-implementation of gluCylinder : glu is overridden for non-standard projection. ...
A SphericalCap is defined by a direction and an aperture.
void drawFromArray(const DrawingMode mode, const int count, const int offset=0, const bool doProj=true, const unsigned short *indices=NULL)
Draws primitives using vertices from the arrays specified by setVertexArray().
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 drawCircle(const float x, const float y, float r)
Draw a simple circle, 2d viewport coordinates in pixel.
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:62
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:69
void setColorPointer(const int size, const int type, const void *pointer)
use instead of glColorPointer
QSharedPointer< StelProjector > StelProjectorP
Shared pointer on a StelProjector instance (implement reference counting)
void setNormalPointer(const int type, const void *pointer)
use instead of glNormalPointer
void sSphereMap(const float radius, const int slices, const int stacks, const float textureFov=2.f *M_PI, const int orientInside=0)
Draw a fisheye texture in 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
void drawPoint2d(const float x, const float y)
Draw a GL_POINT at the given position.
Provides functions for performing openGL drawing operations.
Definition: StelPainter.hpp:40
void enableTexture2d(const bool b)
Set whether texturing is enabled.
SphericalPolygonDrawMode
Define the drawing mode when drawing polygons.
Definition: StelPainter.hpp:46
GL_LINE_LOOP.
Definition: StelPainter.hpp:58
GL_TRIANGLE_STRIP.
Definition: StelPainter.hpp:61
Abstract class defining a region of the sphere.
Base texture class.
Definition: StelTexture.hpp:41
Manage textures loading.
void setFont(const QFont &font)
Set the font to use for subsequent text drawing.
void enableClientStates(const bool vertex, const bool texture=false, const bool color=false, const bool normal=false)
use instead of glEnableClient
Define the StelProjectorP type.
Draw the boundary of the polygon.
Definition: StelPainter.hpp:49
void drawSprite2dModeNoDeviceScale(const float x, const float y, const float radius)
Same as drawSprite2dMode but don't scale according to display device scaling.
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 drawStelVertexArray(const StelVertexArray &arr, const bool checkDiscontinuity=true)
Draws the primitives defined in the StelVertexArray.
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:54
GL_LINE_STRIP.
Definition: StelPainter.hpp:59
void drawViewportShape()
Fill with black around the viewport.