2006-12-21 12:53:11 +00:00
|
|
|
#include "compat.h"
|
2006-04-23 06:44:19 +00:00
|
|
|
#include "glbuild.h"
|
|
|
|
#include "baselayer.h"
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
|
2006-05-12 21:55:05 +00:00
|
|
|
#if defined USE_OPENGL
|
2006-04-23 06:44:19 +00:00
|
|
|
|
2006-11-13 23:12:47 +00:00
|
|
|
#ifdef RENDERTYPESDL
|
2006-07-01 01:40:18 +00:00
|
|
|
# ifdef __APPLE__
|
|
|
|
# include <SDL/SDL.h>
|
|
|
|
# else
|
2006-11-13 23:12:47 +00:00
|
|
|
#include "SDL.h"
|
|
|
|
#endif
|
2006-04-23 06:44:19 +00:00
|
|
|
#endif
|
|
|
|
|
2007-12-12 17:42:14 +00:00
|
|
|
void (APIENTRY * bglClearColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
|
|
|
|
void (APIENTRY * bglClear)(GLbitfield mask);
|
|
|
|
void (APIENTRY * bglColorMask)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
|
|
|
|
void (APIENTRY * bglAlphaFunc)(GLenum func, GLclampf ref);
|
|
|
|
void (APIENTRY * bglBlendFunc)(GLenum sfactor, GLenum dfactor);
|
|
|
|
void (APIENTRY * bglCullFace)(GLenum mode);
|
|
|
|
void (APIENTRY * bglFrontFace)(GLenum mode);
|
|
|
|
void (APIENTRY * bglPolygonOffset)(GLfloat factor, GLfloat units);
|
|
|
|
void (APIENTRY * bglPolygonMode)(GLenum face, GLenum mode);
|
|
|
|
void (APIENTRY * bglEnable)(GLenum cap);
|
|
|
|
void (APIENTRY * bglDisable)(GLenum cap);
|
|
|
|
void (APIENTRY * bglGetDoublev)(GLenum pname, GLdouble *params);
|
|
|
|
void (APIENTRY * bglGetFloatv)(GLenum pname, GLfloat *params);
|
|
|
|
void (APIENTRY * bglGetIntegerv)(GLenum pname, GLint *params);
|
|
|
|
void (APIENTRY * bglPushAttrib)(GLbitfield mask);
|
|
|
|
void (APIENTRY * bglPopAttrib)(void);
|
|
|
|
GLenum(APIENTRY * bglGetError)(void);
|
|
|
|
const GLubyte*(APIENTRY * bglGetString)(GLenum name);
|
|
|
|
void (APIENTRY * bglHint)(GLenum target, GLenum mode);
|
|
|
|
void (APIENTRY * bglDrawBuffer)(GLenum mode);
|
|
|
|
void (APIENTRY * bglReadBuffer)(GLenum mode);
|
|
|
|
void (APIENTRY * bglScissor)(GLint x, GLint y, GLsizei width, GLsizei height);
|
2006-04-23 06:44:19 +00:00
|
|
|
|
|
|
|
// Depth
|
2007-12-12 17:42:14 +00:00
|
|
|
void (APIENTRY * bglDepthFunc)(GLenum func);
|
|
|
|
void (APIENTRY * bglDepthMask)(GLboolean flag);
|
|
|
|
void (APIENTRY * bglDepthRange)(GLclampd near_val, GLclampd far_val);
|
2006-04-23 06:44:19 +00:00
|
|
|
|
|
|
|
// Matrix
|
2007-12-12 17:42:14 +00:00
|
|
|
void (APIENTRY * bglMatrixMode)(GLenum mode);
|
|
|
|
void (APIENTRY * bglOrtho)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val);
|
|
|
|
void (APIENTRY * bglFrustum)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val);
|
|
|
|
void (APIENTRY * bglViewport)(GLint x, GLint y, GLsizei width, GLsizei height);
|
|
|
|
void (APIENTRY * bglPushMatrix)(void);
|
|
|
|
void (APIENTRY * bglPopMatrix)(void);
|
|
|
|
void (APIENTRY * bglLoadIdentity)(void);
|
|
|
|
void (APIENTRY * bglLoadMatrixf)(const GLfloat *m);
|
|
|
|
void (APIENTRY * bglLoadMatrixd)(const GLdouble *m);
|
|
|
|
void (APIENTRY * bglMultMatrixf)(const GLfloat *m);
|
|
|
|
void (APIENTRY * bglMultMatrixd)(const GLdouble *m);
|
2006-08-31 01:56:43 +00:00
|
|
|
void (APIENTRY * bglRotatef)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
|
|
|
|
void (APIENTRY * bglScalef)(GLfloat x, GLfloat y, GLfloat z);
|
|
|
|
void (APIENTRY * bglTranslatef)(GLfloat x, GLfloat y, GLfloat z);
|
2006-04-23 06:44:19 +00:00
|
|
|
|
|
|
|
// Drawing
|
2007-12-12 17:42:14 +00:00
|
|
|
void (APIENTRY * bglBegin)(GLenum mode);
|
|
|
|
void (APIENTRY * bglEnd)(void);
|
|
|
|
void (APIENTRY * bglVertex2f)(GLfloat x, GLfloat y);
|
|
|
|
void (APIENTRY * bglVertex2i)(GLint x, GLint y);
|
|
|
|
void (APIENTRY * bglVertex3f)(GLfloat x, GLfloat y, GLfloat z);
|
|
|
|
void (APIENTRY * bglVertex3d)(GLdouble x, GLdouble y, GLdouble z);
|
|
|
|
void (APIENTRY * bglVertex3fv)(const GLfloat *v);
|
|
|
|
void (APIENTRY * bglVertex3dv)(const GLdouble *v);
|
|
|
|
void (APIENTRY * bglColor4f)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
|
|
|
|
void (APIENTRY * bglColor4ub)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
|
|
|
|
void (APIENTRY * bglTexCoord2d)(GLdouble s, GLdouble t);
|
|
|
|
void (APIENTRY * bglTexCoord2f)(GLfloat s, GLfloat t);
|
2006-04-23 06:44:19 +00:00
|
|
|
|
|
|
|
// Lighting
|
2007-12-12 17:42:14 +00:00
|
|
|
void (APIENTRY * bglShadeModel)(GLenum mode);
|
2006-04-23 06:44:19 +00:00
|
|
|
|
|
|
|
// Raster funcs
|
2007-12-12 17:42:14 +00:00
|
|
|
void (APIENTRY * bglReadPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
|
2006-04-23 06:44:19 +00:00
|
|
|
|
|
|
|
// Texture mapping
|
2007-12-12 17:42:14 +00:00
|
|
|
void (APIENTRY * bglTexEnvf)(GLenum target, GLenum pname, GLfloat param);
|
|
|
|
void (APIENTRY * bglGenTextures)(GLsizei n, GLuint *textures); // 1.1
|
|
|
|
void (APIENTRY * bglDeleteTextures)(GLsizei n, const GLuint *textures); // 1.1
|
|
|
|
void (APIENTRY * bglBindTexture)(GLenum target, GLuint texture); // 1.1
|
|
|
|
void (APIENTRY * bglTexImage2D)(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
|
|
|
|
void (APIENTRY * bglCopyTexImage2D)(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
|
|
|
|
void (APIENTRY * bglCopyTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
|
|
|
|
void (APIENTRY * bglTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); // 1.1
|
|
|
|
void (APIENTRY * bglTexParameterf)(GLenum target, GLenum pname, GLfloat param);
|
|
|
|
void (APIENTRY * bglTexParameteri)(GLenum target, GLenum pname, GLint param);
|
|
|
|
void (APIENTRY * bglGetTexLevelParameteriv)(GLenum target, GLint level, GLenum pname, GLint *params);
|
2006-04-23 06:44:19 +00:00
|
|
|
void (APIENTRY * bglCompressedTexImage2DARB)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *);
|
|
|
|
void (APIENTRY * bglGetCompressedTexImageARB)(GLenum, GLint, GLvoid *);
|
2006-08-31 01:56:43 +00:00
|
|
|
void (APIENTRY * bglTexGenfv)(GLenum coord, GLenum pname, const GLfloat *params);
|
2006-04-23 06:44:19 +00:00
|
|
|
|
|
|
|
// Fog
|
2007-12-12 17:42:14 +00:00
|
|
|
void (APIENTRY * bglFogf)(GLenum pname, GLfloat param);
|
|
|
|
void (APIENTRY * bglFogi)(GLenum pname, GLint param);
|
|
|
|
void (APIENTRY * bglFogfv)(GLenum pname, const GLfloat *params);
|
2006-04-24 19:04:22 +00:00
|
|
|
|
2006-08-30 23:32:39 +00:00
|
|
|
// Display Lists
|
|
|
|
void (APIENTRY * bglNewList)(GLuint list, GLenum mode);
|
|
|
|
void (APIENTRY * bglEndList)(void);
|
|
|
|
void (APIENTRY * bglCallList)(GLuint list);
|
2006-12-31 06:32:04 +00:00
|
|
|
void (APIENTRY * bglDeleteLists)(GLuint list, GLsizei range);
|
2006-08-30 23:32:39 +00:00
|
|
|
|
2006-09-27 02:23:27 +00:00
|
|
|
// Vertex Arrays
|
|
|
|
void (APIENTRY * bglEnableClientState)(GLenum cap);
|
|
|
|
void (APIENTRY * bglDisableClientState)(GLenum cap);
|
|
|
|
void (APIENTRY * bglVertexPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
|
|
|
|
void (APIENTRY * bglTexCoordPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
|
2006-09-29 21:36:12 +00:00
|
|
|
void (APIENTRY * bglDrawArrays)(GLenum mode, GLint first, GLsizei count);
|
2006-09-27 02:23:27 +00:00
|
|
|
void (APIENTRY * bglDrawElements)(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
|
|
|
|
|
2006-10-04 09:54:25 +00:00
|
|
|
// Stencil Buffer
|
|
|
|
void (APIENTRY * bglClearStencil)(GLint s);
|
|
|
|
void (APIENTRY * bglStencilOp)(GLenum fail, GLenum zfail, GLenum zpass);
|
|
|
|
void (APIENTRY * bglStencilFunc)(GLenum func, GLint ref, GLuint mask);
|
|
|
|
|
2006-12-31 06:32:04 +00:00
|
|
|
// GPU Programs
|
|
|
|
void (APIENTRY * bglGenProgramsARB)(GLsizei, GLuint *);
|
|
|
|
void (APIENTRY * bglBindProgramARB)(GLenum, GLuint);
|
|
|
|
void (APIENTRY * bglProgramStringARB)(GLenum, GLenum, GLsizei, const GLvoid *);
|
2007-01-06 01:29:45 +00:00
|
|
|
void (APIENTRY * bglDeleteProgramsARB)(GLsizei n, const GLuint *programs);
|
2006-12-31 06:32:04 +00:00
|
|
|
|
|
|
|
// Multitexturing
|
|
|
|
void (APIENTRY * bglActiveTextureARB)(GLenum texture);
|
2007-03-03 23:09:40 +00:00
|
|
|
void (APIENTRY * bglClientActiveTextureARB)(GLenum texture);
|
2007-12-12 17:42:14 +00:00
|
|
|
void (APIENTRY * bglMultiTexCoord2dARB)(GLenum target, GLdouble s, GLdouble t);
|
|
|
|
void (APIENTRY * bglMultiTexCoord2fARB)(GLenum target, GLfloat s, GLfloat t);
|
2006-12-31 06:32:04 +00:00
|
|
|
|
2007-01-06 01:29:45 +00:00
|
|
|
// Frame Buffer Objects
|
|
|
|
void (APIENTRY * bglGenFramebuffersEXT)(GLsizei n, GLuint *framebuffers);
|
2007-12-12 17:42:14 +00:00
|
|
|
void (APIENTRY * bglBindFramebufferEXT)(GLenum target, GLuint framebuffer);
|
|
|
|
void (APIENTRY * bglFramebufferTexture2DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
|
|
|
|
GLenum(APIENTRY * bglCheckFramebufferStatusEXT)(GLenum target);
|
|
|
|
void (APIENTRY * bglDeleteFramebuffersEXT)(GLsizei n, const GLuint *framebuffers);
|
|
|
|
|
|
|
|
// Vertex Buffer Objects
|
|
|
|
void (APIENTRY * bglGenBuffersARB)(GLsizei n, GLuint * buffers);
|
|
|
|
void (APIENTRY * bglBindBufferARB)(GLenum target, GLuint buffer);
|
|
|
|
void (APIENTRY * bglDeleteBuffersARB)(GLsizei n, const GLuint * buffers);
|
|
|
|
void (APIENTRY * bglBufferDataARB)(GLenum target, GLsizeiptrARB size, const GLvoid * data, GLenum usage);
|
|
|
|
void* (APIENTRY * bglMapBufferARB)(GLenum target, GLenum access);
|
|
|
|
GLboolean(APIENTRY * bglUnmapBufferARB)(GLenum target);
|
2007-01-06 01:29:45 +00:00
|
|
|
|
2007-01-16 03:19:04 +00:00
|
|
|
// GLU
|
2007-12-12 17:42:14 +00:00
|
|
|
void (APIENTRY * bgluTessBeginContour)(GLUtesselator* tess);
|
|
|
|
void (APIENTRY * bgluTessBeginPolygon)(GLUtesselator* tess, GLvoid* data);
|
|
|
|
void (APIENTRY * bgluTessCallback)(GLUtesselator* tess, GLenum which, void (PR_CALLBACK CallBackFunc)());
|
|
|
|
void (APIENTRY * bgluTessEndContour)(GLUtesselator* tess);
|
|
|
|
void (APIENTRY * bgluTessEndPolygon)(GLUtesselator* tess);
|
|
|
|
void (APIENTRY * bgluTessNormal)(GLUtesselator* tess, GLdouble valueX, GLdouble valueY, GLdouble valueZ);
|
|
|
|
void (APIENTRY * bgluTessProperty)(GLUtesselator* tess, GLenum which, GLdouble data);
|
|
|
|
void (APIENTRY * bgluTessVertex)(GLUtesselator* tess, GLdouble *location, GLvoid* data);
|
|
|
|
GLUtesselator*(APIENTRY * bgluNewTess)(void);
|
2007-07-01 06:32:03 +00:00
|
|
|
|
2007-12-12 17:42:14 +00:00
|
|
|
void (APIENTRY * bgluPerspective)(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar);
|
2007-07-01 06:32:03 +00:00
|
|
|
|
2007-12-12 17:42:14 +00:00
|
|
|
const GLubyte * (APIENTRY * bgluErrorString)(GLenum error);
|
2007-01-16 03:19:04 +00:00
|
|
|
|
2007-12-12 17:42:14 +00:00
|
|
|
GLint(APIENTRY * bgluProject)(GLdouble objX, GLdouble objY, GLdouble objZ, const GLdouble *model, const GLdouble *proj, const GLint *view, GLdouble* winX, GLdouble* winY, GLdouble* winZ);
|
2007-07-01 06:32:03 +00:00
|
|
|
|
2006-04-23 06:44:19 +00:00
|
|
|
#ifdef RENDERTYPEWIN
|
|
|
|
// Windows
|
2007-12-12 17:42:14 +00:00
|
|
|
HGLRC(WINAPI * bwglCreateContext)(HDC);
|
2006-04-23 06:44:19 +00:00
|
|
|
BOOL (WINAPI * bwglDeleteContext)(HGLRC);
|
2007-12-12 17:42:14 +00:00
|
|
|
PROC(WINAPI * bwglGetProcAddress)(LPCSTR);
|
2006-04-23 06:44:19 +00:00
|
|
|
BOOL (WINAPI * bwglMakeCurrent)(HDC,HGLRC);
|
|
|
|
|
|
|
|
BOOL (WINAPI * bwglSwapBuffers)(HDC);
|
|
|
|
int (WINAPI * bwglChoosePixelFormat)(HDC,CONST PIXELFORMATDESCRIPTOR*);
|
|
|
|
int (WINAPI * bwglDescribePixelFormat)(HDC,int,UINT,LPPIXELFORMATDESCRIPTOR);
|
|
|
|
int (WINAPI * bwglGetPixelFormat)(HDC);
|
|
|
|
BOOL (WINAPI * bwglSetPixelFormat)(HDC,int,const PIXELFORMATDESCRIPTOR*);
|
|
|
|
|
2007-01-16 03:19:04 +00:00
|
|
|
static HANDLE hGLDLL, hGLUDLL;
|
|
|
|
#else
|
|
|
|
#include <dlfcn.h>
|
2006-04-23 06:44:19 +00:00
|
|
|
|
2007-01-16 03:19:04 +00:00
|
|
|
static void *gluhandle = NULL;
|
|
|
|
#endif
|
2006-04-23 06:44:19 +00:00
|
|
|
|
2007-01-16 03:19:04 +00:00
|
|
|
char *gldriver = NULL, *glulibrary = NULL;
|
2006-04-23 06:44:19 +00:00
|
|
|
|
|
|
|
static void * getproc_(const char *s, int *err, int fatal, int extension)
|
|
|
|
{
|
2006-04-24 19:04:22 +00:00
|
|
|
void *t;
|
2006-04-23 06:44:19 +00:00
|
|
|
#if defined RENDERTYPESDL
|
2006-04-24 19:04:22 +00:00
|
|
|
t = (void*)SDL_GL_GetProcAddress(s);
|
2006-04-23 06:44:19 +00:00
|
|
|
#elif defined _WIN32
|
2006-04-24 19:04:22 +00:00
|
|
|
if (extension) t = (void*)bwglGetProcAddress(s);
|
|
|
|
else t = (void*)GetProcAddress(hGLDLL,s);
|
2006-04-23 06:44:19 +00:00
|
|
|
#else
|
|
|
|
#error Need a dynamic loader for this platform...
|
|
|
|
#endif
|
2007-12-12 17:42:14 +00:00
|
|
|
if (!t && fatal)
|
|
|
|
{
|
2006-04-24 19:04:22 +00:00
|
|
|
initprintf("Failed to find %s in %s\n", s, gldriver);
|
|
|
|
*err = 1;
|
|
|
|
}
|
|
|
|
return t;
|
2006-04-23 06:44:19 +00:00
|
|
|
}
|
|
|
|
#define GETPROC(s) getproc_(s,&err,1,0)
|
|
|
|
#define GETPROCSOFT(s) getproc_(s,&err,0,0)
|
|
|
|
#define GETPROCEXT(s) getproc_(s,&err,1,1)
|
|
|
|
#define GETPROCEXTSOFT(s) getproc_(s,&err,0,1)
|
|
|
|
|
|
|
|
int loadgldriver(const char *driver)
|
|
|
|
{
|
2006-04-24 19:04:22 +00:00
|
|
|
void *t;
|
|
|
|
int err=0;
|
|
|
|
|
2006-04-23 06:44:19 +00:00
|
|
|
#ifdef RENDERTYPEWIN
|
2006-04-24 19:04:22 +00:00
|
|
|
if (hGLDLL) return 0;
|
2006-04-23 06:44:19 +00:00
|
|
|
#endif
|
|
|
|
|
2007-12-12 17:42:14 +00:00
|
|
|
if (!driver)
|
|
|
|
{
|
2006-11-13 23:12:47 +00:00
|
|
|
#ifdef _WIN32
|
2006-04-24 19:04:22 +00:00
|
|
|
driver = "OPENGL32.DLL";
|
2006-07-01 01:40:18 +00:00
|
|
|
#elif defined __APPLE__
|
2006-08-31 01:56:43 +00:00
|
|
|
driver = "/System/Library/Frameworks/OpenGL.framework/OpenGL";
|
2006-04-23 06:44:19 +00:00
|
|
|
#else
|
2006-04-24 19:04:22 +00:00
|
|
|
driver = "libGL.so";
|
2006-04-23 06:44:19 +00:00
|
|
|
#endif
|
2006-04-24 19:04:22 +00:00
|
|
|
}
|
2006-04-23 06:44:19 +00:00
|
|
|
|
2006-04-24 19:04:22 +00:00
|
|
|
initprintf("Loading %s\n",driver);
|
2006-04-23 06:44:19 +00:00
|
|
|
|
|
|
|
#if defined RENDERTYPESDL
|
2006-04-24 19:04:22 +00:00
|
|
|
if (SDL_GL_LoadLibrary(driver)) return -1;
|
2006-04-23 06:44:19 +00:00
|
|
|
#elif defined _WIN32
|
2006-04-24 19:04:22 +00:00
|
|
|
hGLDLL = LoadLibrary(driver);
|
|
|
|
if (!hGLDLL) return -1;
|
2006-04-23 06:44:19 +00:00
|
|
|
#endif
|
2006-04-24 19:04:22 +00:00
|
|
|
gldriver = strdup(driver);
|
2006-04-23 06:44:19 +00:00
|
|
|
|
|
|
|
#ifdef RENDERTYPEWIN
|
2006-04-24 19:04:22 +00:00
|
|
|
bwglCreateContext = GETPROC("wglCreateContext");
|
|
|
|
bwglDeleteContext = GETPROC("wglDeleteContext");
|
|
|
|
bwglGetProcAddress = GETPROC("wglGetProcAddress");
|
|
|
|
bwglMakeCurrent = GETPROC("wglMakeCurrent");
|
|
|
|
|
|
|
|
bwglSwapBuffers = GETPROC("wglSwapBuffers");
|
|
|
|
bwglChoosePixelFormat = GETPROC("wglChoosePixelFormat");
|
|
|
|
bwglDescribePixelFormat = GETPROC("wglDescribePixelFormat");
|
|
|
|
bwglGetPixelFormat = GETPROC("wglGetPixelFormat");
|
|
|
|
bwglSetPixelFormat = GETPROC("wglSetPixelFormat");
|
2006-04-23 06:44:19 +00:00
|
|
|
#endif
|
|
|
|
|
2006-04-24 19:04:22 +00:00
|
|
|
bglClearColor = GETPROC("glClearColor");
|
2007-01-14 07:00:29 +00:00
|
|
|
bglClear = GETPROC("glClear");
|
2006-04-24 19:04:22 +00:00
|
|
|
bglColorMask = GETPROC("glColorMask");
|
|
|
|
bglAlphaFunc = GETPROC("glAlphaFunc");
|
|
|
|
bglBlendFunc = GETPROC("glBlendFunc");
|
2007-01-14 07:00:29 +00:00
|
|
|
bglCullFace = GETPROC("glCullFace");
|
2006-04-24 19:04:22 +00:00
|
|
|
bglFrontFace = GETPROC("glFrontFace");
|
|
|
|
bglPolygonOffset = GETPROC("glPolygonOffset");
|
|
|
|
bglPolygonMode = GETPROC("glPolygonMode");
|
2007-01-14 07:00:29 +00:00
|
|
|
bglEnable = GETPROC("glEnable");
|
|
|
|
bglDisable = GETPROC("glDisable");
|
2007-03-22 18:28:41 +00:00
|
|
|
bglGetDoublev = GETPROC("glGetDoublev");
|
2006-04-24 19:04:22 +00:00
|
|
|
bglGetFloatv = GETPROC("glGetFloatv");
|
|
|
|
bglGetIntegerv = GETPROC("glGetIntegerv");
|
|
|
|
bglPushAttrib = GETPROC("glPushAttrib");
|
|
|
|
bglPopAttrib = GETPROC("glPopAttrib");
|
2007-01-14 07:00:29 +00:00
|
|
|
bglGetError = GETPROC("glGetError");
|
2006-04-24 19:04:22 +00:00
|
|
|
bglGetString = GETPROC("glGetString");
|
2007-01-14 07:00:29 +00:00
|
|
|
bglHint = GETPROC("glHint");
|
2007-12-12 17:42:14 +00:00
|
|
|
bglDrawBuffer = GETPROC("glDrawBuffer");
|
|
|
|
bglReadBuffer = GETPROC("glDrawBuffer");
|
|
|
|
bglScissor = GETPROC("glScissor");
|
2006-04-24 19:04:22 +00:00
|
|
|
|
|
|
|
// Depth
|
|
|
|
bglDepthFunc = GETPROC("glDepthFunc");
|
|
|
|
bglDepthMask = GETPROC("glDepthMask");
|
|
|
|
bglDepthRange = GETPROC("glDepthRange");
|
|
|
|
|
|
|
|
// Matrix
|
|
|
|
bglMatrixMode = GETPROC("glMatrixMode");
|
|
|
|
bglOrtho = GETPROC("glOrtho");
|
|
|
|
bglFrustum = GETPROC("glFrustum");
|
|
|
|
bglViewport = GETPROC("glViewport");
|
|
|
|
bglPushMatrix = GETPROC("glPushMatrix");
|
|
|
|
bglPopMatrix = GETPROC("glPopMatrix");
|
|
|
|
bglLoadIdentity = GETPROC("glLoadIdentity");
|
|
|
|
bglLoadMatrixf = GETPROC("glLoadMatrixf");
|
2007-03-22 18:28:41 +00:00
|
|
|
bglLoadMatrixd = GETPROC("glLoadMatrixd");
|
2006-10-15 18:51:41 +00:00
|
|
|
bglMultMatrixf = GETPROC("glMultMatrixf");
|
2007-03-22 18:28:41 +00:00
|
|
|
bglMultMatrixd = GETPROC("glMultMatrixd");
|
2006-08-29 01:58:59 +00:00
|
|
|
bglRotatef = GETPROC("glRotatef");
|
2006-08-30 23:32:39 +00:00
|
|
|
bglScalef = GETPROC("glScalef");
|
|
|
|
bglTranslatef = GETPROC("glTranslatef");
|
2006-04-24 19:04:22 +00:00
|
|
|
|
|
|
|
// Drawing
|
2007-01-06 01:29:45 +00:00
|
|
|
bglBegin = GETPROC("glBegin");
|
|
|
|
bglEnd = GETPROC("glEnd");
|
|
|
|
bglVertex2f = GETPROC("glVertex2f");
|
|
|
|
bglVertex2i = GETPROC("glVertex2i");
|
|
|
|
bglVertex3f = GETPROC("glVertex3f");
|
|
|
|
bglVertex3d = GETPROC("glVertex3d");
|
|
|
|
bglVertex3fv = GETPROC("glVertex3fv");
|
|
|
|
bglVertex3dv = GETPROC("glVertex3dv");
|
|
|
|
bglColor4f = GETPROC("glColor4f");
|
|
|
|
bglColor4ub = GETPROC("glColor4ub");
|
|
|
|
bglTexCoord2d = GETPROC("glTexCoord2d");
|
|
|
|
bglTexCoord2f = GETPROC("glTexCoord2f");
|
2006-04-24 19:04:22 +00:00
|
|
|
|
|
|
|
// Lighting
|
|
|
|
bglShadeModel = GETPROC("glShadeModel");
|
|
|
|
|
|
|
|
// Raster funcs
|
|
|
|
bglReadPixels = GETPROC("glReadPixels");
|
|
|
|
|
|
|
|
// Texture mapping
|
2007-01-06 01:29:45 +00:00
|
|
|
bglTexEnvf = GETPROC("glTexEnvf");
|
2006-04-24 19:04:22 +00:00
|
|
|
bglGenTextures = GETPROC("glGenTextures");
|
|
|
|
bglDeleteTextures = GETPROC("glDeleteTextures");
|
|
|
|
bglBindTexture = GETPROC("glBindTexture");
|
|
|
|
bglTexImage2D = GETPROC("glTexImage2D");
|
2006-12-31 06:32:04 +00:00
|
|
|
bglCopyTexImage2D = GETPROC("glCopyTexImage2D");
|
|
|
|
bglCopyTexSubImage2D= GETPROC("glCopyTexSubImage2D");
|
2006-04-24 19:04:22 +00:00
|
|
|
bglTexSubImage2D = GETPROC("glTexSubImage2D");
|
|
|
|
bglTexParameterf = GETPROC("glTexParameterf");
|
|
|
|
bglTexParameteri = GETPROC("glTexParameteri");
|
|
|
|
bglGetTexLevelParameteriv = GETPROC("glGetTexLevelParameteriv");
|
2006-08-31 01:56:43 +00:00
|
|
|
bglTexGenfv = GETPROC("glTexGenfv");
|
2006-04-24 19:04:22 +00:00
|
|
|
|
|
|
|
// Fog
|
|
|
|
bglFogf = GETPROC("glFogf");
|
|
|
|
bglFogi = GETPROC("glFogi");
|
|
|
|
bglFogfv = GETPROC("glFogfv");
|
|
|
|
|
2006-08-30 23:32:39 +00:00
|
|
|
// Display Lists
|
2007-01-06 01:29:45 +00:00
|
|
|
bglNewList = GETPROC("glNewList");
|
|
|
|
bglEndList = GETPROC("glEndList");
|
|
|
|
bglCallList = GETPROC("glCallList");
|
|
|
|
bglDeleteLists = GETPROC("glDeleteLists");
|
2006-08-30 23:32:39 +00:00
|
|
|
|
2006-09-27 02:23:27 +00:00
|
|
|
// Vertex Arrays
|
|
|
|
bglEnableClientState = GETPROC("glEnableClientState");
|
|
|
|
bglDisableClientState = GETPROC("glDisableClientState");
|
|
|
|
bglVertexPointer = GETPROC("glVertexPointer");
|
|
|
|
bglTexCoordPointer = GETPROC("glTexCoordPointer");
|
2006-09-29 21:36:12 +00:00
|
|
|
bglDrawArrays = GETPROC("glDrawArrays");
|
2006-09-27 02:23:27 +00:00
|
|
|
bglDrawElements = GETPROC("glDrawElements");
|
|
|
|
|
2006-10-04 09:54:25 +00:00
|
|
|
// Stencil Buffer
|
|
|
|
bglClearStencil = GETPROC("glClearStencil");
|
|
|
|
bglStencilOp = GETPROC("glStencilOp");
|
|
|
|
bglStencilFunc = GETPROC("glStencilFunc");
|
2007-12-12 17:42:14 +00:00
|
|
|
|
2006-04-24 19:04:22 +00:00
|
|
|
loadglextensions();
|
2007-01-20 03:10:32 +00:00
|
|
|
loadglulibrary(getenv("BUILD_GLULIB"));
|
2006-04-24 19:04:22 +00:00
|
|
|
|
|
|
|
if (err) unloadgldriver();
|
|
|
|
return err;
|
2006-04-23 06:44:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int loadglextensions(void)
|
|
|
|
{
|
2006-04-24 19:04:22 +00:00
|
|
|
int err = 0;
|
2006-04-23 06:44:19 +00:00
|
|
|
#ifdef RENDERTYPEWIN
|
2006-04-24 19:04:22 +00:00
|
|
|
if (!hGLDLL) return 0;
|
2006-04-23 06:44:19 +00:00
|
|
|
#endif
|
|
|
|
|
2006-04-24 19:04:22 +00:00
|
|
|
bglCompressedTexImage2DARB = GETPROCEXTSOFT("glCompressedTexImage2DARB");
|
|
|
|
bglGetCompressedTexImageARB = GETPROCEXTSOFT("glGetCompressedTexImageARB");
|
2006-04-23 06:44:19 +00:00
|
|
|
|
2006-12-31 06:32:04 +00:00
|
|
|
// GPU Programs
|
|
|
|
bglGenProgramsARB = GETPROCEXTSOFT("glGenProgramsARB");
|
|
|
|
bglBindProgramARB = GETPROCEXTSOFT("glBindProgramARB");
|
|
|
|
bglProgramStringARB = GETPROCEXTSOFT("glProgramStringARB");
|
2007-01-06 01:29:45 +00:00
|
|
|
bglDeleteProgramsARB= GETPROCEXTSOFT("glDeleteProgramsARB");
|
2006-12-31 06:32:04 +00:00
|
|
|
|
|
|
|
// Multitexturing
|
2007-03-03 23:09:40 +00:00
|
|
|
bglActiveTextureARB = GETPROCEXTSOFT("glActiveTextureARB");
|
|
|
|
bglClientActiveTextureARB = GETPROCEXTSOFT("glClientActiveTextureARB");
|
|
|
|
bglMultiTexCoord2dARB = GETPROCEXTSOFT("glMultiTexCoord2dARB");
|
|
|
|
bglMultiTexCoord2fARB = GETPROCEXTSOFT("glMultiTexCoord2fARB");
|
2006-12-31 06:32:04 +00:00
|
|
|
|
2007-01-06 01:29:45 +00:00
|
|
|
// Frame Buffer Objects
|
|
|
|
bglGenFramebuffersEXT = GETPROCEXTSOFT("glGenFramebuffersEXT");
|
2007-12-12 17:42:14 +00:00
|
|
|
bglBindFramebufferEXT = GETPROCEXTSOFT("glBindFramebufferEXT");
|
|
|
|
bglFramebufferTexture2DEXT = GETPROCEXTSOFT("glFramebufferTexture2DEXT");
|
|
|
|
bglCheckFramebufferStatusEXT = GETPROCEXTSOFT("glCheckFramebufferStatusEXT");
|
|
|
|
bglDeleteFramebuffersEXT = GETPROCEXTSOFT("glDeleteFramebuffersEXT");
|
|
|
|
|
|
|
|
// Vertex Buffer Objects
|
|
|
|
bglGenBuffersARB = GETPROCEXTSOFT("glGenBuffersARB");
|
|
|
|
bglBindBufferARB = GETPROCEXTSOFT("glBindBufferARB");
|
|
|
|
bglDeleteBuffersARB = GETPROCEXTSOFT("glDeleteBuffersARB");
|
2007-03-08 03:07:10 +00:00
|
|
|
bglBufferDataARB = GETPROCEXTSOFT("glBufferDataARB");
|
|
|
|
bglMapBufferARB = GETPROCEXTSOFT("glMapBufferARB");
|
|
|
|
bglUnmapBufferARB = GETPROCEXTSOFT("glUnmapBufferARB");
|
2007-12-12 17:42:14 +00:00
|
|
|
|
2006-04-24 19:04:22 +00:00
|
|
|
return err;
|
2006-04-23 06:44:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int unloadgldriver(void)
|
|
|
|
{
|
2007-01-20 03:10:32 +00:00
|
|
|
unloadglulibrary();
|
2007-12-12 17:42:14 +00:00
|
|
|
|
2006-04-23 06:44:19 +00:00
|
|
|
#ifdef RENDERTYPEWIN
|
2006-04-24 19:04:22 +00:00
|
|
|
if (!hGLDLL) return 0;
|
2006-04-23 06:44:19 +00:00
|
|
|
#endif
|
|
|
|
|
2006-04-24 19:04:22 +00:00
|
|
|
free(gldriver);
|
|
|
|
gldriver = NULL;
|
|
|
|
|
2006-04-23 06:44:19 +00:00
|
|
|
#ifdef RENDERTYPEWIN
|
2006-04-24 19:04:22 +00:00
|
|
|
FreeLibrary(hGLDLL);
|
|
|
|
hGLDLL = NULL;
|
2006-04-23 06:44:19 +00:00
|
|
|
#endif
|
2006-04-24 19:04:22 +00:00
|
|
|
|
|
|
|
bglClearColor = NULL;
|
2006-10-15 18:51:41 +00:00
|
|
|
bglClear = NULL;
|
2006-04-24 19:04:22 +00:00
|
|
|
bglColorMask = NULL;
|
|
|
|
bglAlphaFunc = NULL;
|
|
|
|
bglBlendFunc = NULL;
|
2006-10-15 18:51:41 +00:00
|
|
|
bglCullFace = NULL;
|
2006-04-24 19:04:22 +00:00
|
|
|
bglFrontFace = NULL;
|
|
|
|
bglPolygonOffset = NULL;
|
2006-10-15 18:51:41 +00:00
|
|
|
bglPolygonMode = NULL;
|
|
|
|
bglEnable = NULL;
|
|
|
|
bglDisable = NULL;
|
2007-03-22 18:28:41 +00:00
|
|
|
bglGetDoublev = NULL;
|
2006-04-24 19:04:22 +00:00
|
|
|
bglGetFloatv = NULL;
|
|
|
|
bglGetIntegerv = NULL;
|
|
|
|
bglPushAttrib = NULL;
|
|
|
|
bglPopAttrib = NULL;
|
2006-10-15 18:51:41 +00:00
|
|
|
bglGetError = NULL;
|
2006-04-24 19:04:22 +00:00
|
|
|
bglGetString = NULL;
|
2006-10-15 18:51:41 +00:00
|
|
|
bglHint = NULL;
|
2007-12-12 17:42:14 +00:00
|
|
|
bglDrawBuffer = NULL;
|
|
|
|
bglReadBuffer = NULL;
|
|
|
|
bglScissor = NULL;
|
2006-04-24 19:04:22 +00:00
|
|
|
|
|
|
|
// Depth
|
|
|
|
bglDepthFunc = NULL;
|
|
|
|
bglDepthMask = NULL;
|
|
|
|
bglDepthRange = NULL;
|
|
|
|
|
|
|
|
// Matrix
|
|
|
|
bglMatrixMode = NULL;
|
2006-10-15 18:51:41 +00:00
|
|
|
bglOrtho = NULL;
|
|
|
|
bglFrustum = NULL;
|
|
|
|
bglViewport = NULL;
|
2006-04-24 19:04:22 +00:00
|
|
|
bglPushMatrix = NULL;
|
|
|
|
bglPopMatrix = NULL;
|
|
|
|
bglLoadIdentity = NULL;
|
|
|
|
bglLoadMatrixf = NULL;
|
2007-03-22 18:28:41 +00:00
|
|
|
bglLoadMatrixd = NULL;
|
2006-10-15 18:51:41 +00:00
|
|
|
bglMultMatrixf = NULL;
|
2007-03-22 18:28:41 +00:00
|
|
|
bglMultMatrixd = NULL;
|
2006-10-15 18:51:41 +00:00
|
|
|
bglRotatef = NULL;
|
|
|
|
bglScalef = NULL;
|
|
|
|
bglTranslatef = NULL;
|
2006-04-24 19:04:22 +00:00
|
|
|
|
|
|
|
// Drawing
|
|
|
|
bglBegin = NULL;
|
|
|
|
bglEnd = NULL;
|
|
|
|
bglVertex2f = NULL;
|
|
|
|
bglVertex2i = NULL;
|
2006-10-18 03:59:28 +00:00
|
|
|
bglVertex3f = NULL;
|
2006-04-24 19:04:22 +00:00
|
|
|
bglVertex3d = NULL;
|
2006-10-15 18:51:41 +00:00
|
|
|
bglVertex3fv = NULL;
|
2006-04-24 19:04:22 +00:00
|
|
|
bglColor4f = NULL;
|
|
|
|
bglColor4ub = NULL;
|
2006-10-15 18:51:41 +00:00
|
|
|
bglTexCoord2d = NULL;
|
|
|
|
bglTexCoord2f = NULL;
|
2006-04-24 19:04:22 +00:00
|
|
|
|
|
|
|
// Lighting
|
|
|
|
bglShadeModel = NULL;
|
|
|
|
|
|
|
|
// Raster funcs
|
|
|
|
bglReadPixels = NULL;
|
|
|
|
|
|
|
|
// Texture mapping
|
2006-10-15 18:51:41 +00:00
|
|
|
bglTexEnvf = NULL;
|
2006-04-24 19:04:22 +00:00
|
|
|
bglGenTextures = NULL;
|
|
|
|
bglDeleteTextures = NULL;
|
|
|
|
bglBindTexture = NULL;
|
|
|
|
bglTexImage2D = NULL;
|
2006-12-31 06:32:04 +00:00
|
|
|
bglCopyTexImage2D = NULL;
|
|
|
|
bglCopyTexSubImage2D= NULL;
|
2006-04-24 19:04:22 +00:00
|
|
|
bglTexSubImage2D = NULL;
|
|
|
|
bglTexParameterf = NULL;
|
|
|
|
bglTexParameteri = NULL;
|
|
|
|
bglGetTexLevelParameteriv = NULL;
|
|
|
|
bglCompressedTexImage2DARB = NULL;
|
|
|
|
bglGetCompressedTexImageARB = NULL;
|
|
|
|
|
|
|
|
// Fog
|
|
|
|
bglFogf = NULL;
|
|
|
|
bglFogi = NULL;
|
|
|
|
bglFogfv = NULL;
|
|
|
|
|
2006-09-27 02:23:27 +00:00
|
|
|
// Display Lists
|
2006-10-15 18:51:41 +00:00
|
|
|
bglNewList = NULL;
|
|
|
|
bglEndList = NULL;
|
|
|
|
bglCallList = NULL;
|
2006-12-31 06:32:04 +00:00
|
|
|
bglDeleteLists = NULL;
|
2006-09-27 02:23:27 +00:00
|
|
|
|
|
|
|
// Vertex Arrays
|
|
|
|
bglEnableClientState = NULL;
|
|
|
|
bglDisableClientState = NULL;
|
|
|
|
bglVertexPointer = NULL;
|
|
|
|
bglTexCoordPointer = NULL;
|
|
|
|
bglDrawElements = NULL;
|
|
|
|
|
2006-10-04 09:54:25 +00:00
|
|
|
// Stencil Buffer
|
|
|
|
bglClearStencil = NULL;
|
|
|
|
bglStencilOp = NULL;
|
|
|
|
bglStencilFunc = NULL;
|
|
|
|
|
2006-12-31 06:32:04 +00:00
|
|
|
// GPU Programs
|
|
|
|
bglGenProgramsARB = NULL;
|
|
|
|
bglBindProgramARB = NULL;
|
|
|
|
bglProgramStringARB = NULL;
|
2007-01-06 01:29:45 +00:00
|
|
|
bglDeleteProgramsARB= NULL;
|
2006-12-31 06:32:04 +00:00
|
|
|
|
|
|
|
// Multitexturing
|
2007-03-03 23:09:40 +00:00
|
|
|
bglActiveTextureARB = NULL;
|
|
|
|
bglClientActiveTextureARB = NULL;
|
|
|
|
bglMultiTexCoord2dARB = NULL;
|
|
|
|
bglMultiTexCoord2fARB = NULL;
|
2006-12-31 06:32:04 +00:00
|
|
|
|
2007-01-06 01:29:45 +00:00
|
|
|
// Frame Buffer Objects
|
|
|
|
bglGenFramebuffersEXT = NULL;
|
2007-12-12 17:42:14 +00:00
|
|
|
bglBindFramebufferEXT = NULL;
|
|
|
|
bglFramebufferTexture2DEXT = NULL;
|
|
|
|
bglCheckFramebufferStatusEXT = NULL;
|
|
|
|
bglDeleteFramebuffersEXT = NULL;
|
|
|
|
|
|
|
|
// Vertex Buffer Objects
|
|
|
|
bglGenBuffersARB = NULL;
|
|
|
|
bglBindBufferARB = NULL;
|
|
|
|
bglDeleteBuffersARB = NULL;
|
2007-03-08 03:07:10 +00:00
|
|
|
bglBufferDataARB = NULL;
|
|
|
|
bglMapBufferARB = NULL;
|
|
|
|
bglUnmapBufferARB = NULL;
|
2007-01-06 01:29:45 +00:00
|
|
|
|
2006-04-23 06:44:19 +00:00
|
|
|
#ifdef RENDERTYPEWIN
|
2006-04-24 19:04:22 +00:00
|
|
|
bwglCreateContext = NULL;
|
|
|
|
bwglDeleteContext = NULL;
|
|
|
|
bwglGetProcAddress = NULL;
|
|
|
|
bwglMakeCurrent = NULL;
|
|
|
|
|
|
|
|
bwglSwapBuffers = NULL;
|
|
|
|
bwglChoosePixelFormat = NULL;
|
|
|
|
bwglDescribePixelFormat = NULL;
|
|
|
|
bwglGetPixelFormat = NULL;
|
|
|
|
bwglSetPixelFormat = NULL;
|
2006-04-23 06:44:19 +00:00
|
|
|
#endif
|
|
|
|
|
2006-04-24 19:04:22 +00:00
|
|
|
return 0;
|
2006-04-23 06:44:19 +00:00
|
|
|
}
|
|
|
|
|
2007-01-16 03:19:04 +00:00
|
|
|
static void * glugetproc_(const char *s, int *err, int fatal)
|
|
|
|
{
|
|
|
|
void *t;
|
|
|
|
#if defined _WIN32
|
|
|
|
t = (void*)GetProcAddress(hGLUDLL,s);
|
|
|
|
#else
|
|
|
|
t = (void*)dlsym(gluhandle,s);
|
|
|
|
#endif
|
2007-12-12 17:42:14 +00:00
|
|
|
if (!t && fatal)
|
|
|
|
{
|
2007-01-16 03:19:04 +00:00
|
|
|
initprintf("Failed to find %s in %s\n", s, glulibrary);
|
|
|
|
*err = 1;
|
|
|
|
}
|
|
|
|
return t;
|
|
|
|
}
|
|
|
|
#define GLUGETPROC(s) glugetproc_(s,&err,1)
|
|
|
|
#define GLUGETPROCSOFT(s) glugetproc_(s,&err,0)
|
|
|
|
|
|
|
|
int loadglulibrary(const char *driver)
|
|
|
|
{
|
|
|
|
void *t;
|
|
|
|
int err=0;
|
|
|
|
|
|
|
|
#ifdef RENDERTYPEWIN
|
|
|
|
if (hGLUDLL) return 0;
|
|
|
|
#endif
|
|
|
|
|
2007-12-12 17:42:14 +00:00
|
|
|
if (!driver)
|
|
|
|
{
|
2007-01-16 03:19:04 +00:00
|
|
|
#ifdef _WIN32
|
|
|
|
driver = "GLU32.DLL";
|
|
|
|
#elif defined __APPLE__
|
|
|
|
driver = "/System/Library/Frameworks/OpenGL.framework/OpenGL"; // FIXME: like I know anything about Apple. Hah.
|
|
|
|
#else
|
|
|
|
driver = "libGLU.so";
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
initprintf("Loading %s\n",driver);
|
|
|
|
|
|
|
|
#if defined _WIN32
|
|
|
|
hGLUDLL = LoadLibrary(driver);
|
|
|
|
if (!hGLUDLL) return -1;
|
|
|
|
#else
|
|
|
|
gluhandle = dlopen(driver, RTLD_NOW|RTLD_GLOBAL);
|
2007-05-17 19:31:14 +00:00
|
|
|
if (!gluhandle) return -1;
|
2007-01-16 03:19:04 +00:00
|
|
|
#endif
|
|
|
|
glulibrary = strdup(driver);
|
|
|
|
|
|
|
|
bgluTessBeginContour = GLUGETPROC("gluTessBeginContour");
|
|
|
|
bgluTessBeginPolygon = GLUGETPROC("gluTessBeginPolygon");
|
|
|
|
bgluTessCallback = GLUGETPROC("gluTessCallback");
|
|
|
|
bgluTessEndContour = GLUGETPROC("gluTessEndContour");
|
|
|
|
bgluTessEndPolygon = GLUGETPROC("gluTessEndPolygon");
|
|
|
|
bgluTessNormal = GLUGETPROC("gluTessNormal");
|
|
|
|
bgluTessProperty = GLUGETPROC("gluTessProperty");
|
|
|
|
bgluTessVertex = GLUGETPROC("gluTessVertex");
|
|
|
|
bgluNewTess = GLUGETPROC("gluNewTess");
|
2007-07-01 06:32:03 +00:00
|
|
|
|
2007-01-16 03:19:04 +00:00
|
|
|
bgluPerspective = GLUGETPROC("gluPerspective");
|
2007-07-01 06:32:03 +00:00
|
|
|
|
2007-01-16 03:19:04 +00:00
|
|
|
bgluErrorString = GLUGETPROC("gluErrorString");
|
|
|
|
|
2007-07-01 06:32:03 +00:00
|
|
|
bgluProject = GLUGETPROC("gluProject");
|
|
|
|
|
2007-01-16 03:19:04 +00:00
|
|
|
if (err) unloadglulibrary();
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
|
|
|
int unloadglulibrary(void)
|
|
|
|
{
|
|
|
|
#ifdef RENDERTYPEWIN
|
|
|
|
if (!hGLUDLL) return 0;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
free(glulibrary);
|
|
|
|
glulibrary = NULL;
|
|
|
|
|
|
|
|
#ifdef RENDERTYPEWIN
|
|
|
|
FreeLibrary(hGLUDLL);
|
|
|
|
hGLUDLL = NULL;
|
|
|
|
#else
|
|
|
|
if (gluhandle) dlclose(gluhandle);
|
|
|
|
gluhandle = NULL;
|
|
|
|
#endif
|
|
|
|
|
2007-07-01 06:32:03 +00:00
|
|
|
bgluTessBeginContour = NULL;
|
|
|
|
bgluTessBeginPolygon = NULL;
|
|
|
|
bgluTessCallback = NULL;
|
|
|
|
bgluTessEndContour = NULL;
|
|
|
|
bgluTessEndPolygon = NULL;
|
|
|
|
bgluTessNormal = NULL;
|
|
|
|
bgluTessProperty = NULL;
|
|
|
|
bgluTessVertex = NULL;
|
|
|
|
bgluNewTess = NULL;
|
|
|
|
|
|
|
|
bgluPerspective = NULL;
|
|
|
|
|
|
|
|
bgluErrorString = NULL;
|
|
|
|
|
|
|
|
bgluProject = NULL;
|
2007-12-12 17:42:14 +00:00
|
|
|
|
2007-01-16 03:19:04 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2006-04-23 06:44:19 +00:00
|
|
|
#endif
|
|
|
|
|