1 
2 /*****************************************************************
3  ************** OLD GOOD QUAKE ENGINE OPENGL STYLE ***************
4  *****************************************************************/
5 
6 #include <SDL2/SDL_platform.h>
7 #include <SDL2/SDL_video.h>
8 #include <SDL2/SDL_opengl.h>
9 #include <string.h>
10 #include <stdlib.h>
11 #include <stdio.h>
12 
13 #include "gl_util.h"
14 #include "system.h"
15 
16 #define GL_LOG_FILENAME "gl_log.txt"
17 
18 
19 /* Miscellaneous */
20 PFNGLCLEARINDEXPROC                     qglClearIndex = NULL;
21 PFNGLCLEARCOLORPROC                     qglClearColor = NULL;
22 PFNGLCLEARPROC                          qglClear = NULL;
23 PFNGLINDEXMASKPROC                      qglIndexMask = NULL;
24 PFNGLCOLORMASKPROC                      qglColorMask = NULL;
25 PFNGLALPHAFUNCPROC                      qglAlphaFunc = NULL;
26 PFNGLBLENDFUNCPROC                      qglBlendFunc = NULL;
27 PFNGLLOGICOPPROC                        qglLogicOp = NULL;
28 PFNGLCULLFACEPROC                       qglCullFace = NULL;
29 PFNGLFRONTFACEPROC                      qglFrontFace = NULL;
30 PFNGLPOINTSIZEPROC                      qglPointSize = NULL;
31 PFNGLLINEWIDTHPROC                      qglLineWidth = NULL;
32 PFNGLLINESTIPPLEPROC                    qglLineStipple = NULL;
33 PFNGLPOLYGONMODEPROC                    qglPolygonMode = NULL;
34 PFNGLPOLYGONOFFSETPROC                  qglPolygonOffset = NULL;
35 PFNGLPOLYGONSTIPPLEPROC                 qglPolygonStipple = NULL;
36 PFNGLGETPOLYGONSTIPPLEPROC              qglGetPolygonStipple = NULL;
37 PFNGLEDGEFLAGPROC                       qglEdgeFlag = NULL;
38 PFNGLEDGEFLAGVPROC                      qglEdgeFlagv = NULL;
39 PFNGLSCISSORPROC                        qglScissor = NULL;
40 PFNGLCLIPPLANEPROC                      qglClipPlane = NULL;
41 PFNGLGETCLIPPLANEPROC                   qglGetClipPlane = NULL;
42 PFNGLDRAWBUFFERPROC                     qglDrawBuffer = NULL;
43 PFNGLREADBUFFERPROC                     qglReadBuffer = NULL;
44 PFNGLENABLEPROC                         qglEnable = NULL;
45 PFNGLDISABLEPROC                        qglDisable = NULL;
46 PFNGLISENABLEDPROC                      qglIsEnabled = NULL;
47 PFNGLENABLECLIENTSTATEPROC              qglEnableClientState = NULL;
48 PFNGLDISABLECLIENTSTATEPROC             qglDisableClientState = NULL;
49 PFNGLGETERRORPROC                       qglGetError = NULL;
50 PFNGLGETSTRINGPROC                      qglGetString = NULL;
51 PFNGLGETBOOLEANVPROC                    qglGetBooleanv = NULL;
52 PFNGLGETDOUBLEVPROC                     qglGetDoublev = NULL;
53 PFNGLGETFLOATVPROC                      qglGetFloatv = NULL;
54 PFNGLGETIINTEGERVPROC                   qglGetIntegerv = NULL;
55 PFNGLPUSHATTRIBPROC                     qglPushAttrib = NULL;
56 PFNGLPOPATTRIBPROC                      qglPopAttrib = NULL;
57 PFNGLPUSHCLIENTATTRIBPROC               qglPushClientAttrib = NULL;
58 PFNGLPOPCLIENTATTRIBPROC                qglPopClientAttrib = NULL;
59 PFNGLRENDERMODEPROC                     qglRenderMode = NULL;
60 PFNGLFINISHPROC                         qglFinish = NULL;
61 PFNGLFLUSHPROC                          qglFlush = NULL;
62 PFNGLHINTPROC                           qglHint = NULL;
63 
64 /* Depth Buffer */
65 PFNGLCLEARDEPTHPROC                     qglClearDepth = NULL;
66 PFNGLDEPTHFUNCPROC                      qglDepthFunc = NULL;
67 PFNGLDEPTHMASKPROC                      qglDepthMask = NULL;
68 PFNGLDEPTHRANGEPROC                     qglDepthRange = NULL;
69 
70 /* Accumulation Buffer */
71 PFNGLCLEARACCUMPROC                     qglClearAccum = NULL;
72 PFNGLACCUMPROC                          qglAccum = NULL;
73 
74 /* Transformation */
75 PFNGLMATRIXMODEPROC                     qglMatrixMode = NULL;
76 PFNGLORTHOPROC                          qglOrtho = NULL;
77 PFNGLFRUSTUMPROC                        qglFrustum = NULL;
78 PFNGLVIEWPORTPROC                       qglViewport = NULL;
79 PFNGLPUSHMATRIXPROC                     qglPushMatrix = NULL;
80 PFNGLPOPMATRIXPROC                      qglPopMatrix = NULL;
81 PFNGLLOADIDENTITYPROC                   qglLoadIdentity = NULL;
82 PFNGLLOADMATRIXDPROC                    qglLoadMatrixd = NULL;
83 PFNGLLOADMATRIXFPROC                    qglLoadMatrixf = NULL;
84 PFNGLMULTMATRIXDPROC                    qglMultMatrixd = NULL;
85 PFNGLMULTMATRIXFPROC                    qglMultMatrixf = NULL;
86 PFNGLROTATEDPROC                        qglRotated = NULL;
87 PFNGLROTATEFPROC                        qglRotatef = NULL;
88 PFNGLSCALEDPROC                         qglScaled = NULL;
89 PFNGLSCALEFPROC                         qglScalef = NULL;
90 PFNGLTRANSLATEDPROC                     qglTranslated = NULL;
91 PFNGLTRANSLATEFPROC                     qglTranslatef = NULL;
92 
93 /* Raster functions */
94 PFNGLPIXELZOOMPROC                      qglPixelZoom = NULL;
95 PFNGLPIXELSTOREFPROC                    qglPixelStoref = NULL;
96 PFNGLPIXELSTOREIPROC                    qglPixelStorei = NULL;
97 PFNGLPIXELTRANSFERFPROC                 qglPixelTransferf = NULL;
98 PFNGLPIXELTRANSFERIPROC                 qglPixelTransferi = NULL;
99 PFNGLPIXELMAPFVPROC                     qglPixelMapfv = NULL;
100 PFNGLPIXELMAPUIVPROC                    qglPixelMapuiv = NULL;
101 PFNGLPIXELMAPUSVPROC                    qglPixelMapusv = NULL;
102 PFNGLGETPIXELMAPFVPROC                  qglGetPixelMapfv = NULL;
103 PFNGLGETPIXELMAPUIVPROC                 qglGetPixelMapuiv = NULL;
104 PFNGLGETPIXELMAPUSVPROC                 qglGetPixelMapusv = NULL;
105 PFNGLBITMAPPROC                         qglBitmap = NULL;
106 PFNGLREADPIXELSPROC                     qglReadPixels = NULL;
107 PFNGLDRAWPIXELSPROC                     qglDrawPixels = NULL;
108 PFNGLCOPYPIXELSPROC                     qglCopyPixels = NULL;
109 
110 /* Stenciling */
111 PFNGLSTENCILFUNCPROC                    qglStencilFunc = NULL;
112 PFNGLSTENCILMASKPROC                    qglStencilMask = NULL;
113 PFNGLSTENCILOPPROC                      qglStencilOp = NULL;
114 PFNGLCLEARSTENCILPROC                   qglClearStencil = NULL;
115 
116 /* Texture mapping */
117 PFNGLTEXGENDPROC                        qglTexGend = NULL;
118 PFNGLTEXGENFPROC                        qglTexGenf = NULL;
119 PFNGLTEXGENIPROC                        qglTexGeni = NULL;
120 PFNGLTEXGENDVPROC                       qglTexGendv = NULL;
121 PFNGLTEXGENFVPROC                       qglTexGenfv = NULL;
122 PFNGLTEXGENIVPROC                       qglTexGeniv = NULL;
123 PFNGLGETTEXGENDVPROC                    qglGetTexGendv = NULL;
124 PFNGLGETTEXGENFVPROC                    qglGetTexGenfv = NULL;
125 PFNGLGETTEXGENIVPROC                    qglGetTexGeniv = NULL;
126 PFNGLTEXENVFPROC                        qglTexEnvf = NULL;
127 PFNGLTEXENVIPROC                        qglTexEnvi = NULL;
128 PFNGLTEXENVFVPROC                       qglTexEnvfv = NULL;
129 PFNGLTEXENVIVPROC                       qglTexEnviv = NULL;
130 PFNGLGETTEXENVFVPROC                    qglGetTexEnvfv = NULL;
131 PFNGLGETTEXENVIVPROC                    qglGetTexEnviv = NULL;
132 PFNGLTEXPARAMETERFPROC                  qglTexParameterf = NULL;
133 PFNGLTEXPARAMETERIPROC                  qglTexParameteri = NULL;
134 PFNGLTEXPARAMETERFVPROC                 qglTexParameterfv = NULL;
135 PFNGLTEXPARAMETERIVPROC                 qglTexParameteriv = NULL;
136 PFNGLGETTEXPARAMETERFVPROC              qglGetTexParameterfv = NULL;
137 PFNGLGETTEXPARAMETERIVPROC              qglGetTexParameteriv = NULL;
138 PFNGLGETTEXLEVELPARAMETERFVPROC         qglGetTexLevelParameterfv = NULL;
139 PFNGLGETTEXLEVELPARAMETERIVPROC         qglGetTexLevelParameteriv = NULL;
140 PFNGLTEXIMAGE1DPROC                     qglTexImage1D = NULL;
141 PFNGLTEXIMAGE2DPROC                     qglTexImage2D = NULL;
142 PFNGLGETTEXIMAGEPROC                    qglGetTexImage = NULL;
143 
144 /* 1.1 functions */
145 /* texture objects */
146 PFNGLGENTEXTURESPROC                    qglGenTextures = NULL;
147 PFNGLDELETETEXTURESPROC                 qglDeleteTextures = NULL;
148 PFNGLBINDTEXTUREPROC                    qglBindTexture = NULL;
149 PFNGLPRIORITIZETEXTURESPROC             qglPrioritizeTextures = NULL;
150 PFNGLARETEXTURESRESIDENTPROC            qglAreTexturesResident = NULL;
151 PFNGLISTEXTUREPROC                      qglIsTexture = NULL;
152 /* texture mapping */
153 PFNGLTEXSUBIMAGE1DPROC                  qglTexSubImage1D = NULL;
154 PFNGLTEXSUBIMAGE2DPROC                  qglTexSubImage2D = NULL;
155 PFNGLCOPYTEXIMAGE1DPROC                 qglCopyTexImage1D = NULL;
156 PFNGLCOPYTEXIMAGE2DPROC                 qglCopyTexImage2D = NULL;
157 PFNGLCOPYTEXSUBIMAGE1DPROC              qglCopyTexSubImage1D = NULL;
158 PFNGLCOPYTEXSUBIMAGE2DPROC              qglCopyTexSubImage2D = NULL;
159 /* vertex arrays */
160 PFNGLVERTEXPOINTERPROC                  qglVertexPointer = NULL;
161 PFNGLNORMALPOINTERPROC                  qglNormalPointer = NULL;
162 PFNGLCOLORPOINTERPROC                   qglColorPointer = NULL;
163 PFNGLINDEXPOINTERPROC                   qglIndexPointer = NULL;
164 PFNGLTEXCOORDPOINTERPROC                qglTexCoordPointer = NULL;
165 PFNGLEDGEFLAGPOINTERPROC                qglEdgeFlagPointer = NULL;
166 PFNGLGETPOINTERVPROC                    qglGetPointerv = NULL;
167 PFNGLARRAYELEMENTPROC                   qglArrayElement = NULL;
168 PFNGLDRAWARRAYSPROC                     qglDrawArrays = NULL;
169 PFNGLDRAWELEMENTSPROC                   qglDrawElements = NULL;
170 PFNGLINTERLEAVEDARRAYSPROC              qglInterleavedArrays = NULL;
171 
172 /*ARB*/
173 PFNGLDELETEOBJECTARBPROC                qglDeleteObjectARB = NULL;
174 PFNGLGETHANDLEARBPROC                   qglGetHandleARB = NULL;
175 PFNGLDETACHOBJECTARBPROC                qglDetachObjectARB = NULL;
176 PFNGLCREATESHADEROBJECTARBPROC          qglCreateShaderObjectARB = NULL;
177 PFNGLSHADERSOURCEARBPROC                qglShaderSourceARB = NULL;
178 PFNGLCOMPILESHADERARBPROC               qglCompileShaderARB = NULL;
179 PFNGLCREATEPROGRAMOBJECTARBPROC         qglCreateProgramObjectARB = NULL;
180 PFNGLATTACHOBJECTARBPROC                qglAttachObjectARB = NULL;
181 PFNGLLINKPROGRAMARBPROC                 qglLinkProgramARB = NULL;
182 PFNGLUSEPROGRAMOBJECTARBPROC            qglUseProgramObjectARB = NULL;
183 PFNGLVALIDATEPROGRAMARBPROC             qglValidateProgramARB = NULL;
184 PFNGLUNIFORM1FARBPROC                   qglUniform1fARB = NULL;
185 PFNGLUNIFORM2FARBPROC                   qglUniform2fARB = NULL;
186 PFNGLUNIFORM3FARBPROC                   qglUniform3fARB = NULL;
187 PFNGLUNIFORM4FARBPROC                   qglUniform4fARB = NULL;
188 PFNGLUNIFORM1IARBPROC                   qglUniform1iARB = NULL;
189 PFNGLUNIFORM2IARBPROC                   qglUniform2iARB = NULL;
190 PFNGLUNIFORM3IARBPROC                   qglUniform3iARB = NULL;
191 PFNGLUNIFORM4IARBPROC                   qglUniform4iARB = NULL;
192 PFNGLUNIFORM1FVARBPROC                  qglUniform1fvARB = NULL;
193 PFNGLUNIFORM2FVARBPROC                  qglUniform2fvARB = NULL;
194 PFNGLUNIFORM3FVARBPROC                  qglUniform3fvARB = NULL;
195 PFNGLUNIFORM4FVARBPROC                  qglUniform4fvARB = NULL;
196 PFNGLUNIFORM1IVARBPROC                  qglUniform1ivARB = NULL;
197 PFNGLUNIFORM2IVARBPROC                  qglUniform2ivARB = NULL;
198 PFNGLUNIFORM3IVARBPROC                  qglUniform3ivARB = NULL;
199 PFNGLUNIFORM4IVARBPROC                  qglUniform4ivARB = NULL;
200 PFNGLUNIFORMMATRIX2FVARBPROC            qglUniformMatrix2fvARB = NULL;
201 PFNGLUNIFORMMATRIX3FVARBPROC            qglUniformMatrix3fvARB = NULL;
202 PFNGLUNIFORMMATRIX4FVARBPROC            qglUniformMatrix4fvARB = NULL;
203 PFNGLGETOBJECTPARAMETERFVARBPROC        qglGetObjectParameterfvARB = NULL;
204 PFNGLGETOBJECTPARAMETERIVARBPROC        qglGetObjectParameterivARB = NULL;
205 PFNGLGETINFOLOGARBPROC                  qglGetInfoLogARB = NULL;
206 PFNGLGETATTACHEDOBJECTSARBPROC          qglGetAttachedObjectsARB = NULL;
207 PFNGLGETUNIFORMLOCATIONARBPROC          qglGetUniformLocationARB = NULL;
208 PFNGLGETACTIVEUNIFORMARBPROC            qglGetActiveUniformARB = NULL;
209 PFNGLGETUNIFORMFVARBPROC                qglGetUniformfvARB = NULL;
210 PFNGLGETUNIFORMIVARBPROC                qglGetUniformivARB = NULL;
211 PFNGLGETSHADERSOURCEARBPROC             qglGetShaderSourceARB = NULL;
212 
213 PFNGLBINDATTRIBLOCATIONARBPROC          qglBindAttribLocationARB = NULL;
214 PFNGLGETACTIVEATTRIBARBPROC             qglGetActiveAttribARB = NULL;
215 PFNGLGETATTRIBLOCATIONARBPROC           qglGetAttribLocationARB = NULL;
216 PFNGLENABLEVERTEXATTRIBARRAYARBPROC     qglEnableVertexAttribArrayARB = NULL;
217 PFNGLENABLEVERTEXATTRIBARRAYARBPROC     qglDisableVertexAttribArrayARB = NULL;
218 PFNGLVERTEXATTRIBPOINTERARBPROC         qglVertexAttribPointerARB = NULL;
219 
220 PFNGLACTIVETEXTUREARBPROC               qglActiveTextureARB = NULL;
221 PFNGLCLIENTACTIVETEXTUREARBPROC         qglClientActiveTextureARB = NULL;
222 PFNGLMULTITEXCOORD1DARBPROC             qglMultiTexCoord1dARB = NULL;
223 PFNGLMULTITEXCOORD1DVARBPROC            qglMultiTexCoord1dvARB = NULL;
224 PFNGLMULTITEXCOORD1FARBPROC             qglMultiTexCoord1fARB = NULL;
225 PFNGLMULTITEXCOORD1FVARBPROC            qglMultiTexCoord1fvARB = NULL;
226 PFNGLMULTITEXCOORD1IARBPROC             qglMultiTexCoord1iARB = NULL;
227 PFNGLMULTITEXCOORD1IVARBPROC            qglMultiTexCoord1ivARB = NULL;
228 PFNGLMULTITEXCOORD1SARBPROC             qglMultiTexCoord1sARB = NULL;
229 PFNGLMULTITEXCOORD1SVARBPROC            qglMultiTexCoord1svARB = NULL;
230 PFNGLMULTITEXCOORD2DARBPROC             qglMultiTexCoord2dARB = NULL;
231 PFNGLMULTITEXCOORD2DVARBPROC            qglMultiTexCoord2dvARB = NULL;
232 PFNGLMULTITEXCOORD2FARBPROC             qglMultiTexCoord2fARB = NULL;
233 PFNGLMULTITEXCOORD2FVARBPROC            qglMultiTexCoord2fvARB = NULL;
234 PFNGLMULTITEXCOORD2IARBPROC             qglMultiTexCoord2iARB = NULL;
235 PFNGLMULTITEXCOORD2IVARBPROC            qglMultiTexCoord2ivARB = NULL;
236 PFNGLMULTITEXCOORD2SARBPROC             qglMultiTexCoord2sARB = NULL;
237 PFNGLMULTITEXCOORD2SVARBPROC            qglMultiTexCoord2svARB = NULL;
238 PFNGLMULTITEXCOORD3DARBPROC             qglMultiTexCoord3dARB = NULL;
239 PFNGLMULTITEXCOORD3DVARBPROC            qglMultiTexCoord3dvARB = NULL;
240 PFNGLMULTITEXCOORD3FARBPROC             qglMultiTexCoord3fARB = NULL;
241 PFNGLMULTITEXCOORD3FVARBPROC            qglMultiTexCoord3fvARB = NULL;
242 PFNGLMULTITEXCOORD3IARBPROC             qglMultiTexCoord3iARB = NULL;
243 PFNGLMULTITEXCOORD3IVARBPROC            qglMultiTexCoord3ivARB = NULL;
244 PFNGLMULTITEXCOORD3SARBPROC             qglMultiTexCoord3sARB = NULL;
245 PFNGLMULTITEXCOORD3SVARBPROC            qglMultiTexCoord3svARB = NULL;
246 PFNGLMULTITEXCOORD4DARBPROC             qglMultiTexCoord4dARB = NULL;
247 PFNGLMULTITEXCOORD4DVARBPROC            qglMultiTexCoord4dvARB = NULL;
248 PFNGLMULTITEXCOORD4FARBPROC             qglMultiTexCoord4fARB = NULL;
249 PFNGLMULTITEXCOORD4FVARBPROC            qglMultiTexCoord4fvARB = NULL;
250 PFNGLMULTITEXCOORD4IARBPROC             qglMultiTexCoord4iARB = NULL;
251 PFNGLMULTITEXCOORD4IVARBPROC            qglMultiTexCoord4ivARB = NULL;
252 PFNGLMULTITEXCOORD4SARBPROC             qglMultiTexCoord4sARB = NULL;
253 PFNGLMULTITEXCOORD4SVARBPROC            qglMultiTexCoord4svARB = NULL;
254 
255 PFNGLBINDBUFFERARBPROC                  qglBindBufferARB = NULL;
256 PFNGLDELETEBUFFERSARBPROC               qglDeleteBuffersARB = NULL;
257 PFNGLGENBUFFERSARBPROC                  qglGenBuffersARB = NULL;
258 PFNGLISBUFFERARBPROC                    qglIsBufferARB = NULL;
259 PFNGLBUFFERDATAARBPROC                  qglBufferDataARB = NULL;
260 PFNGLBUFFERSUBDATAARBPROC               qglBufferSubDataARB = NULL;
261 PFNGLGETBUFFERSUBDATAARBPROC            qglGetBufferSubDataARB = NULL;
262 PFNGLMAPBUFFERARBPROC                   qglMapBufferARB = NULL;
263 PFNGLUNMAPBUFFERARBPROC                 qglUnmapBufferARB = NULL;
264 PFNGLGETBUFFERPARAMETERIVARBPROC        qglGetBufferParameterivARB = NULL;
265 PFNGLGETBUFFERPOINTERVARBPROC           qglGetBufferPointervARB = NULL;
266 
267 PFNGLBINDVERTEXARRAYPROC                qglBindVertexArray = NULL;
268 PFNGLDELETEVERTEXARRAYSPROC             qglDeleteVertexArrays = NULL;
269 PFNGLGENVERTEXARRAYSPROC                qglGenVertexArrays = NULL;
270 PFNGLISVERTEXARRAYPROC                  qglIsVertexArray = NULL;
271 
272 PFNGLGENERATEMIPMAPEXTPROC              qglGenerateMipmap = NULL;
273 
274 static char *engine_gl_ext_str = NULL;
275 static GLuint whiteTexture = 0;
276 
FillGLExtensionsStringBuffer()277 static void FillGLExtensionsStringBuffer()
278 {
279     const char *buf = (const char*)qglGetString(GL_EXTENSIONS);
280     if(buf)
281     {
282         size_t buf_size = strlen(buf) + 1;
283         engine_gl_ext_str = (char*)malloc(buf_size);
284         strncpy(engine_gl_ext_str, buf, buf_size);
285     }
286 }
287 
288 /**
289  * Get addresses of GL functions and initialise engine_gl_ext_str string.
290  */
InitGLExtFuncs()291 void InitGLExtFuncs()
292 {
293     // white texture data for coloured polygons and debug lines.
294     const GLubyte whtx[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
295                             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
296                             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
297                             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
298 
299     /* Miscellaneous */
300     qglClearIndex = (PFNGLCLEARINDEXPROC)SDL_GL_GetProcAddress("glClearIndex");
301     qglClearColor = (PFNGLCLEARCOLORPROC)SDL_GL_GetProcAddress("glClearColor");
302     qglClear = (PFNGLCLEARPROC)SDL_GL_GetProcAddress("glClear");
303     qglIndexMask = (PFNGLINDEXMASKPROC)SDL_GL_GetProcAddress("glIndexMask");
304     qglColorMask = (PFNGLCOLORMASKPROC)SDL_GL_GetProcAddress("glColorMask");
305     qglAlphaFunc = (PFNGLALPHAFUNCPROC)SDL_GL_GetProcAddress("glAlphaFunc");
306     qglBlendFunc = (PFNGLBLENDFUNCPROC)SDL_GL_GetProcAddress("glBlendFunc");
307     qglLogicOp = (PFNGLLOGICOPPROC)SDL_GL_GetProcAddress("glLogicOp");
308     qglCullFace = (PFNGLCULLFACEPROC)SDL_GL_GetProcAddress("glCullFace");
309     qglFrontFace = (PFNGLFRONTFACEPROC)SDL_GL_GetProcAddress("glFrontFace");
310     qglPushAttrib = (PFNGLPUSHATTRIBPROC)SDL_GL_GetProcAddress("glPushAttrib");
311     qglPointSize = (PFNGLPOINTSIZEPROC)SDL_GL_GetProcAddress("glPointSize");
312     qglLineWidth = (PFNGLLINEWIDTHPROC)SDL_GL_GetProcAddress("glLineWidth");
313     qglLineStipple = (PFNGLLINESTIPPLEPROC)SDL_GL_GetProcAddress("glLineStipple");
314     qglPolygonMode = (PFNGLPOLYGONMODEPROC)SDL_GL_GetProcAddress("glPolygonMode");
315     qglPolygonOffset = (PFNGLPOLYGONOFFSETPROC)SDL_GL_GetProcAddress("glPolygonOffset");
316     qglPolygonStipple = (PFNGLPOLYGONSTIPPLEPROC)SDL_GL_GetProcAddress("glPolygonStipple");
317     qglGetPolygonStipple = (PFNGLGETPOLYGONSTIPPLEPROC)SDL_GL_GetProcAddress("glGetPolygonStipple");
318     qglEdgeFlag = (PFNGLEDGEFLAGPROC)SDL_GL_GetProcAddress("glEdgeFlag");
319     qglEdgeFlagv = (PFNGLEDGEFLAGVPROC)SDL_GL_GetProcAddress("glEdgeFlagv");
320     qglScissor = (PFNGLSCISSORPROC)SDL_GL_GetProcAddress("glScissor");
321     qglClipPlane = (PFNGLCLIPPLANEPROC)SDL_GL_GetProcAddress("glClipPlane");
322     qglGetClipPlane = (PFNGLGETCLIPPLANEPROC)SDL_GL_GetProcAddress("glGetClipPlane");
323     qglDrawBuffer = (PFNGLDRAWBUFFERPROC)SDL_GL_GetProcAddress("glDrawBuffer");
324     qglReadBuffer = (PFNGLREADBUFFERPROC)SDL_GL_GetProcAddress("glReadBuffer");
325     qglEnable = (PFNGLENABLEPROC)SDL_GL_GetProcAddress("glEnable");
326     qglDisable = (PFNGLDISABLEPROC)SDL_GL_GetProcAddress("glDisable");
327     qglIsEnabled = (PFNGLISENABLEDPROC)SDL_GL_GetProcAddress("glIsEnabled");
328     qglEnableClientState = (PFNGLENABLECLIENTSTATEPROC)SDL_GL_GetProcAddress("glEnableClientState");
329     qglDisableClientState = (PFNGLDISABLECLIENTSTATEPROC)SDL_GL_GetProcAddress("glDisableClientState");
330     qglGetError = (PFNGLGETERRORPROC)SDL_GL_GetProcAddress("glGetError");
331     qglGetString = (PFNGLGETSTRINGPROC)SDL_GL_GetProcAddress("glGetString");
332     qglGetBooleanv = (PFNGLGETBOOLEANVPROC)SDL_GL_GetProcAddress("glGetBooleanv");
333     qglGetDoublev = (PFNGLGETDOUBLEVPROC)SDL_GL_GetProcAddress("glGetDoublev");
334     qglGetFloatv = (PFNGLGETFLOATVPROC)SDL_GL_GetProcAddress("glGetFloatv");
335     qglGetIntegerv = (PFNGLGETIINTEGERVPROC)SDL_GL_GetProcAddress("glGetIntegerv");
336     qglPushAttrib = (PFNGLPUSHATTRIBPROC)SDL_GL_GetProcAddress("glPushAttrib");
337     qglPopAttrib = (PFNGLPOPATTRIBPROC)SDL_GL_GetProcAddress("glPopAttrib");
338     qglPushClientAttrib = (PFNGLPUSHCLIENTATTRIBPROC)SDL_GL_GetProcAddress("glPushClientAttrib");  /* 1.1 */
339     qglPopClientAttrib = (PFNGLPOPCLIENTATTRIBPROC)SDL_GL_GetProcAddress("glPopClientAttrib");  /* 1.1 */
340     qglRenderMode = (PFNGLRENDERMODEPROC)SDL_GL_GetProcAddress("glRenderMode");
341     qglFinish = (PFNGLFINISHPROC)SDL_GL_GetProcAddress("glFinish");
342     qglFlush = (PFNGLFLUSHPROC)SDL_GL_GetProcAddress("glFlush");
343     qglHint = (PFNGLHINTPROC)SDL_GL_GetProcAddress("glHint");
344 
345     /* Depth Buffer */
346     qglClearDepth = (PFNGLCLEARDEPTHPROC)SDL_GL_GetProcAddress("glClearDepth");
347     qglDepthFunc = (PFNGLDEPTHFUNCPROC)SDL_GL_GetProcAddress("glDepthFunc");
348     qglDepthMask = (PFNGLDEPTHMASKPROC)SDL_GL_GetProcAddress("glDepthMask");
349     qglDepthRange = (PFNGLDEPTHRANGEPROC)SDL_GL_GetProcAddress("glDepthRange");
350 
351     /* Accumulation Buffer */
352     qglClearAccum = (PFNGLCLEARACCUMPROC)SDL_GL_GetProcAddress("glClearAccum");
353     qglAccum = (PFNGLACCUMPROC)SDL_GL_GetProcAddress("glAccum");
354 
355     /* Transformation */
356     qglMatrixMode = (PFNGLMATRIXMODEPROC)SDL_GL_GetProcAddress("glMatrixMode");
357     qglOrtho = (PFNGLORTHOPROC)SDL_GL_GetProcAddress("glOrtho");
358     qglFrustum = (PFNGLFRUSTUMPROC)SDL_GL_GetProcAddress("glFrustum");
359     qglViewport = (PFNGLVIEWPORTPROC)SDL_GL_GetProcAddress("glViewport");
360     qglPushMatrix = (PFNGLPUSHMATRIXPROC)SDL_GL_GetProcAddress("glPushMatrix");
361     qglPopMatrix = (PFNGLPOPMATRIXPROC)SDL_GL_GetProcAddress("glPopMatrix");
362     qglLoadIdentity = (PFNGLLOADIDENTITYPROC)SDL_GL_GetProcAddress("glLoadIdentity");
363     qglLoadMatrixd = (PFNGLLOADMATRIXDPROC)SDL_GL_GetProcAddress("glLoadMatrixd");
364     qglLoadMatrixf = (PFNGLLOADMATRIXFPROC)SDL_GL_GetProcAddress("glLoadMatrixf");
365     qglMultMatrixd = (PFNGLMULTMATRIXDPROC)SDL_GL_GetProcAddress("glMultMatrixd");
366     qglMultMatrixf = (PFNGLMULTMATRIXFPROC)SDL_GL_GetProcAddress("glMultMatrixf");
367     qglRotated = (PFNGLROTATEDPROC)SDL_GL_GetProcAddress("glRotated");
368     qglRotatef = (PFNGLROTATEFPROC)SDL_GL_GetProcAddress("glRotatef");
369     qglScaled = (PFNGLSCALEDPROC)SDL_GL_GetProcAddress("glScaled");
370     qglScalef = (PFNGLSCALEFPROC)SDL_GL_GetProcAddress("glScalef");
371     qglTranslated = (PFNGLTRANSLATEDPROC)SDL_GL_GetProcAddress("glTranslated");
372     qglTranslatef = (PFNGLTRANSLATEFPROC)SDL_GL_GetProcAddress("glTranslatef");
373 
374     /* Raster functions */
375     qglPixelZoom = (PFNGLPIXELZOOMPROC)SDL_GL_GetProcAddress("glPixelZoom");
376     qglPixelStoref = (PFNGLPIXELSTOREFPROC)SDL_GL_GetProcAddress("glPixelStoref");
377     qglPixelStorei = (PFNGLPIXELSTOREIPROC)SDL_GL_GetProcAddress("glPixelStorei");
378     qglPixelTransferf = (PFNGLPIXELTRANSFERFPROC)SDL_GL_GetProcAddress("glPixelTransferf");
379     qglPixelTransferi = (PFNGLPIXELTRANSFERIPROC)SDL_GL_GetProcAddress("glPixelTransferi");
380     qglPixelMapfv = (PFNGLPIXELMAPFVPROC)SDL_GL_GetProcAddress("glPixelMapfv");
381     qglPixelMapuiv = (PFNGLPIXELMAPUIVPROC)SDL_GL_GetProcAddress("glPixelMapuiv");
382     qglPixelMapusv = (PFNGLPIXELMAPUSVPROC)SDL_GL_GetProcAddress("glPixelMapusv");
383     qglGetPixelMapfv = (PFNGLGETPIXELMAPFVPROC)SDL_GL_GetProcAddress("glGetPixelMapfv");
384     qglGetPixelMapuiv = (PFNGLGETPIXELMAPUIVPROC)SDL_GL_GetProcAddress("glGetPixelMapuiv");
385     qglGetPixelMapusv = (PFNGLGETPIXELMAPUSVPROC)SDL_GL_GetProcAddress("glGetPixelMapusv");
386     qglBitmap = (PFNGLBITMAPPROC)SDL_GL_GetProcAddress("glBitmap");
387     qglReadPixels = (PFNGLREADPIXELSPROC)SDL_GL_GetProcAddress("glReadPixels");
388     qglDrawPixels = (PFNGLDRAWPIXELSPROC)SDL_GL_GetProcAddress("glDrawPixels");
389     qglCopyPixels = (PFNGLCOPYPIXELSPROC)SDL_GL_GetProcAddress("glCopyPixels");
390 
391     /* Stenciling */
392     qglStencilFunc = (PFNGLSTENCILFUNCPROC)SDL_GL_GetProcAddress("glStencilFunc");
393     qglStencilMask = (PFNGLSTENCILMASKPROC)SDL_GL_GetProcAddress("glStencilMask");
394     qglStencilOp = (PFNGLSTENCILOPPROC)SDL_GL_GetProcAddress("glStencilOp");
395     qglClearStencil = (PFNGLCLEARSTENCILPROC)SDL_GL_GetProcAddress("glClearStencil");
396 
397     /* Texture mapping */
398     qglTexGend = (PFNGLTEXGENDPROC)SDL_GL_GetProcAddress("glTexGend");
399     qglTexGenf = (PFNGLTEXGENFPROC)SDL_GL_GetProcAddress("glTexGenf");
400     qglTexGeni = (PFNGLTEXGENIPROC)SDL_GL_GetProcAddress("glTexGeni");
401     qglTexGendv = (PFNGLTEXGENDVPROC)SDL_GL_GetProcAddress("glTexGendv");
402     qglTexGenfv = (PFNGLTEXGENFVPROC)SDL_GL_GetProcAddress("glTexGenfv");
403     qglTexGeniv = (PFNGLTEXGENIVPROC)SDL_GL_GetProcAddress("glTexGeniv");
404     qglGetTexGendv = (PFNGLGETTEXGENDVPROC)SDL_GL_GetProcAddress("glGetTexGendv");
405     qglGetTexGenfv = (PFNGLGETTEXGENFVPROC)SDL_GL_GetProcAddress("glGetTexGenfv");
406     qglGetTexGeniv = (PFNGLGETTEXGENIVPROC)SDL_GL_GetProcAddress("glGetTexGeniv");
407     qglTexEnvf = (PFNGLTEXENVFPROC)SDL_GL_GetProcAddress("glTexEnvf");
408     qglTexEnvi = (PFNGLTEXENVIPROC)SDL_GL_GetProcAddress("glTexEnvi");
409     qglTexEnvfv = (PFNGLTEXENVFVPROC)SDL_GL_GetProcAddress("glTexEnvfv");
410     qglTexEnviv = (PFNGLTEXENVIVPROC)SDL_GL_GetProcAddress("glTexEnviv");
411     qglGetTexEnvfv = (PFNGLGETTEXENVFVPROC)SDL_GL_GetProcAddress("glGetTexEnvfv");
412     qglGetTexEnviv = (PFNGLGETTEXENVIVPROC)SDL_GL_GetProcAddress("glGetTexEnviv");
413     qglTexParameterf = (PFNGLTEXPARAMETERFPROC)SDL_GL_GetProcAddress("glTexParameterf");
414     qglTexParameteri = (PFNGLTEXPARAMETERIPROC)SDL_GL_GetProcAddress("glTexParameteri");
415     qglTexParameterfv = (PFNGLTEXPARAMETERFVPROC)SDL_GL_GetProcAddress("glTexParameterfv");
416     qglTexParameteriv = (PFNGLTEXPARAMETERIVPROC)SDL_GL_GetProcAddress("glTexParameteriv");
417     qglGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC)SDL_GL_GetProcAddress("glGetTexParameterfv");
418     qglGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC)SDL_GL_GetProcAddress("glGetTexParameteriv");
419     qglGetTexLevelParameterfv = (PFNGLGETTEXLEVELPARAMETERFVPROC)SDL_GL_GetProcAddress("glGetTexLevelParameterfv");
420     qglGetTexLevelParameteriv = (PFNGLGETTEXLEVELPARAMETERIVPROC)SDL_GL_GetProcAddress("glGetTexLevelParameteriv");
421     qglTexImage1D = (PFNGLTEXIMAGE1DPROC)SDL_GL_GetProcAddress("glTexImage1D");
422     qglTexImage2D = (PFNGLTEXIMAGE2DPROC)SDL_GL_GetProcAddress("glTexImage2D");
423     qglGetTexImage = (PFNGLGETTEXIMAGEPROC)SDL_GL_GetProcAddress("glGetTexImage");
424 
425     /* 1.1 functions */
426     /* texture objects */
427     qglGenTextures = (PFNGLGENTEXTURESPROC)SDL_GL_GetProcAddress("glGenTextures");
428     qglDeleteTextures = (PFNGLDELETETEXTURESPROC)SDL_GL_GetProcAddress("glDeleteTextures");
429     qglBindTexture = (PFNGLBINDTEXTUREPROC)SDL_GL_GetProcAddress("glBindTexture");
430     qglPrioritizeTextures = (PFNGLPRIORITIZETEXTURESPROC)SDL_GL_GetProcAddress("glPrioritizeTextures");
431     qglAreTexturesResident = (PFNGLARETEXTURESRESIDENTPROC)SDL_GL_GetProcAddress("glAreTexturesResident");
432     qglIsTexture = (PFNGLISTEXTUREPROC)SDL_GL_GetProcAddress("glIsTexture");
433     /* texture mapping */
434     qglTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC)SDL_GL_GetProcAddress("glTexSubImage1D");
435     qglTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC)SDL_GL_GetProcAddress("glTexSubImage2D");
436     qglCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC)SDL_GL_GetProcAddress("glCopyTexImage1D");
437     qglCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC)SDL_GL_GetProcAddress("glCopyTexImage2D");
438     qglCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC)SDL_GL_GetProcAddress("glCopyTexSubImage1D");
439     qglCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC)SDL_GL_GetProcAddress("glCopyTexSubImage2D");
440     /* vertex arrays */
441     qglVertexPointer = (PFNGLVERTEXPOINTERPROC)SDL_GL_GetProcAddress("glVertexPointer");
442     qglNormalPointer = (PFNGLNORMALPOINTERPROC)SDL_GL_GetProcAddress("glNormalPointer");
443     qglColorPointer = (PFNGLCOLORPOINTERPROC)SDL_GL_GetProcAddress("glColorPointer");
444     qglIndexPointer = (PFNGLINDEXPOINTERPROC)SDL_GL_GetProcAddress("glIndexPointer");
445     qglTexCoordPointer = (PFNGLTEXCOORDPOINTERPROC)SDL_GL_GetProcAddress("glTexCoordPointer");
446     qglEdgeFlagPointer = (PFNGLEDGEFLAGPOINTERPROC)SDL_GL_GetProcAddress("glEdgeFlagPointer");
447     qglGetPointerv = (PFNGLGETPOINTERVPROC)SDL_GL_GetProcAddress("glGetPointerv");
448     qglArrayElement = (PFNGLARRAYELEMENTPROC)SDL_GL_GetProcAddress("glArrayElement");
449     qglDrawArrays = (PFNGLDRAWARRAYSPROC)SDL_GL_GetProcAddress("glDrawArrays");
450     qglDrawElements = (PFNGLDRAWELEMENTSPROC)SDL_GL_GetProcAddress("glDrawElements");
451     qglInterleavedArrays = (PFNGLINTERLEAVEDARRAYSPROC)SDL_GL_GetProcAddress("glInterleavedArrays");
452 
453     FillGLExtensionsStringBuffer();
454 
455     qglGenTextures(1, &whiteTexture);
456     qglBindTexture(GL_TEXTURE_2D, whiteTexture);
457     qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
458     qglTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, whtx);
459     qglTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, whtx);
460     qglTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, whtx);
461     qglBindTexture(GL_TEXTURE_2D, 0);
462 
463     /// VBO funcs
464     if(IsGLExtensionSupported("GL_ARB_vertex_buffer_object"))
465     {
466         qglBindBufferARB = (PFNGLBINDBUFFERARBPROC)SDL_GL_GetProcAddress("glBindBufferARB");
467         qglDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)SDL_GL_GetProcAddress("glDeleteBuffersARB");
468         qglGenBuffersARB = (PFNGLGENBUFFERSARBPROC)SDL_GL_GetProcAddress("glGenBuffersARB");
469         qglIsBufferARB = (PFNGLISBUFFERARBPROC)SDL_GL_GetProcAddress("glIsBufferARB");
470         qglBufferDataARB = (PFNGLBUFFERDATAARBPROC)SDL_GL_GetProcAddress("glBufferDataARB");
471         qglBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC)SDL_GL_GetProcAddress("glBufferSubDataARB");
472         qglGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC)SDL_GL_GetProcAddress("glGetBufferSubDataARB");
473         qglMapBufferARB = (PFNGLMAPBUFFERARBPROC)SDL_GL_GetProcAddress("glMapBufferARB");
474         qglUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)SDL_GL_GetProcAddress("glUnmapBufferARB");
475         qglGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC)SDL_GL_GetProcAddress("glGetBufferParameterivARB");
476         qglGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC)SDL_GL_GetProcAddress("glGetBufferPointervARB");
477 
478         qglActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)SDL_GL_GetProcAddress("glActiveTextureARB");
479         qglClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)SDL_GL_GetProcAddress("glClientActiveTextureARB");
480 
481         qglMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord1dARB");
482         qglMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord1dvARB");
483         qglMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord1fARB");
484         qglMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord1fvARB");
485         qglMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord1iARB");
486         qglMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord1ivARB");
487         qglMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord1sARB");
488         qglMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord1svARB");
489 
490         qglMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord2dARB");
491         qglMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord2dvARB");
492         qglMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord2fARB");
493         qglMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord2fvARB");
494         qglMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord2iARB");
495         qglMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord2ivARB");
496         qglMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord2sARB");
497         qglMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord2svARB");
498 
499         qglMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord3dARB");
500         qglMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord3dvARB");
501         qglMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord3fARB");
502         qglMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord3fvARB");
503         qglMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord3iARB");
504         qglMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord3ivARB");
505         qglMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord3sARB");
506         qglMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord3svARB");
507 
508         qglMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord4dARB");
509         qglMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord4dvARB");
510         qglMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord4fARB");
511         qglMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord4fvARB");
512         qglMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord4iARB");
513         qglMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord4ivARB");
514         qglMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord4sARB");
515         qglMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord4svARB");
516 
517         qglBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)SDL_GL_GetProcAddress("glBindVertexArray");
518         qglDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)SDL_GL_GetProcAddress("glDeleteVertexArrays");
519         qglGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)SDL_GL_GetProcAddress("glGenVertexArrays");
520         qglIsVertexArray = (PFNGLISVERTEXARRAYPROC)SDL_GL_GetProcAddress("glIsVertexArray");
521 
522         qglGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)SDL_GL_GetProcAddress("glGenerateMipmap");
523     }
524     else
525     {
526         fprintf(stderr, "VBOs not supported");
527         abort();
528     }
529     if(IsGLExtensionSupported("GL_ARB_shading_language_100"))
530     {
531         qglDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)SDL_GL_GetProcAddress("glDeleteObjectARB");
532         qglGetHandleARB = (PFNGLGETHANDLEARBPROC)SDL_GL_GetProcAddress("glGetHandleARB");
533         qglDetachObjectARB = (PFNGLDETACHOBJECTARBPROC)SDL_GL_GetProcAddress("glDetachObjectARB");
534         qglCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)SDL_GL_GetProcAddress("glCreateShaderObjectARB");
535         qglShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)SDL_GL_GetProcAddress("glShaderSourceARB");
536         qglCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)SDL_GL_GetProcAddress("glCompileShaderARB");
537         qglCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)SDL_GL_GetProcAddress("glCreateProgramObjectARB");
538         qglAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)SDL_GL_GetProcAddress("glAttachObjectARB");
539         qglLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)SDL_GL_GetProcAddress("glLinkProgramARB");
540         qglUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)SDL_GL_GetProcAddress("glUseProgramObjectARB");
541         qglValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)SDL_GL_GetProcAddress("glValidateProgramARB");
542         qglUniform1fARB = (PFNGLUNIFORM1FARBPROC)SDL_GL_GetProcAddress("glUniform1fARB");
543         qglUniform2fARB = (PFNGLUNIFORM2FARBPROC)SDL_GL_GetProcAddress("glUniform2fARB");
544         qglUniform3fARB = (PFNGLUNIFORM3FARBPROC)SDL_GL_GetProcAddress("glUniform3fARB");
545         qglUniform4fARB = (PFNGLUNIFORM4FARBPROC)SDL_GL_GetProcAddress("glUniform4fARB");
546         qglUniform1iARB = (PFNGLUNIFORM1IARBPROC)SDL_GL_GetProcAddress("glUniform1iARB");
547         qglUniform2iARB = (PFNGLUNIFORM2IARBPROC)SDL_GL_GetProcAddress("glUniform2iARB");
548         qglUniform3iARB = (PFNGLUNIFORM3IARBPROC)SDL_GL_GetProcAddress("glUniform3iARB");
549         qglUniform4iARB = (PFNGLUNIFORM4IARBPROC)SDL_GL_GetProcAddress("glUniform4iARB");
550         qglUniform1fvARB = (PFNGLUNIFORM1FVARBPROC)SDL_GL_GetProcAddress("glUniform1fvARB");
551         qglUniform2fvARB = (PFNGLUNIFORM2FVARBPROC)SDL_GL_GetProcAddress("glUniform2fvARB");
552         qglUniform3fvARB = (PFNGLUNIFORM3FVARBPROC)SDL_GL_GetProcAddress("glUniform3fvARB");
553         qglUniform4fvARB = (PFNGLUNIFORM4FVARBPROC)SDL_GL_GetProcAddress("glUniform4fvARB");
554         qglUniform1ivARB = (PFNGLUNIFORM1IVARBPROC)SDL_GL_GetProcAddress("glUniform1ivARB");
555         qglUniform2ivARB = (PFNGLUNIFORM2IVARBPROC)SDL_GL_GetProcAddress("glUniform2ivARB");
556         qglUniform3ivARB = (PFNGLUNIFORM3IVARBPROC)SDL_GL_GetProcAddress("glUniform3ivARB");
557         qglUniform4ivARB = (PFNGLUNIFORM4IVARBPROC)SDL_GL_GetProcAddress("glUniform4ivARB");
558         qglUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC)SDL_GL_GetProcAddress("glUniformMatrix2fvARB");
559         qglUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC)SDL_GL_GetProcAddress("glUniformMatrix3fvARB");
560         qglUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)SDL_GL_GetProcAddress("glUniformMatrix4fvARB");
561         qglGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC)SDL_GL_GetProcAddress("glGetObjectParameterfvARB");
562         qglGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)SDL_GL_GetProcAddress("glGetObjectParameterivARB");
563         qglGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)SDL_GL_GetProcAddress("glGetInfoLogARB");
564         qglGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC)SDL_GL_GetProcAddress("glGetAttachedObjectsARB");
565         qglGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)SDL_GL_GetProcAddress("glGetUniformLocationARB");
566         qglGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC)SDL_GL_GetProcAddress("glGetActiveUniformARB");
567         qglGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC)SDL_GL_GetProcAddress("glGetUniformfvARB");
568         qglGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC)SDL_GL_GetProcAddress("glGetUniformivARB");
569         qglGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC)SDL_GL_GetProcAddress("glGetShaderSourceARB");
570 
571         qglBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC)SDL_GL_GetProcAddress("glBindAttribLocationARB");
572         qglGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC)SDL_GL_GetProcAddress("glGetActiveAttribARB");
573         qglGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC)SDL_GL_GetProcAddress("glGetAttribLocationARB");
574         qglEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)SDL_GL_GetProcAddress("glEnableVertexAttribArrayARB");
575         qglDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)SDL_GL_GetProcAddress("glDisableVertexAttribArrayARB");
576 
577         qglVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)SDL_GL_GetProcAddress("glVertexAttribPointerARB");
578     }
579     else
580     {
581         Sys_Error("Shaders not supported");
582     }
583 }
584 
585 /**
586  * Use this function after InitGLExtFuncs()!!!
587  * @param ext - extension name
588  * @return 1 if extension "ext" is supported by your video card. In other cases returns 0.
589  */
IsGLExtensionSupported(const char * ext)590 int IsGLExtensionSupported(const char *ext)
591 {
592     char *ch = engine_gl_ext_str, *chh;
593     int len = strlen(ext);
594 
595     if(ch && ch[0])
596     {
597         while((chh = strstr(ch, ext)) != NULL)
598         {
599             ch = chh + len;
600             if((*ch == ' ' || *ch == 0) && (chh == engine_gl_ext_str || *(chh - 1) == ' '))
601             {
602                 return 1;
603             }
604         }
605     }
606 
607     return 0;
608 }
609 
610 /*
611  * Shaders generation section
612  */
checkOpenGLError()613 int checkOpenGLError()
614 {
615     int ret = 0;
616 
617     for(GLenum  glErr = qglGetError(); glErr != GL_NO_ERROR; glErr = qglGetError())
618     {
619         ret = 1;
620         switch(glErr)
621         {
622             case GL_INVALID_VALUE:
623                 Sys_DebugLog(GL_LOG_FILENAME, "glError: GL_INVALID_VALUE");
624                 break;
625 
626             case GL_INVALID_ENUM:
627                 Sys_DebugLog(GL_LOG_FILENAME, "glError: GL_INVALID_ENUM");
628                 break;
629 
630             case GL_INVALID_OPERATION:
631                 Sys_DebugLog(GL_LOG_FILENAME, "glError: GL_INVALID_OPERATION");
632                 break;
633 
634             case GL_STACK_OVERFLOW:
635                 Sys_DebugLog(GL_LOG_FILENAME, "glError: GL_STACK_OVERFLOW");
636                 break;
637 
638             case GL_STACK_UNDERFLOW:
639                 Sys_DebugLog(GL_LOG_FILENAME, "glError: GL_STACK_UNDERFLOW");
640                 break;
641 
642             case GL_OUT_OF_MEMORY:
643                 Sys_DebugLog(GL_LOG_FILENAME, "glError: GL_OUT_OF_MEMORY");
644                 break;
645 
646                /* GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB
647                   GL_LOSE_CONTEXT_ON_RESET_ARB
648                   GL_GUILTY_CONTEXT_RESET_ARB
649                   GL_INNOCENT_CONTEXT_RESET_ARB
650                   GL_UNKNOWN_CONTEXT_RESET_ARB
651                   GL_RESET_NOTIFICATION_STRATEGY_ARB
652                   GL_NO_RESET_NOTIFICATION_ARB*/
653 
654             default:
655                 Sys_DebugLog(GL_LOG_FILENAME, "glError: uncnown error = 0x%X", glErr);
656                 break;
657         };
658     }
659 
660     return ret;
661 }
662 
663 
printInfoLog(GLhandleARB object)664 void printInfoLog (GLhandleARB object)
665 {
666     GLint       logLength     = 0;
667     GLint       charsWritten  = 0;
668     GLcharARB * infoLog;
669 
670     checkOpenGLError();                         // check for OpenGL errors
671     qglGetObjectParameterivARB(object, GL_OBJECT_INFO_LOG_LENGTH_ARB, &logLength);
672 
673     if (logLength > 0)
674     {
675         infoLog = (GLcharARB*)malloc(logLength);
676         qglGetInfoLogARB(object, logLength, &charsWritten, infoLog);
677         Sys_DebugLog(GL_LOG_FILENAME, "GL_InfoLog[%d]:", charsWritten);
678         Sys_DebugLog(GL_LOG_FILENAME, "%s", (const char*)infoLog);
679         free(infoLog);
680     }
681 }
682 
683 
loadShaderFromBuff(GLhandleARB ShaderObj,const char * source,const char * additionalDefines)684 int loadShaderFromBuff(GLhandleARB ShaderObj, const char *source, const char *additionalDefines)
685 {
686     GLint compileStatus = 0;
687     if(source)
688     {
689         GLint source_size = strlen(source);
690         if (additionalDefines)
691         {
692             const char *bufs[2] = { additionalDefines, source };
693             const GLint lengths[2] = { (GLint) strlen(additionalDefines), source_size };
694             qglShaderSourceARB(ShaderObj, 2, bufs, lengths);
695         }
696         else
697         {
698             qglShaderSourceARB(ShaderObj, 1, (const char **)&source, &source_size);
699         }
700         //Sys_DebugLog(GL_LOG_FILENAME, "source loaded");
701         qglCompileShaderARB(ShaderObj);
702         //Sys_DebugLog(GL_LOG_FILENAME, "trying to compile");
703         if(checkOpenGLError())
704         {
705             return 0;
706         }
707         qglGetObjectParameterivARB(ShaderObj, GL_OBJECT_COMPILE_STATUS_ARB, &compileStatus);
708         //printInfoLog(ShaderObj);
709     }
710     return compileStatus != 0;
711 }
712 
713 
loadShaderFromFile(GLhandleARB ShaderObj,const char * fileName,const char * additionalDefines)714 int loadShaderFromFile(GLhandleARB ShaderObj, const char *fileName, const char *additionalDefines)
715 {
716     FILE *file;
717     GLint size = 0;
718     int ret = 0;
719 
720     //Sys_DebugLog(GL_LOG_FILENAME, "GL_Loading %s", fileName);
721     file = fopen (fileName, "rb");
722     if (file == NULL)
723     {
724         Sys_DebugLog(GL_LOG_FILENAME, "Error opening %s", fileName);
725         return ret;
726     }
727 
728     fseek(file, 0, SEEK_END);
729     size = ftell(file);
730 
731     if(size < 1)
732     {
733         fclose(file);
734         Sys_DebugLog(GL_LOG_FILENAME, "Error loading file %s: size < 1", fileName);
735         return ret;
736     }
737 
738     char *buf = (char*)malloc(size + 1);
739     fseek(file, 0, SEEK_SET);
740     if(size != fread(buf, 1, size, file))
741     {
742         Sys_DebugLog(GL_LOG_FILENAME, "Error loading file %s", fileName);
743     }
744     buf[size] = 0;
745     fclose(file);
746 
747     ret = loadShaderFromBuff(ShaderObj, buf, additionalDefines);
748     free(buf);
749     return ret;
750 }
751 
752 
BindWhiteTexture()753 void BindWhiteTexture()
754 {
755     qglBindTexture(GL_TEXTURE_2D, whiteTexture);
756 }
757