source: git/src/gla.h @ 8e59e9b9

stereo-2025
Last change on this file since 8e59e9b9 was fd0e32a, checked in by Olly Betts <olly@…>, 3 months ago

Raise wxWidgets requirement to >= 3.2.0

Previously it was >= 3.0.0 but it is starting to become hard to
keep everything working with 3.0.0 and the time and effort seems
better directed to other things.

The last 3.0.x release was 3.0.5.1 released 2020-05-02.

wx3.2.0 was released 2022-07-06 and it seems everywhere with wxWidgets
packages upgraded to 3.2.x some time ago.

  • Property mode set to 100644
File size: 9.5 KB
Line 
1//
2//  gla.h
3//
4//  Header file for the GLA abstraction layer.
5//
6//  Copyright (C) 2002 Mark R. Shinwell.
7//  Copyright (C) 2003-2025 Olly Betts
8//
9//  This program is free software; you can redistribute it and/or modify
10//  it under the terms of the GNU General Public License as published by
11//  the Free Software Foundation; either version 2 of the License, or
12//  (at your option) any later version.
13//
14//  This program is distributed in the hope that it will be useful,
15//  but WITHOUT ANY WARRANTY; without even the implied warranty of
16//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17//  GNU General Public License for more details.
18//
19//  You should have received a copy of the GNU General Public License
20//  along with this program; if not, write to the Free Software
21//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
22//
23
24#ifndef gla_h
25#define gla_h
26
27#include <string>
28#include <vector>
29
30using namespace std;
31
32#include "wx.h"
33#include "vector3.h"
34
35#include "glbitmapfont.h"
36
37#ifdef HAVE_GL_GL_H
38# include <GL/gl.h>
39#elif defined HAVE_OPENGL_GL_H
40# include <OpenGL/gl.h>
41#endif
42
43#ifdef HAVE_GL_GLU_H
44# include <GL/glu.h>
45#elif defined HAVE_OPENGL_GLU_H
46# include <OpenGL/glu.h>
47#endif
48
49class GfxCore;
50
51string GetGLSystemDescription();
52
53// #define GLA_DEBUG
54
55typedef GLdouble glaCoord;
56
57typedef GLfloat glaTexCoord;
58
59// Colours for drawing.  Don't reorder these!
60enum gla_colour {
61    col_BLACK = 0,
62    col_GREY,
63    col_LIGHT_GREY,
64    col_LIGHT_GREY_2,
65    col_DARK_GREY,
66    col_WHITE,
67    col_TURQUOISE,
68    col_GREEN,
69    col_INDICATOR_1,
70    col_INDICATOR_2,
71    col_YELLOW,
72    col_RED,
73    col_BLUE,
74    col_MAGENTA,
75    col_LAST // must be the last entry here
76};
77
78class GLAPen {
79    friend class GLACanvas; // allow direct access to components
80
81    double components[3] = { 0.0, 0.0, 0.0 }; // red, green, blue
82
83public:
84    GLAPen() {}
85
86    void SetColour(double red, double green, double blue); // arguments in range 0 to 1.0
87    void Interpolate(const GLAPen&, double how_far);
88
89    double GetRed() const;
90    double GetGreen() const;
91    double GetBlue() const;
92};
93
94class GLAList {
95    GLuint gl_list = 0;
96    unsigned int flags = 0;
97  public:
98    GLAList() { }
99    GLAList(GLuint gl_list_, unsigned int flags_)
100        : gl_list(gl_list_), flags(flags_) { }
101    operator bool() { return gl_list != 0; }
102    bool need_to_generate();
103    void finalise(unsigned int list_flags);
104    bool DrawList() const;
105    void invalidate_if(unsigned int mask) {
106        // If flags == NEVER_CACHE, the list won't be invalidated (unless
107        // mask is 0, which isn't a normal thing to pass).
108        if (flags & mask)
109            flags = 0;
110    }
111};
112
113class GLACanvas : public wxGLCanvas {
114    friend class GLAList; // For flag values.
115
116    wxGLContext ctx;
117
118#ifdef GLA_DEBUG
119    int m_Vertices;
120#endif
121
122    GLdouble modelview_matrix[16];
123    GLdouble projection_matrix[16];
124    GLint viewport[4];
125
126    // Viewing volume diameter:
127    glaCoord m_VolumeDiameter = 1.0;
128
129    // Parameters for plotting data:
130    double m_Pan = 0.0, m_Tilt = 0.0;
131    double m_Scale = 0.0;
132    Vector3 m_Translation;
133
134    double z_stretch = 1.0;
135
136    BitmapFont m_Font;
137
138    GLUquadric* m_Quadric = nullptr;
139
140    GLuint m_Texture = 0;
141    GLuint m_BlobTexture;
142    GLuint m_CrossTexture;
143
144    double alpha = 1.0;
145
146    bool m_SmoothShading = false;
147    bool m_Textured = false;
148    bool m_Perspective = false;
149    bool m_Fog = false;
150    bool m_AntiAlias = false;
151    bool save_hints;
152    enum { UNKNOWN = 0, POINT = 'P', LINES = 'L', SPRITE = 'S' };
153    int blob_method = UNKNOWN;
154    int cross_method = UNKNOWN;
155
156    int x_size = 0;
157    int y_size = 0;
158
159#ifdef wxHAS_DPI_INDEPENDENT_PIXELS
160    double content_scale_factor = 1.0;
161#else
162    static constexpr unsigned content_scale_factor = 1;
163#endif
164
165    vector<GLAList> drawing_lists;
166
167    enum {
168        INVALIDATE_ON_SCALE = 1,
169        INVALIDATE_ON_X_RESIZE = 2,
170        INVALIDATE_ON_Y_RESIZE = 4,
171        INVALIDATE_ON_HIDPI = 8,
172        NEVER_CACHE = 16,
173        CACHED = 32
174    };
175    mutable unsigned int list_flags = 0;
176
177    wxString vendor, renderer;
178
179    bool CheckVisualFidelity(const unsigned char * target) const;
180
181public:
182    GLACanvas(wxWindow* parent, int id);
183    ~GLACanvas();
184
185    static bool check_visual();
186
187    void FirstShow();
188
189    void Clear();
190    void ClearNative();
191    void StartDrawing();
192    void FinishDrawing();
193
194    void SetVolumeDiameter(glaCoord diameter);
195    void SetDataTransform();
196    void SetIndicatorTransform();
197
198    void DrawList(unsigned int l);
199    void DrawListZPrepass(unsigned int l);
200    void DrawList2D(unsigned int l, glaCoord x, glaCoord y, double rotation);
201    void InvalidateList(unsigned int l) {
202        if (l < drawing_lists.size()) {
203            // Invalidate any existing cached list.
204            drawing_lists[l].invalidate_if(CACHED);
205        }
206    }
207
208    virtual void GenerateList(unsigned int l) = 0;
209
210    void SetColour(const GLAPen& pen, double rgb_scale);
211    void SetColour(const GLAPen& pen);
212    void SetColour(gla_colour colour, double rgb_scale);
213    void SetColour(gla_colour colour);
214    void SetAlpha(double new_alpha) { alpha = new_alpha; }
215
216    void DrawText(glaCoord x, glaCoord y, glaCoord z, const wxString& str);
217    void DrawIndicatorText(int x, int y, const wxString& str);
218    void GetTextExtent(const wxString& str, int * x_ext, int * y_ext) const;
219
220    void BeginQuadrilaterals();
221    void EndQuadrilaterals();
222    void BeginLines();
223    void EndLines();
224    void BeginTriangleStrip();
225    void EndTriangleStrip();
226    void BeginTriangles();
227    void EndTriangles();
228    void BeginPolyline();
229    void EndPolyline();
230    void BeginPolyloop();
231    void EndPolyloop();
232    void BeginPolygon();
233    void EndPolygon();
234    void BeginPoints();
235    void EndPoints();
236    void BeginBlobs();
237    void EndBlobs();
238    void BeginCrosses();
239    void EndCrosses();
240
241    void DrawRectangle(gla_colour fill, gla_colour edge,
242                       glaCoord x0, glaCoord y0, glaCoord w, glaCoord h);
243    void DrawShadedRectangle(const GLAPen & fill_bot, const GLAPen & fill_top,
244                             glaCoord x0, glaCoord y0, glaCoord w, glaCoord h);
245    void DrawCircle(gla_colour edge, gla_colour fill, glaCoord cx, glaCoord cy, glaCoord radius);
246    void DrawSemicircle(gla_colour edge, gla_colour fill, glaCoord cx, glaCoord cy, glaCoord radius, glaCoord start);
247
248    void DrawBlob(glaCoord x, glaCoord y, glaCoord z);
249    void DrawBlob(glaCoord x, glaCoord y);
250    void DrawCross(glaCoord x, glaCoord y, glaCoord z);
251    void DrawRing(glaCoord x, glaCoord y);
252
253    void PlaceVertex(const Vector3 & v, glaTexCoord tex_x, glaTexCoord tex_y) {
254        PlaceVertex(v.GetX(), v.GetY(), v.GetZ(), tex_x, tex_y);
255    }
256    void PlaceVertex(const Vector3 & v) {
257        PlaceVertex(v.GetX(), v.GetY(), v.GetZ());
258    }
259    void PlaceVertex(glaCoord x, glaCoord y, glaCoord z);
260    void PlaceVertex(glaCoord x, glaCoord y, glaCoord z,
261                     glaTexCoord tex_x, glaTexCoord tex_y);
262    void PlaceIndicatorVertex(glaCoord x, glaCoord y);
263
264    void PlaceNormal(const Vector3 &v);
265
266    void EnableDashedLines();
267    void DisableDashedLines();
268
269    void EnableSmoothPolygons(bool filled);
270    void DisableSmoothPolygons();
271
272    void SetRotation(double pan, double tilt) {
273        m_Pan = pan;
274        m_Tilt = tilt;
275    }
276    void SetScale(double);
277    void SetTranslation(const Vector3 &v) {
278        m_Translation = v;
279    }
280    void AddTranslation(const Vector3 &v) {
281        m_Translation += v;
282    }
283    const Vector3 & GetTranslation() const {
284        return m_Translation;
285    }
286    void AddTranslationScreenCoordinates(int dx, int dy);
287
288    bool Transform(const Vector3 & v, glaCoord* x_out, glaCoord* y_out, glaCoord* z_out) const;
289    void ReverseTransform(double x, double y, glaCoord* x_out, glaCoord* y_out, glaCoord* z_out) const;
290
291    void SetZStretch(double z_stretch_) { z_stretch = z_stretch_; }
292
293    int GetFontSize() const { return m_Font.get_font_size(); }
294
295    void ToggleSmoothShading();
296    bool GetSmoothShading() const { return m_SmoothShading; }
297
298    double SurveyUnitsAcrossViewport() const;
299
300    void ToggleTextured();
301    bool GetTextured() const { return m_Textured; }
302
303    void TogglePerspective() { m_Perspective = !m_Perspective; }
304    bool GetPerspective() const { return m_Perspective; }
305
306    void ToggleFog() { m_Fog = !m_Fog; }
307    bool GetFog() const { return m_Fog; }
308
309    void ToggleAntiAlias() { m_AntiAlias = !m_AntiAlias; }
310    bool GetAntiAlias() const { return m_AntiAlias; }
311
312    bool SaveScreenshot(const wxString & fnm, wxBitmapType type) const;
313
314    void ReadPixels(int width, int height, unsigned char * buf) const;
315
316    void PolygonOffset(bool on) const;
317
318    int GetXSize() const {
319        list_flags |= INVALIDATE_ON_X_RESIZE;
320        return x_size;
321    }
322
323    int GetYSize() const {
324        list_flags |= INVALIDATE_ON_Y_RESIZE;
325        return y_size;
326    }
327
328#ifdef wxHAS_DPI_INDEPENDENT_PIXELS
329    double GetContentScaleFactor() const {
330        list_flags |= INVALIDATE_ON_HIDPI;
331        return content_scale_factor;
332    }
333
334    void UpdateContentScaleFactor();
335    void OnMove(wxMoveEvent & event);
336#else
337    // wxWindow::GetContentScaleFactor() will always return 1.0, so arrange
338    // things so it's a compile-time constant the compiler can optimise away.
339    // Use a macro so we can return unsigned instead of double without a lot
340    // of pain from trying to override a virtual method while changing the
341    // return type.
342# define GetContentScaleFactor() 1u
343    void UpdateContentScaleFactor() { }
344#endif
345
346    void OnSize(wxSizeEvent & event);
347
348    glaCoord GetVolumeDiameter() const { return m_VolumeDiameter; }
349
350    void ScaleMouseEvent(wxMouseEvent& e) const {
351        e.SetX(e.GetX() * content_scale_factor);
352        e.SetY(e.GetY() * content_scale_factor);
353    }
354
355private:
356    DECLARE_EVENT_TABLE()
357};
358
359#endif
Note: See TracBrowser for help on using the repository browser.