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