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