Use consistent identifiers for the various platforms we support.
Make sure every source file includes SDL_config.h, so the proper system
headers are chosen.
2 * Small SDL example to demonstrate dynamically loading
3 * OpenGL lib and functions
5 * (FYI it was supposed to look like snow in the wind or something...)
8 * gcc testdyngl.c `sdl-config --libs --cflags` -o testdyngl -DHAVE_OPENGL
10 * You can specify a different OpenGL lib on the command line, i.e. :
11 * ./testdyngl /usr/X11R6/lib/libGL.so.1.2
13 * ./testdyngl /usr/lib/libGL.so.1.0.4496
24 #include "SDL_opengl.h"
26 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
27 static void quit(int rc)
33 void* get_funcaddr(const char* p)
35 void* f=SDL_GL_GetProcAddress(p);
42 printf("Unable to get function pointer for %s\n",p);
49 void(APIENTRY*glBegin)(GLenum);
50 void(APIENTRY*glEnd)();
51 void(APIENTRY*glVertex3f)(GLfloat, GLfloat, GLfloat);
52 void(APIENTRY*glClearColor)(GLfloat, GLfloat, GLfloat, GLfloat);
53 void(APIENTRY*glClear)(GLbitfield);
54 void(APIENTRY*glDisable)(GLenum);
55 void(APIENTRY*glEnable)(GLenum);
56 void(APIENTRY*glColor4ub)(GLubyte,GLubyte,GLubyte,GLubyte);
57 void(APIENTRY*glPointSize)(GLfloat);
58 void(APIENTRY*glHint)(GLenum,GLenum);
59 void(APIENTRY*glBlendFunc)(GLenum,GLenum);
60 void(APIENTRY*glMatrixMode)(GLenum);
61 void(APIENTRY*glLoadIdentity)();
62 void(APIENTRY*glOrtho)(GLdouble,GLdouble,GLdouble,GLdouble,GLdouble,GLdouble);
63 void(APIENTRY*glRotatef)(GLfloat,GLfloat,GLfloat,GLfloat);
64 void(APIENTRY*glViewport)(GLint,GLint,GLsizei,GLsizei);
65 void(APIENTRY*glFogf)(GLenum,GLfloat);
69 void init_glfuncs(glfuncs* f)
71 f->glBegin=get_funcaddr("glBegin");
72 f->glEnd=get_funcaddr("glEnd");
73 f->glVertex3f=get_funcaddr("glVertex3f");
74 f->glClearColor=get_funcaddr("glClearColor");
75 f->glClear=get_funcaddr("glClear");
76 f->glDisable=get_funcaddr("glDisable");
77 f->glEnable=get_funcaddr("glEnable");
78 f->glColor4ub=get_funcaddr("glColor4ub");
79 f->glPointSize=get_funcaddr("glPointSize");
80 f->glHint=get_funcaddr("glHint");
81 f->glBlendFunc=get_funcaddr("glBlendFunc");
82 f->glMatrixMode=get_funcaddr("glMatrixMode");
83 f->glLoadIdentity=get_funcaddr("glLoadIdentity");
84 f->glOrtho=get_funcaddr("glOrtho");
85 f->glRotatef=get_funcaddr("glRotatef");
86 f->glViewport=get_funcaddr("glViewport");
87 f->glFogf=get_funcaddr("glFogf");
90 #define NB_PIXELS 1000
92 int main(int argc,char *argv[])
98 GLfloat pixels[NB_PIXELS*3];
100 const char *gl_library = "libGL.so";
101 #elif defined(__MACOSX__)
102 const char *gl_library = "/usr/X11R6/lib/libGL.1.dylib";
103 #elif defined(__QNXNTO__)
104 const char *gl_library = "libGL.so.3";
105 #elif defined(__WIN32__)
106 const char *gl_library = "OpenGL32.DLL";
108 const char *gl_library = "libGL.so.1";
112 gl_library = argv[1];
115 if (SDL_Init(SDL_INIT_VIDEO)<0)
117 printf("Unable to init SDL : %s\n",SDL_GetError());
121 if (SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1)<0)
123 printf("Unable to set GL attribute : %s\n",SDL_GetError());
127 if (SDL_GL_LoadLibrary(gl_library)<0)
129 printf("Unable to dynamically open GL lib : %s\n",SDL_GetError());
133 if (SDL_SetVideoMode(640,480,0,SDL_OPENGL)==NULL)
135 printf("Unable to open video mode : %s\n",SDL_GetError());
139 /* Set the window manager title bar */
140 SDL_WM_SetCaption( "SDL Dynamic OpenGL Loading Test", "testdyngl" );
144 for(i=0;i<NB_PIXELS;i++)
146 pixels[3*i]=rand()%250-125;
147 pixels[3*i+1]=rand()%250-125;
148 pixels[3*i+2]=rand()%250-125;
151 f.glViewport(0,0,640,480);
153 f.glMatrixMode(GL_PROJECTION);
155 f.glOrtho(-100,100,-100,100,-500,500);
157 f.glMatrixMode(GL_MODELVIEW);
160 f.glEnable(GL_DEPTH_TEST);
161 f.glDisable(GL_TEXTURE_2D);
162 f.glEnable(GL_BLEND);
163 f.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
165 f.glClearColor(0.0f,0.0f,0.0f,0.0f);
166 f.glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
168 f.glEnable(GL_POINT_SMOOTH);
169 f.glHint(GL_POINT_SMOOTH_HINT,GL_NICEST);
172 f.glFogf(GL_FOG_START,-500);
173 f.glFogf(GL_FOG_END,500);
174 f.glFogf(GL_FOG_DENSITY,0.005);
178 f.glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
180 f.glRotatef(2.0,1.0,1.0,1.0);
181 f.glRotatef(1.0,0.0,1.0,1.0);
183 f.glColor4ub(255,255,255,255);
184 f.glBegin(GL_POINTS);
185 for(i=0;i<NB_PIXELS;i++)
187 f.glVertex3f(pixels[3*i],pixels[3*i+1],pixels[3*i+2]);
190 SDL_GL_SwapBuffers();
192 while(SDL_PollEvent(&event))
194 if(event.type & SDL_KEYDOWN)
206 #else /* HAVE_OPENGL */
208 int main(int argc, char *argv[])
210 printf("No OpenGL support on this system\n");
214 #endif /* HAVE_OPENGL */