2 Copyright (C) 1999-2007 id Software, Inc. and contributors.
\r
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
\r
5 This file is part of GtkRadiant.
\r
7 GtkRadiant is free software; you can redistribute it and/or modify
\r
8 it under the terms of the GNU General Public License as published by
\r
9 the Free Software Foundation; either version 2 of the License, or
\r
10 (at your option) any later version.
\r
12 GtkRadiant is distributed in the hope that it will be useful,
\r
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
15 GNU General Public License for more details.
\r
17 You should have received a copy of the GNU General Public License
\r
18 along with GtkRadiant; if not, write to the Free Software
\r
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\r
22 //-----------------------------------------------------------------------------
\r
26 // all purpose OpenGL interface for Q3Radiant plugins
\r
32 #if defined (__linux__) || defined (__APPLE__)
\r
36 // we use these classes to let plugins draw inside the Radiant windows
\r
37 // 2D window like YZ XZ XY
\r
41 // Increment the number of references to this object
\r
42 virtual void IncRef () = 0;
\r
43 // Decrement the reference count
\r
44 virtual void DecRef () = 0;
\r
45 virtual void Draw2D( VIEWTYPE vt ) = 0;
\r
52 // Increment the number of references to this object
\r
53 virtual void IncRef () = 0;
\r
54 // Decrement the reference count
\r
55 virtual void DecRef () = 0;
\r
56 virtual void Draw3D() = 0;
\r
59 #define QGL_MAJOR "qgl"
\r
63 typedef void (APIENTRY* PFN_QGLALPHAFUNC) (GLenum func, GLclampf ref);
\r
64 typedef void (APIENTRY* PFN_QGLBEGIN) (GLenum);
\r
65 typedef void (APIENTRY* PFN_QGLBINDTEXTURE) (GLenum target, GLuint texture);
\r
66 typedef void (APIENTRY* PFN_QGLBLENDFUNC) (GLenum sfactor, GLenum dfactor);
\r
67 typedef void (APIENTRY* PFN_QGLCALLLIST) (GLuint list);
\r
68 typedef void (APIENTRY* PFN_QGLCALLLISTS) (GLsizei n, GLenum type, const GLvoid *lists);
\r
69 typedef void (APIENTRY* PFN_QGLCLEAR) (GLbitfield mask);
\r
70 typedef void (APIENTRY* PFN_QGLCLEARCOLOR) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
\r
71 typedef void (APIENTRY* PFN_QGLCLEARDEPTH) (GLclampd depth);
\r
72 typedef void (APIENTRY* PFN_QGLCOLOR3F) (GLfloat red, GLfloat green, GLfloat blue);
\r
73 typedef void (APIENTRY* PFN_QGLCOLOR3FV) (const GLfloat *v);
\r
74 typedef void (APIENTRY* PFN_QGLCOLOR4F) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
\r
75 typedef void (APIENTRY* PFN_QGLCOLOR4FV) (const GLfloat *v);
\r
76 typedef void (APIENTRY* PFN_QGLCOLOR4UBV) (const GLubyte *v);
\r
77 typedef void (APIENTRY* PFN_QGLCOLORPOINTER) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
\r
78 typedef void (APIENTRY* PFN_QGLCULLFACE) (GLenum mode);
\r
79 typedef void (APIENTRY* PFN_QGLDELETELISTS) (GLuint list, GLsizei range);
\r
80 typedef void (APIENTRY* PFN_QGLDELETETEXTURES) (GLsizei n, const GLuint *textures);
\r
81 typedef void (APIENTRY* PFN_QGLDEPTHFUNC) (GLenum func);
\r
82 typedef void (APIENTRY* PFN_QGLDEPTHMASK) (GLboolean flag);
\r
83 typedef void (APIENTRY* PFN_QGLDISABLE) (GLenum cap);
\r
84 typedef void (APIENTRY* PFN_QGLDISABLECLIENTSTATE) (GLenum array);
\r
85 typedef void (APIENTRY* PFN_QGLDRAWELEMENTS) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
\r
86 typedef void (APIENTRY* PFN_QGLENABLE) (GLenum cap);
\r
87 typedef void (APIENTRY* PFN_QGLENABLECLIENTSTATE) (GLenum array);
\r
88 typedef void (APIENTRY* PFN_QGLEND) ();
\r
89 typedef void (APIENTRY* PFN_QGLENDLIST) ();
\r
90 typedef void (APIENTRY* PFN_QGLFOGF) (GLenum pname, GLfloat param);
\r
91 typedef void (APIENTRY* PFN_QGLFOGFV) (GLenum pname, const GLfloat *params);
\r
92 typedef void (APIENTRY* PFN_QGLFOGFI) (GLenum pname, GLint param);
\r
93 typedef GLuint (APIENTRY* PFN_QGLGENLISTS) (GLsizei range);
\r
94 typedef void (APIENTRY *PFN_QGLGENTEXTURES) (GLsizei n, GLuint *textures);
\r
95 typedef void (APIENTRY* PFN_QGLGETDOUBLEV) (GLenum pname, GLdouble *params);
\r
96 typedef void (APIENTRY* PFN_QGLHINT) (GLenum target, GLenum mode);
\r
97 typedef void (APIENTRY* PFN_QGLGETINTEGERV) (GLenum pname, GLint *params);
\r
98 typedef void (APIENTRY* PFN_QGLLIGHTFV) (GLenum light, GLenum pname, const GLfloat *params);
\r
99 typedef void (APIENTRY* PFN_QGLLINEWIDTH) (GLfloat size);
\r
100 typedef void (APIENTRY* PFN_QGLLINESTIPPLE) (GLint factor, GLushort pattern);
\r
101 typedef void (APIENTRY* PFN_QGLLINEWIDTH) (GLfloat size);
\r
102 typedef void (APIENTRY* PFN_QGLLISTBASE) (GLuint base);
\r
103 typedef void (APIENTRY* PFN_QGLLOADIDENTITY) ();
\r
104 typedef void (APIENTRY* PFN_QGLMATERIALF) (GLenum face, GLenum pname, GLfloat param);
\r
105 typedef void (APIENTRY* PFN_QGLMATERIALFV) (GLenum face, GLenum pname, const GLfloat *params);
\r
106 typedef void (APIENTRY* PFN_QGLMATRIXMODE) (GLenum mode);
\r
107 typedef void (APIENTRY* PFN_QGLMULTMATRIXF) (const GLfloat *m);
\r
108 typedef void (APIENTRY* PFN_QGLNEWLIST) (GLuint list, GLenum mode);
\r
109 typedef void (APIENTRY* PFN_QGLNORMAL3F) (GLfloat nx, GLfloat ny, GLfloat nz);
\r
110 typedef void (APIENTRY* PFN_QGLNORMAL3FV) (const GLfloat *n);
\r
111 typedef void (APIENTRY* PFN_QGLNORMALPOINTER) (GLenum type, GLsizei stride, const GLvoid *pointer);
\r
112 typedef void (APIENTRY* PFN_QGLORTHO) (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
\r
113 typedef void (APIENTRY* PFN_QGLPOINTSIZE) (GLfloat size);
\r
114 typedef void (APIENTRY* PFN_QGLPOLYGONMODE) (GLenum face, GLenum mode);
\r
115 typedef void (APIENTRY* PFN_QGLPOPATTRIB) ();
\r
116 typedef void (APIENTRY* PFN_QGLPOPMATRIX) ();
\r
117 typedef void (APIENTRY* PFN_QGLPUSHATTRIB) (GLbitfield mask);
\r
118 typedef void (APIENTRY* PFN_QGLPUSHMATRIX) ();
\r
119 typedef void (APIENTRY* PFN_QGLRASTERPOS3FV) (const GLfloat *v);
\r
120 typedef void (APIENTRY* PFN_QGLROTATED) (GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
\r
121 typedef void (APIENTRY* PFN_QGLROTATEF) (GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
\r
122 typedef void (APIENTRY* PFN_QGLSCALEF) (GLfloat x, GLfloat y, GLfloat z);
\r
123 typedef void (APIENTRY* PFN_QGLSCISSOR) (GLint x, GLint y, GLsizei width, GLsizei height);
\r
124 typedef void (APIENTRY* PFN_QGLSCALEF) (GLfloat x, GLfloat y, GLfloat z);
\r
125 typedef void (APIENTRY* PFN_QGLSHADEMODEL) (GLenum mode);
\r
126 typedef void (APIENTRY* PFN_QGLTEXCOORD2F) (GLfloat s, GLfloat t);
\r
127 typedef void (APIENTRY* PFN_QGLTEXCOORD2FV) (const GLfloat *v);
\r
128 typedef void (APIENTRY* PFN_QGLTEXCOORDPOINTER) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
\r
129 typedef void (APIENTRY* PFN_QGLTEXENVF) (GLenum target, GLenum pname, GLfloat param);
\r
130 typedef void (APIENTRY* PFN_QGLTEXGENF) (GLenum coord, GLenum pname, GLfloat param);
\r
131 typedef void (APIENTRY* PFN_QGLTEXIMAGE1D) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
\r
132 typedef void (APIENTRY* PFN_QGLTEXIMAGE2D) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
\r
133 typedef void (APIENTRY* PFN_QGLTEXPARAMETERF) (GLenum target, GLenum pname, GLfloat param);
\r
134 typedef void (APIENTRY* PFN_QGLTEXPARAMETERFV) (GLenum target, GLenum pname, const GLfloat *params);
\r
135 typedef void (APIENTRY* PFN_QGLTEXPARAMETERI) (GLenum target, GLenum pname, GLint param);
\r
136 typedef void (APIENTRY* PFN_QGLTEXPARAMETERIV) (GLenum target, GLenum pname, const GLint *params);
\r
137 typedef void (APIENTRY* PFN_QGLTEXSUBIMAGE1D) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
\r
138 typedef void (APIENTRY* PFN_QGLTEXSUBIMAGE2D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
\r
139 typedef void (APIENTRY* PFN_QGLTRANSLATED) (GLdouble x, GLdouble y, GLdouble z);
\r
140 typedef void (APIENTRY* PFN_QGLTRANSLATEF) (GLfloat x, GLfloat y, GLfloat z);
\r
141 typedef void (APIENTRY* PFN_QGLVERTEX2F) (GLfloat x, GLfloat y);
\r
142 typedef void (APIENTRY* PFN_QGLVERTEX3F) (GLfloat x, GLfloat y, GLfloat z);
\r
143 typedef void (APIENTRY* PFN_QGLVERTEX3FV) (const GLfloat *v);
\r
144 typedef void (APIENTRY* PFN_QGLVERTEXPOINTER) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
\r
145 typedef void (APIENTRY* PFN_QGLVIEWPORT) (GLint x, GLint y, GLsizei width, GLsizei height);
\r
147 typedef void (WINAPI* PFN_QE_CHECKOPENGLFORERRORS) ();
\r
150 // TTimo: NOTE: relying on glu might not be such a good idea. On many systems, the GLU lib is outdated, misversioned etc.
\r
151 typedef void (APIENTRY * PFN_QGLUPERSPECTIVE) (GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar);
\r
152 typedef void (APIENTRY * PFN_QGLULOOKAT) (GLdouble eyex, GLdouble eyey, GLdouble eyez,
\r
153 GLdouble centerx, GLdouble centery, GLdouble centerz,
\r
154 GLdouble upx, GLdouble upy, GLdouble upz);
\r
155 //++timo gluErrorString is defined but not exposed in the IGL interface
\r
158 // plugins drawing inside the GL windows
\r
159 //++timo TODO: add hooking into other windows (Z and .. texture??)
\r
160 //+timo NOTE: this could be moved to the messaging system instead of having a dedicated interface <- yet I don't know how
\r
161 typedef void (WINAPI* PFN_QERAPP_HOOKGL2DWINDOW) (IGL2DWindow *);
\r
162 typedef void (WINAPI* PFN_QERAPP_UNHOOKGL2DWINDOW) (IGL2DWindow *);
\r
163 typedef void (WINAPI* PFN_QERAPP_HOOKGL3DWINDOW) (IGL3DWindow *);
\r
164 typedef void (WINAPI* PFN_QERAPP_UNHOOKGL3DWINDOW) (IGL3DWindow *);
\r
166 struct _QERQglTable
\r
168 //++timo do we really wanna play with versions ?
\r
169 // float m_fVersion;
\r
171 PFN_QGLALPHAFUNC m_pfn_qglAlphaFunc;
\r
172 PFN_QGLBEGIN m_pfn_qglBegin;
\r
173 PFN_QGLBINDTEXTURE m_pfn_qglBindTexture;
\r
174 PFN_QGLBLENDFUNC m_pfn_qglBlendFunc;
\r
175 PFN_QGLCALLLIST m_pfn_qglCallList;
\r
176 PFN_QGLCLEAR m_pfn_qglClear;
\r
177 PFN_QGLCLEARCOLOR m_pfn_qglClearColor;
\r
178 PFN_QGLCALLLISTS m_pfn_qglCallLists;
\r
179 PFN_QGLCLEARDEPTH m_pfn_qglClearDepth;
\r
180 PFN_QGLCOLOR3F m_pfn_qglColor3f;
\r
181 PFN_QGLCOLOR3FV m_pfn_qglColor3fv;
\r
182 PFN_QGLCOLOR4F m_pfn_qglColor4f;
\r
183 PFN_QGLCOLOR4FV m_pfn_qglColor4fv;
\r
184 PFN_QGLCOLOR4UBV m_pfn_qglColor4ubv; // ydnar
\r
185 PFN_QGLCOLORPOINTER m_pfn_qglColorPointer;
\r
186 PFN_QGLCULLFACE m_pfn_qglCullFace;
\r
187 PFN_QGLDELETELISTS m_pfn_qglDeleteLists;
\r
188 PFN_QGLDELETETEXTURES m_pfn_qglDeleteTextures;
\r
189 PFN_QGLDEPTHFUNC m_pfn_qglDepthFunc;
\r
190 PFN_QGLDEPTHMASK m_pfn_qglDepthMask;
\r
191 PFN_QGLDISABLE m_pfn_qglDisable;
\r
192 PFN_QGLDISABLECLIENTSTATE m_pfn_qglDisableClientState;
\r
193 PFN_QGLDRAWELEMENTS m_pfn_qglDrawElements;
\r
194 PFN_QGLENABLE m_pfn_qglEnable;
\r
195 PFN_QGLENABLECLIENTSTATE m_pfn_qglEnableClientState;
\r
196 PFN_QGLEND m_pfn_qglEnd;
\r
197 PFN_QGLENDLIST m_pfn_qglEndList;
\r
198 PFN_QGLFOGF m_pfn_qglFogf;
\r
199 PFN_QGLFOGFV m_pfn_qglFogfv;
\r
200 PFN_QGLFOGFI m_pfn_qglFogi;
\r
201 PFN_QGLGENLISTS m_pfn_qglGenLists;
\r
202 PFN_QGLGENTEXTURES m_pfn_qglGenTextures;
\r
203 PFN_QGLGETDOUBLEV m_pfn_qglGetDoublev;
\r
204 PFN_QGLGETINTEGERV m_pfn_qglGetIntegerv;
\r
205 PFN_QGLHINT m_pfn_qglHint;
\r
206 PFN_QGLLIGHTFV m_pfn_qglLightfv;
\r
207 PFN_QGLLINESTIPPLE m_pfn_qglLineStipple;
\r
208 PFN_QGLLINEWIDTH m_pfn_qglLineWidth;
\r
209 PFN_QGLLISTBASE m_pfn_qglListBase;
\r
210 PFN_QGLLOADIDENTITY m_pfn_qglLoadIdentity;
\r
211 PFN_QGLMATERIALF m_pfn_qglMaterialf;
\r
212 PFN_QGLMATERIALFV m_pfn_qglMaterialfv;
\r
213 PFN_QGLMATRIXMODE m_pfn_qglMatrixMode;
\r
214 PFN_QGLMULTMATRIXF m_pfn_qglMultMatrixf;
\r
215 PFN_QGLNEWLIST m_pfn_qglNewList;
\r
216 PFN_QGLNORMAL3F m_pfn_qglNormal3f;
\r
217 PFN_QGLNORMAL3FV m_pfn_qglNormal3fv;
\r
218 PFN_QGLNORMALPOINTER m_pfn_qglNormalPointer;
\r
219 PFN_QGLORTHO m_pfn_qglOrtho;
\r
220 PFN_QGLPOINTSIZE m_pfn_qglPointSize;
\r
221 PFN_QGLPOLYGONMODE m_pfn_qglPolygonMode;
\r
222 PFN_QGLPOPATTRIB m_pfn_qglPopAttrib;
\r
223 PFN_QGLPOPMATRIX m_pfn_qglPopMatrix;
\r
224 PFN_QGLPUSHATTRIB m_pfn_qglPushAttrib;
\r
225 PFN_QGLPUSHMATRIX m_pfn_qglPushMatrix;
\r
226 PFN_QGLRASTERPOS3FV m_pfn_qglRasterPos3fv;
\r
227 PFN_QGLROTATED m_pfn_qglRotated;
\r
228 PFN_QGLROTATEF m_pfn_qglRotatef;
\r
229 PFN_QGLSCALEF m_pfn_qglScalef;
\r
230 PFN_QGLSCISSOR m_pfn_qglScissor;
\r
231 PFN_QGLSHADEMODEL m_pfn_qglShadeModel;
\r
232 PFN_QGLTEXCOORD2F m_pfn_qglTexCoord2f;
\r
233 PFN_QGLTEXCOORD2FV m_pfn_qglTexCoord2fv;
\r
234 PFN_QGLTEXCOORDPOINTER m_pfn_qglTexCoordPointer;
\r
235 PFN_QGLTEXENVF m_pfn_qglTexEnvf;
\r
236 PFN_QGLTEXGENF m_pfn_qglTexGenf;
\r
237 PFN_QGLTEXIMAGE1D m_pfn_qglTexImage1D;
\r
238 PFN_QGLTEXIMAGE2D m_pfn_qglTexImage2D;
\r
239 PFN_QGLTEXPARAMETERF m_pfn_qglTexParameterf;
\r
240 PFN_QGLTEXPARAMETERFV m_pfn_qglTexParameterfv;
\r
241 PFN_QGLTEXPARAMETERI m_pfn_qglTexParameteri;
\r
242 PFN_QGLTEXPARAMETERIV m_pfn_qglTexParameteriv;
\r
243 PFN_QGLTEXSUBIMAGE1D m_pfn_qglTexSubImage1D;
\r
244 PFN_QGLTEXSUBIMAGE2D m_pfn_qglTexSubImage2D;
\r
245 PFN_QGLTRANSLATED m_pfn_qglTranslated;
\r
246 PFN_QGLTRANSLATEF m_pfn_qglTranslatef;
\r
247 PFN_QGLVERTEX2F m_pfn_qglVertex2f;
\r
248 PFN_QGLVERTEX3F m_pfn_qglVertex3f;
\r
249 PFN_QGLVERTEX3FV m_pfn_qglVertex3fv;
\r
250 PFN_QGLVERTEXPOINTER m_pfn_qglVertexPointer;
\r
251 PFN_QGLVIEWPORT m_pfn_qglViewport;
\r
253 PFN_QE_CHECKOPENGLFORERRORS m_pfn_QE_CheckOpenGLForErrors;
\r
256 PFN_QGLUPERSPECTIVE m_pfn_qgluPerspective;
\r
257 PFN_QGLULOOKAT m_pfn_qgluLookAt;
\r
259 // plugin entities drawing inside Radiant windows
\r
260 PFN_QERAPP_HOOKGL2DWINDOW m_pfnHookGL2DWindow;
\r
261 PFN_QERAPP_UNHOOKGL2DWINDOW m_pfnUnHookGL2DWindow;
\r
262 PFN_QERAPP_HOOKGL3DWINDOW m_pfnHookGL3DWindow;
\r
263 PFN_QERAPP_UNHOOKGL3DWINDOW m_pfnUnHookGL3DWindow;
\r