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  {
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();
75 
86  void drawText(float x, float y, const QString& str, float angleDeg=0.f,
87  float xshift=0.f, float yshift=0.f, bool noGravity=true);
88  void drawText(const Vec3d& v, const QString& str, float angleDeg=0.f,
89  float xshift=0.f, float yshift=0.f, bool noGravity=true);
90 
97  void drawSphericalRegion(const SphericalRegion* region, SphericalPolygonDrawMode drawMode=SphericalPolygonDrawModeFill, const SphericalCap* clippingCap=NULL, bool doSubDivise=true, double maxSqDistortion=5.);
98 
99  void drawGreatCircleArcs(const StelVertexArray& va, const SphericalCap* clippingCap=NULL);
100 
101  void drawSphericalTriangles(const StelVertexArray& va, bool textured, bool colored, const SphericalCap* clippingCap=NULL, bool doSubDivide=true, double maxSqDistortion=5.);
102 
109  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);
110 
117  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);
118 
120  void drawCircle(float x, float y, float r);
121 
128  void drawSprite2dMode(float x, float y, float radius);
129  void drawSprite2dMode(const Vec3d& v, float radius);
130 
132  void drawSprite2dModeNoDeviceScale(float x, float y, float radius);
133 
140  void drawSprite2dMode(float x, float y, float radius, float rotation);
141 
145  void drawPoint2d(float x, float y);
146 
152  void drawLine2d(float x1, float y1, float x2, float y2);
153 
161  void drawRect2d(float x, float y, float width, float height, bool textured=true);
162 
178  void sSphere(float radius, float oneMinusOblateness, int slices, int stacks, int orientInside = 0, bool flipTexture = false,
179  float topAngle=0.0f, float bottomAngle=M_PI);
180 
192  static StelVertexArray computeSphereNoLight(float radius, float oneMinusOblateness, int slices, int stacks,
193  int orientInside = 0, bool flipTexture = false,
194  float topAngle=0.0f, float bottomAngle=M_PI);
195 
197  void sCylinder(float radius, float height, int slices, int orientInside = 0);
198 
207  static void computeFanDisk(float radius, int innerFanSlices, int level, QVector<double>& vertexArr, QVector<float>& texCoordArr);
208 
210  void sSphereMap(float radius, int slices, int stacks, float textureFov = 2.f*M_PI, int orientInside = 0);
211 
213  void setFont(const QFont& font);
214 
216  void setColor(float r, float g, float b, float a=1.f);
217 
219  Vec4f getColor() const;
220 
222  QFontMetrics getFontMetrics() const;
223 
226  static void initGLShaders();
227 
230  static void deinitGLShaders();
231 
233  void enableTexture2d(bool b);
234 
235  // Thoses methods should eventually be replaced by a single setVertexArray
237  void setVertexPointer(int size, int type, const void* pointer) {
238  vertexArray.size = size; vertexArray.type = type; vertexArray.pointer = pointer;
239  }
240 
242  void setTexCoordPointer(int size, int type, const void* pointer)
243  {
244  texCoordArray.size = size; texCoordArray.type = type; texCoordArray.pointer = pointer;
245  }
246 
248  void setColorPointer(int size, int type, const void* pointer)
249  {
250  colorArray.size = size; colorArray.type = type; colorArray.pointer = pointer;
251  }
252 
254  void setNormalPointer(int type, const void* pointer)
255  {
256  normalArray.size = 3; normalArray.type = type; normalArray.pointer = pointer;
257  }
258 
260  void enableClientStates(bool vertex, bool texture=false, bool color=false, bool normal=false);
261 
264  void setArrays(const Vec3d* vertices, const Vec2f* texCoords=NULL, const Vec3f* colorArray=NULL, const Vec3f* normalArray=NULL);
265  void setArrays(const Vec3f* vertices, const Vec2f* texCoords=NULL, const Vec3f* colorArray=NULL, const Vec3f* normalArray=NULL);
266 
272  void drawFromArray(DrawingMode mode, int count, int offset=0, bool doProj=true, const unsigned short *indices=NULL);
273 
276  void drawStelVertexArray(const StelVertexArray& arr, bool checkDiscontinuity=true);
277 
280  static bool linkProg(class QOpenGLShaderProgram* prog, const QString& name);
281 
282 private:
283 
284  friend class StelTextureMgr;
285  friend class StelTexture;
286 
289  class GLState
290  {
291  public:
292  GLState();
293  ~GLState();
294  private:
295  bool blend;
296  int blendSrcRGB, blendDstRGB, blendSrcAlpha, blendDstAlpha;
297  };
298 
300  typedef struct ArrayDesc
301  {
302  ArrayDesc() : size(0), type(0), pointer(NULL), enabled(false) {}
303  int size; // The number of coordinates per vertex.
304  int type; // The data type of each coordinate (GL_SHORT, GL_INT, GL_FLOAT, or GL_DOUBLE).
305  const void* pointer; // Pointer to the first coordinate of the first vertex in the array.
306  bool enabled; // Define whether the array is enabled or not.
307  } ArrayDesc;
308 
311  ArrayDesc projectArray(const ArrayDesc& array, int offset, int count, const unsigned short *indices=NULL);
312 
320  void projectSphericalTriangle(const SphericalCap* clippingCap, const Vec3d* vertices, QVarLengthArray<Vec3f, 4096>* outVertices,
321  const Vec2f* texturePos=NULL, QVarLengthArray<Vec2f, 4096>* outTexturePos=NULL,
322  const Vec3f* colors=NULL, QVarLengthArray<Vec3f, 4096>* outColors=NULL,
323  double maxSqDistortion=5., int nbI=0,
324  bool checkDisc1=true, bool checkDisc2=true, bool checkDisc3=true) const;
325 
326  void drawTextGravity180(float x, float y, const QString& str, float xshift = 0, float yshift = 0);
327 
328  // Used by the method below
329  static QVector<Vec2f> smallCircleVertexArray;
330  void drawSmallCircleVertexArray();
331 
333  StelProjectorP prj;
334 
335 #ifndef NDEBUG
336  static class QMutex* globalMutex;
338 #endif
339 
341  QFont currentFont;
342 
343  Vec4f currentColor;
344  bool texture2dEnabled;
345 
346  static QOpenGLShaderProgram* basicShaderProgram;
347  struct BasicShaderVars {
348  int projectionMatrix;
349  int color;
350  int vertex;
351  };
352  static BasicShaderVars basicShaderVars;
353 
354  static QOpenGLShaderProgram* colorShaderProgram;
355  static BasicShaderVars colorShaderVars;
356 
357  static QOpenGLShaderProgram* texturesShaderProgram;
358  struct TexturesShaderVars {
359  int projectionMatrix;
360  int texCoord;
361  int vertex;
362  int texColor;
363  int texture;
364  };
365  static TexturesShaderVars texturesShaderVars;
366  static QOpenGLShaderProgram* texturesColorShaderProgram;
367  struct TexturesColorShaderVars {
368  int projectionMatrix;
369  int texCoord;
370  int vertex;
371  int color;
372  int texture;
373  };
374  static TexturesColorShaderVars texturesColorShaderVars;
375 
376 
378  ArrayDesc vertexArray;
380  ArrayDesc texCoordArray;
382  ArrayDesc normalArray;
384  ArrayDesc colorArray;
385 };
386 
387 #endif // _STELPAINTER_HPP_
388 
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.
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.
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
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.
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
void drawViewportShape()
Fill with black around the viewport.