KiCad PCB EDA Suite
opengl_gal.h
Go to the documentation of this file.
1 /*
2  * This program source code file is part of KICAD, a free EDA CAD application.
3  *
4  * Copyright (C) 2012 Torsten Hueter, torstenhtr <at> gmx.de
5  * Copyright (C) 2012 Kicad Developers, see change_log.txt for contributors.
6  * Copyright (C) 2013-2017 CERN
7  * @author Maciej Suminski <maciej.suminski@cern.ch>
8  *
9  * Graphics Abstraction Layer (GAL) for OpenGL
10  *
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License
13  * as published by the Free Software Foundation; either version 2
14  * of the License, or (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, you may find one here:
23  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
24  * or you may search the http://www.gnu.org website for the version 2 license,
25  * or you may write to the Free Software Foundation, Inc.,
26  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
27  */
28 
29 #ifndef OPENGLGAL_H_
30 #define OPENGLGAL_H_
31 
32 // GAL imports
35 #include <gal/opengl/shader.h>
37 #include <gal/opengl/vertex_item.h>
41 #include <gal/hidpi_gl_canvas.h>
42 
43 #include <unordered_map>
44 #include <boost/smart_ptr/shared_array.hpp>
45 #include <memory>
46 
47 #ifndef CALLBACK
48 #define CALLBACK
49 #endif
50 
51 struct bitmap_glyph;
52 
53 namespace KIGFX
54 {
55 class SHADER;
56 
64 class OPENGL_GAL : public GAL, public HIDPI_GL_CANVAS
65 {
66 public:
82  OPENGL_GAL( GAL_DISPLAY_OPTIONS& aDisplayOptions, wxWindow* aParent,
83  wxEvtHandler* aMouseListener = nullptr, wxEvtHandler* aPaintListener = nullptr,
84  const wxString& aName = wxT( "GLCanvas" ) );
85 
86  virtual ~OPENGL_GAL();
87 
89  virtual bool IsInitialized() const override
90  {
91  // is*Initialized flags, but it is enough for OpenGL to show up
92  return IsShownOnScreen();
93  }
94 
96  bool IsVisible() const override
97  {
98  return IsShownOnScreen();
99  }
100 
101  // ---------------
102  // Drawing methods
103  // ---------------
104 
106  virtual void BeginDrawing() override;
107 
109  virtual void EndDrawing() override;
110 
112  virtual void BeginUpdate() override;
113 
115  virtual void EndUpdate() override;
116 
118  virtual void DrawLine( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint ) override;
119 
121  virtual void DrawSegment( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint,
122  double aWidth ) override;
123 
125  virtual void DrawCircle( const VECTOR2D& aCenterPoint, double aRadius ) override;
126 
128  virtual void DrawArc( const VECTOR2D& aCenterPoint, double aRadius,
129  double aStartAngle, double aEndAngle ) override;
130 
132  virtual void DrawArcSegment( const VECTOR2D& aCenterPoint, double aRadius,
133  double aStartAngle, double aEndAngle, double aWidth ) override;
134 
136  virtual void DrawRectangle( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint ) override;
137 
139  virtual void DrawPolyline( const std::deque<VECTOR2D>& aPointList ) override;
140  virtual void DrawPolyline( const VECTOR2D aPointList[], int aListSize ) override;
141  virtual void DrawPolyline( const SHAPE_LINE_CHAIN& aLineChain ) override;
142 
144  virtual void DrawPolygon( const std::deque<VECTOR2D>& aPointList ) override;
145  virtual void DrawPolygon( const VECTOR2D aPointList[], int aListSize ) override;
146  virtual void DrawPolygon( const SHAPE_POLY_SET& aPolySet ) override;
147 
149  virtual void DrawCurve( const VECTOR2D& startPoint, const VECTOR2D& controlPointA,
150  const VECTOR2D& controlPointB, const VECTOR2D& endPoint ) override;
151 
153  virtual void BitmapText( const wxString& aText, const VECTOR2D& aPosition,
154  double aRotationAngle ) override;
155 
157  virtual void DrawGrid() override;
158 
159  // --------------
160  // Screen methods
161  // --------------
162 
164  virtual void ResizeScreen( int aWidth, int aHeight ) override;
165 
167  virtual bool Show( bool aShow ) override;
168 
170  virtual void Flush() override;
171 
173  virtual void ClearScreen( ) override;
174 
175  // --------------
176  // Transformation
177  // --------------
178 
180  virtual void Transform( const MATRIX3x3D& aTransformation ) override;
181 
183  virtual void Rotate( double aAngle ) override;
184 
186  virtual void Translate( const VECTOR2D& aTranslation ) override;
187 
189  virtual void Scale( const VECTOR2D& aScale ) override;
190 
192  virtual void Save() override;
193 
195  virtual void Restore() override;
196 
197  // --------------------------------------------
198  // Group methods
199  // ---------------------------------------------
200 
202  virtual int BeginGroup() override;
203 
205  virtual void EndGroup() override;
206 
208  virtual void DrawGroup( int aGroupNumber ) override;
209 
211  virtual void ChangeGroupColor( int aGroupNumber, const COLOR4D& aNewColor ) override;
212 
214  virtual void ChangeGroupDepth( int aGroupNumber, int aDepth ) override;
215 
217  virtual void DeleteGroup( int aGroupNumber ) override;
218 
220  virtual void ClearCache() override;
221 
222  // --------------------------------------------------------
223  // Handling the world <-> screen transformation
224  // --------------------------------------------------------
225 
227  virtual void SaveScreen() override;
228 
230  virtual void RestoreScreen() override;
231 
233  virtual void SetTarget( RENDER_TARGET aTarget ) override;
234 
236  virtual RENDER_TARGET GetTarget() const override;
237 
239  virtual void ClearTarget( RENDER_TARGET aTarget ) override;
240 
242  virtual void SetNegativeDrawMode( bool aSetting ) override {}
243 
244  // -------
245  // Cursor
246  // -------
247 
249  virtual void DrawCursor( const VECTOR2D& aCursorPosition ) override;
250 
256  void PostPaint()
257  {
258  if( paintListener )
259  {
260  wxPaintEvent redrawEvent;
261  wxPostEvent( paintListener, redrawEvent );
262  }
263  }
264 
265  void SetMouseListener( wxEvtHandler* aMouseListener )
266  {
267  mouseListener = aMouseListener;
268  }
269 
270  void SetPaintListener( wxEvtHandler* aPaintListener )
271  {
272  paintListener = aPaintListener;
273  }
274 
276  typedef struct
277  {
280 
282  std::deque< boost::shared_array<GLdouble> >& intersectPoints;
283  } TessParams;
284 
285 private:
287  typedef GAL super;
288 
289  static const int CIRCLE_POINTS = 64;
290  static const int CURVE_POINTS = 32;
291 
292  static wxGLContext* glMainContext;
293  wxGLContext* glPrivContext;
294  static int instanceCounter;
295  wxEvtHandler* mouseListener;
296  wxEvtHandler* paintListener;
297 
298  static GLuint fontTexture;
299 
300  // Vertex buffer objects related fields
301  typedef std::unordered_map< unsigned int, std::shared_ptr<VERTEX_ITEM> > GROUPS_MAP;
302  GROUPS_MAP groups;
303  unsigned int groupCounter;
308 
309  // Framebuffer & compositing
311  unsigned int mainBuffer;
312  unsigned int overlayBuffer;
314 
315  // Shader
316  static SHADER* shader;
317 
318  // Internal flags
320  static bool isBitmapFontLoaded;
323  bool isGrouping;
325 
327  bool updatedGalDisplayOptions( const GAL_DISPLAY_OPTIONS& aOptions ) override;
328 
329  // Polygon tesselation
331  GLUtesselator* tesselator;
333  std::deque< boost::shared_array<GLdouble> > tessIntersects;
334 
341  void drawLineQuad( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint );
342 
352  void drawSemiCircle( const VECTOR2D& aCenterPoint, double aRadius, double aAngle );
353 
362  void drawFilledSemiCircle( const VECTOR2D& aCenterPoint, double aRadius, double aAngle );
363 
372  void drawStrokedSemiCircle( const VECTOR2D& aCenterPoint, double aRadius, double aAngle );
373 
379  void drawPolyline( const std::function<VECTOR2D (int)>& aPointGetter, int aPointCount );
380 
387  void drawPolygon( GLdouble* aPoints, int aPointCount );
388 
392  void drawTriangulatedPolyset( const SHAPE_POLY_SET& aPoly );
393 
394 
402  int drawBitmapChar( unsigned long aChar );
403 
413  void drawBitmapOverbar( double aLength, double aHeight );
414 
422  std::pair<VECTOR2D, float> computeBitmapTextSize( const UTF8& aText ) const;
423 
424  // Event handling
430  void onPaint( wxPaintEvent& aEvent );
431 
437  void skipMouseEvent( wxMouseEvent& aEvent );
438 
442  void blitCursor();
443 
449  unsigned int getNewGroupNumber();
450 
454  double calcAngleStep( double aRadius ) const
455  {
456  // Bigger arcs need smaller alpha increment to make them look smooth
457  return std::min( 1e6 / aRadius, 2.0 * M_PI / CIRCLE_POINTS );
458  }
459 
463  void init();
464 };
465 } // namespace KIGFX
466 
467 #endif // OPENGLGAL_H_
Class UTF8 is an 8 bit string that is assuredly encoded in UTF8, and supplies special conversion supp...
Definition: utf8.h:73
VERTEX_MANAGER * currentManager
Currently used VERTEX_MANAGER (for storing VERTEX_ITEMs)
Definition: opengl_gal.h:304
static SHADER * shader
There is only one shader used for different objects.
Definition: opengl_gal.h:316
virtual void BeginUpdate() override
Enables item update mode.
Definition: opengl_gal.cpp:378
static wxGLContext * glMainContext
Parent OpenGL context.
Definition: opengl_gal.h:292
double calcAngleStep(double aRadius) const
Compute the angle step when drawing arcs/circles approximated with lines.
Definition: opengl_gal.h:454
virtual void EndUpdate() override
Disables item update mode.
Definition: opengl_gal.cpp:391
Class CAIRO_GAL is the cairo implementation of the graphics abstraction layer.
Definition: class_module.h:58
unsigned int overlayBuffer
Auxiliary rendering target (for menus etc.)
Definition: opengl_gal.h:312
std::deque< boost::shared_array< GLdouble > > & intersectPoints
Intersect points, that have to be freed after tessellation.
Definition: opengl_gal.h:282
virtual void Scale(const VECTOR2D &aScale) override
Scale the context.
virtual void ClearTarget(RENDER_TARGET aTarget) override
Clears the target for rendering.
virtual void Translate(const VECTOR2D &aTranslation) override
Translate the context.
RENDER_TARGET currentTarget
Current rendering target.
Definition: opengl_gal.h:313
bool isBitmapFontInitialized
Is the shader set to use bitmap fonts?
Definition: opengl_gal.h:321
void drawPolygon(GLdouble *aPoints, int aPointCount)
Draws a filled polygon.
static GLuint fontTexture
Bitmap font texture handle (shared)
Definition: opengl_gal.h:298
void drawLineQuad(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint)
Draw a quad for the line.
VERTEX_MANAGER * overlayManager
Container for storing overlaid VERTEX_ITEMs.
Definition: opengl_gal.h:307
virtual void EndDrawing() override
End the drawing, needs to be called for every new frame.
Definition: opengl_gal.cpp:344
Class OpenGL_GAL is the OpenGL implementation of the Graphics Abstraction Layer.
Definition: opengl_gal.h:64
virtual void Restore() override
Restore the context.
virtual void ChangeGroupDepth(int aGroupNumber, int aDepth) override
Changes the depth (Z-axis position) of the group.
wxGLCanvas wrapper for HiDPI/Retina support.
virtual int BeginGroup() override
Begin a group.
virtual void DrawPolygon(const std::deque< VECTOR2D > &aPointList) override
Draw a polygon.
Definition: opengl_gal.cpp:751
Class to control vertex container and GPU with possibility of emulating old-style OpenGL 1...
void SetPaintListener(wxEvtHandler *aPaintListener)
Parameters passed to the GLU tesselator.
Definition: opengl_gal.h:270
CIRCLE_POINTS
Class that handles multitarget rendering (ie.
bool isGrouping
Was a group started?
Definition: opengl_gal.h:324
std::unordered_map< unsigned int, std::shared_ptr< VERTEX_ITEM > > GROUPS_MAP
Definition: opengl_gal.h:301
OPENGL_GAL(GAL_DISPLAY_OPTIONS &aDisplayOptions, wxWindow *aParent, wxEvtHandler *aMouseListener=nullptr, wxEvtHandler *aPaintListener=nullptr, const wxString &aName=wxT("GLCanvas"))
Constructor OPENGL_GAL.
Definition: opengl_gal.cpp:67
virtual void ResizeScreen(int aWidth, int aHeight) override
Resizes the canvas.
virtual void Transform(const MATRIX3x3D &aTransformation) override
Transform the context.
VERTEX_MANAGER * nonCachedManager
Container for storing non-cached VERTEX_ITEMs.
Definition: opengl_gal.h:306
static int instanceCounter
GL GAL instance counter.
Definition: opengl_gal.h:294
VERTEX_MANAGER * vboManager
Manager used for storing new vertices.
Definition: opengl_gal.h:279
virtual void DrawArcSegment(const VECTOR2D &aCenterPoint, double aRadius, double aStartAngle, double aEndAngle, double aWidth) override
Draw an arc segment.
Definition: opengl_gal.cpp:594
virtual RENDER_TARGET GetTarget() const override
Gets the currently used target for rendering.
static const int CURVE_POINTS
The number of points for curve approximation.
Definition: opengl_gal.h:290
virtual void Save() override
Save the context.
void init()
Basic OpenGL initialization.
OPENGL_COMPOSITOR * compositor
Handles multiple rendering targets.
Definition: opengl_gal.h:310
GROUPS_MAP groups
Stores informations about VBO objects (groups)
Definition: opengl_gal.h:302
std::pair< VECTOR2D, float > computeBitmapTextSize(const UTF8 &aText) const
Computes a size of text drawn using bitmap font with current text setting applied.
virtual void BeginDrawing() override
Begin the drawing, needs to be called for every new frame.
Definition: opengl_gal.cpp:207
virtual void RestoreScreen() override
Restore the screen contents.
unsigned int mainBuffer
Main rendering target.
Definition: opengl_gal.h:311
virtual bool Show(bool aShow) override
Shows/hides the GAL canvas.
void SetMouseListener(wxEvtHandler *aMouseListener)
Definition: opengl_gal.h:265
Class SHAPE_POLY_SET.
virtual void EndGroup() override
End the group.
virtual void DeleteGroup(int aGroupNumber) override
Delete the group from the memory.
wxEvtHandler * mouseListener
Definition: opengl_gal.h:295
bool updatedGalDisplayOptions(const GAL_DISPLAY_OPTIONS &aOptions) override
Function updatedGalDisplayOptions.
Definition: opengl_gal.cpp:186
virtual void DrawGrid() override
>
Definition: opengl_gal.cpp:988
virtual void DrawLine(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint) override
Draw a line.
Definition: opengl_gal.cpp:401
void onPaint(wxPaintEvent &aEvent)
This is the OnPaint event handler.
virtual void DrawGroup(int aGroupNumber) override
Draw the stored group.
bool isFramebufferInitialized
Are the framebuffers initialized?
Definition: opengl_gal.h:319
virtual bool IsInitialized() const override
Returns the initalization status for the canvas.
Definition: opengl_gal.h:89
virtual void ClearCache() override
Delete all data created during caching of graphic items.
void drawTriangulatedPolyset(const SHAPE_POLY_SET &aPoly)
Draws a set of polygons with a cached triangulation.
Definition: opengl_gal.cpp:784
Class SHADER provides the access to the OpenGL shaders.
Definition: shader.h:74
GAL super
Super class definition.
Definition: opengl_gal.h:287
GLUtesselator * tesselator
The tessellator.
Definition: opengl_gal.h:331
virtual void Rotate(double aAngle) override
Rotate the context.
void drawStrokedSemiCircle(const VECTOR2D &aCenterPoint, double aRadius, double aAngle)
Draw a stroked semicircle.
void blitCursor()
Blits cursor into the current screen.
VERTEX_MANAGER * cachedManager
Container for storing cached VERTEX_ITEMs.
Definition: opengl_gal.h:305
virtual void DrawPolyline(const std::deque< VECTOR2D > &aPointList) override
Draw a polyline.
Definition: opengl_gal.cpp:728
virtual void DrawSegment(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint, double aWidth) override
Draw a rounded segment.
Definition: opengl_gal.cpp:419
wxEvtHandler * paintListener
Definition: opengl_gal.h:296
std::deque< boost::shared_array< GLdouble > > tessIntersects
Storage for intersecting points.
Definition: opengl_gal.h:333
virtual void DrawArc(const VECTOR2D &aCenterPoint, double aRadius, double aStartAngle, double aEndAngle) override
Draw an arc.
Definition: opengl_gal.cpp:528
virtual void SaveScreen() override
Save the screen contents.
virtual void SetTarget(RENDER_TARGET aTarget) override
Sets the target for rendering.
Class to store instances of VERTEX without caching.
bool isInitialized
Basic initialization flag, has to be done when the window is visible.
Definition: opengl_gal.h:322
void PostPaint()
Function PostPaint posts an event to m_paint_listener.
Definition: opengl_gal.h:256
void drawSemiCircle(const VECTOR2D &aCenterPoint, double aRadius, double aAngle)
Draw a semicircle.
Class SHAPE_LINE_CHAIN.
Class to handle an item held in a container.
unsigned int groupCounter
Counter used for generating keys for groups.
Definition: opengl_gal.h:303
int drawBitmapChar(unsigned long aChar)
Draws a single character using bitmap font.
virtual void ClearScreen() override
Clear the screen.
unsigned int getNewGroupNumber()
Returns a valid key that can be used as a new group number.
wxGLContext * glPrivContext
Canvas-specific OpenGL context.
Definition: opengl_gal.h:293
virtual void DrawRectangle(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint) override
Draw a rectangle.
Definition: opengl_gal.cpp:690
virtual void Flush() override
Force all remaining objects to be drawn.
virtual void DrawCursor(const VECTOR2D &aCursorPosition) override
Draw the cursor.
void drawPolyline(const std::function< VECTOR2D(int)> &aPointGetter, int aPointCount)
Generic way of drawing a polyline stored in different containers.
RENDER_TARGET
RENDER_TARGET: Possible rendering targets.
Definition: definitions.h:39
virtual void BitmapText(const wxString &aText, const VECTOR2D &aPosition, double aRotationAngle) override
Draws a text using a bitmap font.
Definition: opengl_gal.cpp:886
virtual void SetNegativeDrawMode(bool aSetting) override
Sets negative draw mode in the renderer.
Definition: opengl_gal.h:242
virtual ~OPENGL_GAL()
Definition: opengl_gal.cpp:141
bool IsVisible() const override
>
Definition: opengl_gal.h:96
virtual void DrawCircle(const VECTOR2D &aCenterPoint, double aRadius) override
Draw a circle using world coordinates.
Definition: opengl_gal.cpp:468
static bool isBitmapFontLoaded
Is the bitmap font texture loaded?
Definition: opengl_gal.h:320
virtual void DrawCurve(const VECTOR2D &startPoint, const VECTOR2D &controlPointA, const VECTOR2D &controlPointB, const VECTOR2D &endPoint) override
Draw a cubic bezier spline.
Definition: opengl_gal.cpp:854
void skipMouseEvent(wxMouseEvent &aEvent)
Skip the mouse event to the parent.
void drawFilledSemiCircle(const VECTOR2D &aCenterPoint, double aRadius, double aAngle)
Draw a filled semicircle.
virtual void ChangeGroupColor(int aGroupNumber, const COLOR4D &aNewColor) override
Changes the color used to draw the group.
#define min(a, b)
Definition: auxiliary.h:85
Class GAL is the abstract interface for drawing on a 2D-surface.
Class COLOR4D is the color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:39
void drawBitmapOverbar(double aLength, double aHeight)
Draws an overbar over the currently drawn text.