source: git/src/gla.h @ 81b44f0

RELEASE/1.2debug-cidebug-ci-sanitisersfaster-cavernlogstereowalls-datawalls-data-hanging-as-warning
Last change on this file since 81b44f0 was 522e0bd, checked in by Olly Betts <olly@…>, 6 years ago

Make "no date"/"not in loop" colour grey

The white is a bit bright and makes it harder to see the legs that
have colours. The grey now used is within the brightness range of
the other colours.

Fixes #94, reported by Erin Lynch.

  • Property mode set to 100644
File size: 8.1 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,2004,2005,2006,2007,2011,2012,2014,2017,2018 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#include <string>
25#include <vector>
26
27using namespace std;
28
29#include "wx.h"
30#include "aventypes.h"
31#include "vector3.h"
32
33#include "glbitmapfont.h"
34
35class GfxCore;
36
37string GetGLSystemDescription();
38
39// #define GLA_DEBUG
40
41typedef Double glaCoord;
42
43typedef GLfloat glaTexCoord;
44
45// Colours for drawing.  Don't reorder these!
46enum gla_colour {
47    col_BLACK = 0,
48    col_GREY,
49    col_LIGHT_GREY,
50    col_LIGHT_GREY_2,
51    col_DARK_GREY,
52    col_WHITE,
53    col_TURQUOISE,
54    col_GREEN,
55    col_INDICATOR_1,
56    col_INDICATOR_2,
57    col_YELLOW,
58    col_RED,
59    col_BLUE,
60    col_LAST // must be the last entry here
61};
62
63class GLAPen {
64    friend class GLACanvas; // allow direct access to components
65
66    double components[3]; // red, green, blue
67
68public:
69    GLAPen();
70
71    void SetColour(double red, double green, double blue); // arguments in range 0 to 1.0
72    void Interpolate(const GLAPen&, double how_far);
73
74    double GetRed() const;
75    double GetGreen() const;
76    double GetBlue() const;
77};
78
79class GLAList {
80    GLuint gl_list;
81    unsigned int flags;
82  public:
83    GLAList() : gl_list(0), flags(0) { }
84    GLAList(GLuint gl_list_, unsigned int flags_)
85        : gl_list(gl_list_), flags(flags_) { }
86    operator bool() { return gl_list != 0; }
87    bool need_to_generate();
88    void finalise(unsigned int list_flags);
89    bool DrawList() const;
90    void invalidate_if(unsigned int mask) {
91        // If flags == NEVER_CACHE, the list won't be invalidated (unless
92        // mask is 0, which isn't a normal thing to pass).
93        if (flags & mask)
94            flags = 0;
95    }
96};
97
98class GLACanvas : public wxGLCanvas {
99    friend class GLAList; // For flag values.
100
101    wxGLContext ctx;
102
103#ifdef GLA_DEBUG
104    int m_Vertices;
105#endif
106
107    GLdouble modelview_matrix[16];
108    GLdouble projection_matrix[16];
109    GLint viewport[4];
110
111    // Viewing volume diameter:
112    glaCoord m_VolumeDiameter;
113
114    // Parameters for plotting data:
115    Double m_Pan, m_Tilt;
116    Double m_Scale;
117    Vector3 m_Translation;
118
119    BitmapFont m_Font;
120
121    GLUquadric* m_Quadric;
122
123    GLuint m_Texture;
124    GLuint m_BlobTexture;
125    GLuint m_CrossTexture;
126
127    Double alpha;
128
129    bool m_SmoothShading;
130    bool m_Textured;
131    bool m_Perspective;
132    bool m_Fog;
133    bool m_AntiAlias;
134    bool save_hints;
135    enum { UNKNOWN = 0, POINT = 'P', LINES = 'L', SPRITE = 'S' };
136    int blob_method;
137    int cross_method;
138
139    int x_size;
140    int y_size;
141
142    vector<GLAList> drawing_lists;
143
144    enum {
145        INVALIDATE_ON_SCALE = 1,
146        INVALIDATE_ON_X_RESIZE = 2,
147        INVALIDATE_ON_Y_RESIZE = 4,
148        NEVER_CACHE = 8,
149        CACHED = 16
150    };
151    mutable unsigned int list_flags;
152
153    wxString vendor, renderer;
154
155    bool CheckVisualFidelity(const unsigned char * target) const;
156
157public:
158    GLACanvas(wxWindow* parent, int id);
159    ~GLACanvas();
160
161    void FirstShow();
162
163    void Clear();
164    void StartDrawing();
165    void FinishDrawing();
166
167    void SetVolumeDiameter(glaCoord diameter);
168    void SetDataTransform();
169    void SetIndicatorTransform();
170
171    void DrawList(unsigned int l);
172    void DrawListZPrepass(unsigned int l);
173    void DrawList2D(unsigned int l, glaCoord x, glaCoord y, Double rotation);
174    void InvalidateList(unsigned int l) {
175        if (l < drawing_lists.size()) {
176            // Invalidate any existing cached list.
177            drawing_lists[l].invalidate_if(CACHED);
178        }
179    }
180
181    virtual void GenerateList(unsigned int l) = 0;
182
183    void SetColour(const GLAPen& pen, double rgb_scale);
184    void SetColour(const GLAPen& pen);
185    void SetColour(gla_colour colour, double rgb_scale);
186    void SetColour(gla_colour colour);
187    void SetAlpha(double new_alpha) { alpha = new_alpha; }
188
189    void DrawText(glaCoord x, glaCoord y, glaCoord z, const wxString& str);
190    void DrawIndicatorText(int x, int y, const wxString& str);
191    void GetTextExtent(const wxString& str, int * x_ext, int * y_ext) const;
192
193    void BeginQuadrilaterals();
194    void EndQuadrilaterals();
195    void BeginLines();
196    void EndLines();
197    void BeginTriangleStrip();
198    void EndTriangleStrip();
199    void BeginTriangles();
200    void EndTriangles();
201    void BeginPolyline();
202    void EndPolyline();
203    void BeginPolygon();
204    void EndPolygon();
205    void BeginBlobs();
206    void EndBlobs();
207    void BeginCrosses();
208    void EndCrosses();
209
210    void DrawRectangle(gla_colour fill, gla_colour edge,
211                       glaCoord x0, glaCoord y0, glaCoord w, glaCoord h);
212    void DrawShadedRectangle(const GLAPen & fill_bot, const GLAPen & fill_top,
213                             glaCoord x0, glaCoord y0, glaCoord w, glaCoord h);
214    void DrawCircle(gla_colour edge, gla_colour fill, glaCoord cx, glaCoord cy, glaCoord radius);
215    void DrawSemicircle(gla_colour edge, gla_colour fill, glaCoord cx, glaCoord cy, glaCoord radius, glaCoord start);
216    void DrawTriangle(gla_colour edge, gla_colour fill,
217                      const Vector3 &p0, const Vector3 &p1, const Vector3 &p2);
218
219    void DrawBlob(glaCoord x, glaCoord y, glaCoord z);
220    void DrawBlob(glaCoord x, glaCoord y);
221    void DrawCross(glaCoord x, glaCoord y, glaCoord z);
222    void DrawRing(glaCoord x, glaCoord y);
223
224    void PlaceVertex(const Vector3 & v, glaTexCoord tex_x, glaTexCoord tex_y) {
225        PlaceVertex(v.GetX(), v.GetY(), v.GetZ(), tex_x, tex_y);
226    }
227    void PlaceVertex(const Vector3 & v) {
228        PlaceVertex(v.GetX(), v.GetY(), v.GetZ());
229    }
230    void PlaceVertex(glaCoord x, glaCoord y, glaCoord z);
231    void PlaceVertex(glaCoord x, glaCoord y, glaCoord z,
232                     glaTexCoord tex_x, glaTexCoord tex_y);
233    void PlaceIndicatorVertex(glaCoord x, glaCoord y);
234
235    void PlaceNormal(const Vector3 &v);
236
237    void EnableDashedLines();
238    void DisableDashedLines();
239
240    void EnableSmoothPolygons(bool filled);
241    void DisableSmoothPolygons();
242
243    void SetRotation(double pan, double tilt) {
244        m_Pan = pan;
245        m_Tilt = tilt;
246    }
247    void SetScale(Double);
248    void SetTranslation(const Vector3 &v) {
249        m_Translation = v;
250    }
251    void AddTranslation(const Vector3 &v) {
252        m_Translation += v;
253    }
254    const Vector3 & GetTranslation() const {
255        return m_Translation;
256    }
257    void AddTranslationScreenCoordinates(int dx, int dy);
258
259    bool Transform(const Vector3 & v, double* x_out, double* y_out, double* z_out) const;
260    void ReverseTransform(Double x, Double y, double* x_out, double* y_out, double* z_out) const;
261
262    int GetFontSize() const { return m_Font.get_font_size(); }
263
264    void ToggleSmoothShading();
265    bool GetSmoothShading() const { return m_SmoothShading; }
266
267    Double SurveyUnitsAcrossViewport() const;
268
269    void ToggleTextured();
270    bool GetTextured() const { return m_Textured; }
271
272    void TogglePerspective() { m_Perspective = !m_Perspective; }
273    bool GetPerspective() const { return m_Perspective; }
274
275    void ToggleFog() { m_Fog = !m_Fog; }
276    bool GetFog() const { return m_Fog; }
277
278    void ToggleAntiAlias() { m_AntiAlias = !m_AntiAlias; }
279    bool GetAntiAlias() const { return m_AntiAlias; }
280
281    bool SaveScreenshot(const wxString & fnm, wxBitmapType type) const;
282
283    void ReadPixels(int width, int height, unsigned char * buf) const;
284
285    void PolygonOffset(bool on) const;
286
287    int GetXSize() const { list_flags |= INVALIDATE_ON_X_RESIZE; return x_size; }
288    int GetYSize() const { list_flags |= INVALIDATE_ON_Y_RESIZE; return y_size; }
289
290    void OnSize(wxSizeEvent & event);
291
292    glaCoord GetVolumeDiameter() const { return m_VolumeDiameter; }
293
294private:
295    DECLARE_EVENT_TABLE()
296};
Note: See TracBrowser for help on using the repository browser.