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 class GL_BITMAP_CACHE;
57 
65 class OPENGL_GAL : public GAL, public HIDPI_GL_CANVAS
66 {
67 public:
83  OPENGL_GAL( GAL_DISPLAY_OPTIONS& aDisplayOptions, wxWindow* aParent,
84  wxEvtHandler* aMouseListener = nullptr, wxEvtHandler* aPaintListener = nullptr,
85  const wxString& aName = wxT( "GLCanvas" ) );
86 
87  virtual ~OPENGL_GAL();
88 
89  virtual bool IsOpenGlEngine() override { return true; }
90 
92  virtual bool IsInitialized() const override
93  {
94  // is*Initialized flags, but it is enough for OpenGL to show up
95  return IsShownOnScreen() && !GetClientRect().IsEmpty();
96  }
97 
99  bool IsVisible() const override
100  {
101  return IsShownOnScreen() && !GetClientRect().IsEmpty();
102  }
103 
104  // ---------------
105  // Drawing methods
106  // ---------------
107 
109  virtual void DrawLine( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint ) override;
110 
112  virtual void DrawSegment( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint,
113  double aWidth ) override;
114 
116  virtual void DrawCircle( const VECTOR2D& aCenterPoint, double aRadius ) override;
117 
119  virtual void DrawArc( const VECTOR2D& aCenterPoint, double aRadius,
120  double aStartAngle, double aEndAngle ) override;
121 
123  virtual void DrawArcSegment( const VECTOR2D& aCenterPoint, double aRadius,
124  double aStartAngle, double aEndAngle, double aWidth ) override;
125 
127  virtual void DrawRectangle( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint ) override;
128 
130  virtual void DrawPolyline( const std::deque<VECTOR2D>& aPointList ) override;
131  virtual void DrawPolyline( const VECTOR2D aPointList[], int aListSize ) override;
132  virtual void DrawPolyline( const SHAPE_LINE_CHAIN& aLineChain ) override;
133 
135  virtual void DrawPolygon( const std::deque<VECTOR2D>& aPointList ) override;
136  virtual void DrawPolygon( const VECTOR2D aPointList[], int aListSize ) override;
137  virtual void DrawPolygon( const SHAPE_POLY_SET& aPolySet ) override;
138  virtual void DrawPolygon( const SHAPE_LINE_CHAIN& aPolySet ) override;
139 
141  virtual void DrawCurve( const VECTOR2D& startPoint, const VECTOR2D& controlPointA,
142  const VECTOR2D& controlPointB, const VECTOR2D& endPoint ) override;
143 
145  virtual void DrawBitmap( const BITMAP_BASE& aBitmap ) override;
146 
148  virtual void BitmapText( const wxString& aText, const VECTOR2D& aPosition,
149  double aRotationAngle ) override;
150 
152  virtual void DrawGrid() override;
153 
154  // --------------
155  // Screen methods
156  // --------------
157 
159  virtual void ResizeScreen( int aWidth, int aHeight ) override;
160 
162  virtual bool Show( bool aShow ) override;
163 
165  virtual void Flush() override;
166 
168  virtual void ClearScreen( ) override;
169 
170  // --------------
171  // Transformation
172  // --------------
173 
175  virtual void Transform( const MATRIX3x3D& aTransformation ) override;
176 
178  virtual void Rotate( double aAngle ) override;
179 
181  virtual void Translate( const VECTOR2D& aTranslation ) override;
182 
184  virtual void Scale( const VECTOR2D& aScale ) override;
185 
187  virtual void Save() override;
188 
190  virtual void Restore() override;
191 
192  // --------------------------------------------
193  // Group methods
194  // ---------------------------------------------
195 
197  virtual int BeginGroup() override;
198 
200  virtual void EndGroup() override;
201 
203  virtual void DrawGroup( int aGroupNumber ) override;
204 
206  virtual void ChangeGroupColor( int aGroupNumber, const COLOR4D& aNewColor ) override;
207 
209  virtual void ChangeGroupDepth( int aGroupNumber, int aDepth ) override;
210 
212  virtual void DeleteGroup( int aGroupNumber ) override;
213 
215  virtual void ClearCache() override;
216 
217  // --------------------------------------------------------
218  // Handling the world <-> screen transformation
219  // --------------------------------------------------------
220 
222  virtual void SaveScreen() override;
223 
225  virtual void RestoreScreen() override;
226 
228  virtual void SetTarget( RENDER_TARGET aTarget ) override;
229 
231  virtual RENDER_TARGET GetTarget() const override;
232 
234  virtual void ClearTarget( RENDER_TARGET aTarget ) override;
235 
237  virtual void SetNegativeDrawMode( bool aSetting ) override {}
238 
239  // -------
240  // Cursor
241  // -------
242 
244  virtual void DrawCursor( const VECTOR2D& aCursorPosition ) override;
245 
251  void PostPaint()
252  {
253  if( paintListener )
254  {
255  wxPaintEvent redrawEvent;
256  wxPostEvent( paintListener, redrawEvent );
257  }
258  }
259 
260  void SetMouseListener( wxEvtHandler* aMouseListener )
261  {
262  mouseListener = aMouseListener;
263  }
264 
265  void SetPaintListener( wxEvtHandler* aPaintListener )
266  {
267  paintListener = aPaintListener;
268  }
269 
270  virtual void EnableDepthTest( bool aEnabled = false ) override;
271 
273  typedef struct
274  {
277 
279  std::deque< boost::shared_array<GLdouble> >& intersectPoints;
280  } TessParams;
281 
282 private:
284  typedef GAL super;
285 
286  static const int CIRCLE_POINTS = 64;
287  static const int CURVE_POINTS = 32;
288 
289  static wxGLContext* glMainContext;
290  wxGLContext* glPrivContext;
291  static int instanceCounter;
292  wxEvtHandler* mouseListener;
293  wxEvtHandler* paintListener;
294 
295  static GLuint fontTexture;
296 
297  // Vertex buffer objects related fields
298  typedef std::unordered_map< unsigned int, std::shared_ptr<VERTEX_ITEM> > GROUPS_MAP;
299  GROUPS_MAP groups;
300  unsigned int groupCounter;
305 
306  // Framebuffer & compositing
308  unsigned int mainBuffer;
309  unsigned int overlayBuffer;
311 
312  // Shader
313  static SHADER* shader;
314 
315  // Internal flags
317  static bool isBitmapFontLoaded;
320  bool isGrouping;
325 
326  std::unique_ptr<GL_BITMAP_CACHE> bitmapCache;
327 
328  void lockContext( int aClientCookie ) override;
329 
330  void unlockContext( int aClientCookie ) override;
331 
333  virtual void beginUpdate() override;
334 
336  virtual void endUpdate() override;
337 
339  virtual void beginDrawing() override;
340 
342  virtual void endDrawing() override;
343 
345  bool updatedGalDisplayOptions( const GAL_DISPLAY_OPTIONS& aOptions ) override;
346 
347  // Polygon tesselation
349  GLUtesselator* tesselator;
351  std::deque< boost::shared_array<GLdouble> > tessIntersects;
352 
359  void drawLineQuad( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint );
360 
370  void drawSemiCircle( const VECTOR2D& aCenterPoint, double aRadius, double aAngle );
371 
380  void drawFilledSemiCircle( const VECTOR2D& aCenterPoint, double aRadius, double aAngle );
381 
390  void drawStrokedSemiCircle( const VECTOR2D& aCenterPoint, double aRadius, double aAngle );
391 
397  void drawPolyline( const std::function<VECTOR2D (int)>& aPointGetter, int aPointCount );
398 
405  void drawPolygon( GLdouble* aPoints, int aPointCount );
406 
410  void drawTriangulatedPolyset( const SHAPE_POLY_SET& aPoly );
411 
412 
420  int drawBitmapChar( unsigned long aChar );
421 
431  void drawBitmapOverbar( double aLength, double aHeight );
432 
440  std::pair<VECTOR2D, float> computeBitmapTextSize( const UTF8& aText ) const;
441 
442  // Event handling
448  void onPaint( wxPaintEvent& aEvent );
449 
455  void skipMouseEvent( wxMouseEvent& aEvent );
456 
460  void blitCursor();
461 
467  unsigned int getNewGroupNumber();
468 
472  double calcAngleStep( double aRadius ) const
473  {
474  // Bigger arcs need smaller alpha increment to make them look smooth
475  return std::min( 1e6 / aRadius, 2.0 * M_PI / CIRCLE_POINTS );
476  }
477 
478  double getWorldPixelSize() const;
479 
483  void init();
484 };
485 } // namespace KIGFX
486 
487 #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
double getWorldPixelSize() const
Definition: opengl_gal.cpp:346
VERTEX_MANAGER * currentManager
Currently used VERTEX_MANAGER (for storing VERTEX_ITEMs)
Definition: opengl_gal.h:301
virtual void beginUpdate() override
Definition: opengl_gal.cpp:547
static SHADER * shader
There is only one shader used for different objects.
Definition: opengl_gal.h:313
virtual void DrawBitmap(const BITMAP_BASE &aBitmap) override
Draw a bitmap image.
static wxGLContext * glMainContext
Parent OpenGL context.
Definition: opengl_gal.h:289
double calcAngleStep(double aRadius) const
Compute the angle step when drawing arcs/circles approximated with lines.
Definition: opengl_gal.h:472
Class CAIRO_GAL is the cairo implementation of the graphics abstraction layer.
Definition: class_module.h:57
unsigned int overlayBuffer
Auxiliary rendering target (for menus etc.)
Definition: opengl_gal.h:309
std::deque< boost::shared_array< GLdouble > > & intersectPoints
Intersect points, that have to be freed after tessellation.
Definition: opengl_gal.h:279
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:310
bool isBitmapFontInitialized
Is the shader set to use bitmap fonts?
Definition: opengl_gal.h:318
void drawPolygon(GLdouble *aPoints, int aPointCount)
Draws a filled polygon.
static GLuint fontTexture
Bitmap font texture handle (shared)
Definition: opengl_gal.h:295
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:304
Class OpenGL_GAL is the OpenGL implementation of the Graphics Abstraction Layer.
Definition: opengl_gal.h:65
virtual void Restore() override
Restore the context.
virtual void ChangeGroupDepth(int aGroupNumber, int aDepth) override
Changes the depth (Z-axis position) of the group.
std::unique_ptr< GL_BITMAP_CACHE > bitmapCache
Definition: opengl_gal.h:326
virtual void EnableDepthTest(bool aEnabled=false) override
Parameters passed to the GLU tesselator.
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:908
Class to control vertex container and GPU with possibility of emulating old-style OpenGL 1...
bool isContextLocked
Used for assertion checking.
Definition: opengl_gal.h:322
void SetPaintListener(wxEvtHandler *aPaintListener)
Definition: opengl_gal.h:265
CIRCLE_POINTS
Class that handles multitarget rendering (ie.
bool isGrouping
Was a group started?
Definition: opengl_gal.h:321
std::unordered_map< unsigned int, std::shared_ptr< VERTEX_ITEM > > GROUPS_MAP
Definition: opengl_gal.h:298
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:181
virtual void ResizeScreen(int aWidth, int aHeight) override
Resizes the canvas.
void unlockContext(int aClientCookie) override
Definition: opengl_gal.cpp:533
virtual void Transform(const MATRIX3x3D &aTransformation) override
Transform the context.
VERTEX_MANAGER * nonCachedManager
Container for storing non-cached VERTEX_ITEMs.
Definition: opengl_gal.h:303
static int instanceCounter
GL GAL instance counter.
Definition: opengl_gal.h:291
VERTEX_MANAGER * vboManager
Manager used for storing new vertices.
Definition: opengl_gal.h:276
virtual void DrawArcSegment(const VECTOR2D &aCenterPoint, double aRadius, double aStartAngle, double aEndAngle, double aWidth) override
Draw an arc segment.
Definition: opengl_gal.cpp:751
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:287
This class handle bitmap images in KiCad.
Definition: bitmap_base.h:46
virtual void endUpdate() override
Definition: opengl_gal.cpp:563
virtual void Save() override
Save the context.
void init()
Basic OpenGL initialization.
OPENGL_COMPOSITOR * compositor
Handles multiple rendering targets.
Definition: opengl_gal.h:307
GROUPS_MAP groups
Stores informations about VBO objects (groups)
Definition: opengl_gal.h:299
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 RestoreScreen() override
Restore the screen contents.
unsigned int mainBuffer
Main rendering target.
Definition: opengl_gal.h:308
virtual bool Show(bool aShow) override
Shows/hides the GAL canvas.
void SetMouseListener(wxEvtHandler *aMouseListener)
Definition: opengl_gal.h:260
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:292
bool updatedGalDisplayOptions(const GAL_DISPLAY_OPTIONS &aOptions) override
Function updatedGalDisplayOptions.
Definition: opengl_gal.cpp:326
virtual void DrawGrid() override
>
virtual void DrawLine(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint) override
Draw a line.
Definition: opengl_gal.cpp:572
void onPaint(wxPaintEvent &aEvent)
This is the OnPaint event handler.
virtual void endDrawing() override
Definition: opengl_gal.cpp:488
virtual void DrawGroup(int aGroupNumber) override
Draw the stored group.
bool isFramebufferInitialized
Are the framebuffers initialized?
Definition: opengl_gal.h:316
virtual bool IsInitialized() const override
Returns the initalization status for the canvas.
Definition: opengl_gal.h:92
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:942
Class SHADER provides the access to the OpenGL shaders.
Definition: shader.h:74
void lockContext(int aClientCookie) override
Private: use GAL_CONTEXT_LOCKER RAII object.
Definition: opengl_gal.cpp:523
GAL super
Super class definition.
Definition: opengl_gal.h:284
GLUtesselator * tesselator
The tessellator.
Definition: opengl_gal.h:349
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:302
virtual void DrawPolyline(const std::deque< VECTOR2D > &aPointList) override
Draw a polyline.
Definition: opengl_gal.cpp:885
virtual void DrawSegment(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint, double aWidth) override
Draw a rounded segment.
Definition: opengl_gal.cpp:580
GLint ufm_worldPixelSize
Definition: opengl_gal.h:324
wxEvtHandler * paintListener
Definition: opengl_gal.h:293
std::deque< boost::shared_array< GLdouble > > tessIntersects
Storage for intersecting points.
Definition: opengl_gal.h:351
virtual void DrawArc(const VECTOR2D &aCenterPoint, double aRadius, double aStartAngle, double aEndAngle) override
Draw an arc.
Definition: opengl_gal.cpp:685
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:319
void PostPaint()
Function PostPaint posts an event to m_paint_listener.
Definition: opengl_gal.h:251
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:300
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:290
virtual void DrawRectangle(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint) override
Draw a rectangle.
Definition: opengl_gal.cpp:847
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.
virtual void SetNegativeDrawMode(bool aSetting) override
Sets negative draw mode in the renderer.
Definition: opengl_gal.h:237
virtual ~OPENGL_GAL()
Definition: opengl_gal.cpp:281
bool IsVisible() const override
>
Definition: opengl_gal.h:99
virtual void beginDrawing() override
Definition: opengl_gal.cpp:352
virtual bool IsOpenGlEngine() override
Returns true if the GAL engine is a opengl based type.
Definition: opengl_gal.h:89
virtual void DrawCircle(const VECTOR2D &aCenterPoint, double aRadius) override
Draw a circle using world coordinates.
Definition: opengl_gal.cpp:625
static bool isBitmapFontLoaded
Is the bitmap font texture loaded?
Definition: opengl_gal.h:317
virtual void DrawCurve(const VECTOR2D &startPoint, const VECTOR2D &controlPointA, const VECTOR2D &controlPointB, const VECTOR2D &endPoint) override
Draw a cubic bezier spline.
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.