slouken@839
|
1 |
/*
|
slouken@839
|
2 |
* Small SDL example to demonstrate dynamically loading
|
slouken@839
|
3 |
* OpenGL lib and functions
|
slouken@839
|
4 |
*
|
slouken@839
|
5 |
* (FYI it was supposed to look like snow in the wind or something...)
|
slouken@839
|
6 |
*
|
slouken@839
|
7 |
* Compile with :
|
slouken@847
|
8 |
* gcc testdyngl.c `sdl-config --libs --cflags` -o testdyngl -DHAVE_OPENGL
|
slouken@839
|
9 |
*
|
slouken@839
|
10 |
* You can specify a different OpenGL lib on the command line, i.e. :
|
slouken@839
|
11 |
* ./testdyngl /usr/X11R6/lib/libGL.so.1.2
|
slouken@839
|
12 |
* or
|
slouken@839
|
13 |
* ./testdyngl /usr/lib/libGL.so.1.0.4496
|
slouken@839
|
14 |
*
|
slouken@839
|
15 |
*/
|
slouken@839
|
16 |
|
slouken@839
|
17 |
#include <stdio.h>
|
slouken@839
|
18 |
#include <stdlib.h>
|
slouken@839
|
19 |
|
slouken@839
|
20 |
#include "SDL.h"
|
slouken@839
|
21 |
|
slouken@839
|
22 |
#ifdef HAVE_OPENGL
|
slouken@839
|
23 |
|
slouken@839
|
24 |
#include "SDL_opengl.h"
|
slouken@839
|
25 |
|
icculus@1151
|
26 |
/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
|
icculus@1151
|
27 |
static void quit(int rc)
|
icculus@1151
|
28 |
{
|
icculus@1151
|
29 |
SDL_Quit();
|
icculus@1151
|
30 |
exit(rc);
|
icculus@1151
|
31 |
}
|
icculus@1151
|
32 |
|
slouken@839
|
33 |
void* get_funcaddr(const char* p)
|
slouken@839
|
34 |
{
|
slouken@839
|
35 |
void* f=SDL_GL_GetProcAddress(p);
|
slouken@839
|
36 |
if (f)
|
slouken@839
|
37 |
{
|
slouken@839
|
38 |
return f;
|
slouken@839
|
39 |
}
|
slouken@839
|
40 |
else
|
slouken@839
|
41 |
{
|
slouken@839
|
42 |
printf("Unable to get function pointer for %s\n",p);
|
icculus@1151
|
43 |
quit(1);
|
slouken@839
|
44 |
}
|
slouken@839
|
45 |
}
|
slouken@839
|
46 |
|
slouken@839
|
47 |
typedef struct
|
slouken@839
|
48 |
{
|
slouken@885
|
49 |
void(APIENTRY*glBegin)(GLenum);
|
slouken@885
|
50 |
void(APIENTRY*glEnd)();
|
slouken@885
|
51 |
void(APIENTRY*glVertex3f)(GLfloat, GLfloat, GLfloat);
|
slouken@885
|
52 |
void(APIENTRY*glClearColor)(GLfloat, GLfloat, GLfloat, GLfloat);
|
slouken@885
|
53 |
void(APIENTRY*glClear)(GLbitfield);
|
slouken@885
|
54 |
void(APIENTRY*glDisable)(GLenum);
|
slouken@885
|
55 |
void(APIENTRY*glEnable)(GLenum);
|
slouken@885
|
56 |
void(APIENTRY*glColor4ub)(GLubyte,GLubyte,GLubyte,GLubyte);
|
slouken@885
|
57 |
void(APIENTRY*glPointSize)(GLfloat);
|
slouken@885
|
58 |
void(APIENTRY*glHint)(GLenum,GLenum);
|
slouken@885
|
59 |
void(APIENTRY*glBlendFunc)(GLenum,GLenum);
|
slouken@885
|
60 |
void(APIENTRY*glMatrixMode)(GLenum);
|
slouken@885
|
61 |
void(APIENTRY*glLoadIdentity)();
|
slouken@885
|
62 |
void(APIENTRY*glOrtho)(GLdouble,GLdouble,GLdouble,GLdouble,GLdouble,GLdouble);
|
slouken@885
|
63 |
void(APIENTRY*glRotatef)(GLfloat,GLfloat,GLfloat,GLfloat);
|
slouken@885
|
64 |
void(APIENTRY*glViewport)(GLint,GLint,GLsizei,GLsizei);
|
slouken@885
|
65 |
void(APIENTRY*glFogf)(GLenum,GLfloat);
|
slouken@839
|
66 |
}
|
slouken@839
|
67 |
glfuncs;
|
slouken@839
|
68 |
|
slouken@839
|
69 |
void init_glfuncs(glfuncs* f)
|
slouken@839
|
70 |
{
|
slouken@839
|
71 |
f->glBegin=get_funcaddr("glBegin");
|
slouken@839
|
72 |
f->glEnd=get_funcaddr("glEnd");
|
slouken@839
|
73 |
f->glVertex3f=get_funcaddr("glVertex3f");
|
slouken@839
|
74 |
f->glClearColor=get_funcaddr("glClearColor");
|
slouken@839
|
75 |
f->glClear=get_funcaddr("glClear");
|
slouken@839
|
76 |
f->glDisable=get_funcaddr("glDisable");
|
slouken@839
|
77 |
f->glEnable=get_funcaddr("glEnable");
|
slouken@839
|
78 |
f->glColor4ub=get_funcaddr("glColor4ub");
|
slouken@839
|
79 |
f->glPointSize=get_funcaddr("glPointSize");
|
slouken@839
|
80 |
f->glHint=get_funcaddr("glHint");
|
slouken@839
|
81 |
f->glBlendFunc=get_funcaddr("glBlendFunc");
|
slouken@839
|
82 |
f->glMatrixMode=get_funcaddr("glMatrixMode");
|
slouken@839
|
83 |
f->glLoadIdentity=get_funcaddr("glLoadIdentity");
|
slouken@839
|
84 |
f->glOrtho=get_funcaddr("glOrtho");
|
slouken@839
|
85 |
f->glRotatef=get_funcaddr("glRotatef");
|
slouken@839
|
86 |
f->glViewport=get_funcaddr("glViewport");
|
slouken@839
|
87 |
f->glFogf=get_funcaddr("glFogf");
|
slouken@839
|
88 |
}
|
slouken@839
|
89 |
|
slouken@839
|
90 |
#define NB_PIXELS 1000
|
slouken@839
|
91 |
|
slouken@839
|
92 |
int main(int argc,char *argv[])
|
slouken@839
|
93 |
{
|
slouken@839
|
94 |
glfuncs f;
|
slouken@839
|
95 |
int i;
|
slouken@839
|
96 |
SDL_Event event;
|
slouken@839
|
97 |
int done=0;
|
slouken@839
|
98 |
GLfloat pixels[NB_PIXELS*3];
|
slouken@1436
|
99 |
#if defined(__WIN32__)
|
slouken@1436
|
100 |
const char *gl_library = "OpenGL32.DLL";
|
slouken@1436
|
101 |
#elif defined(__MACOS__)
|
slouken@1436
|
102 |
const char *gl_library = "OpenGLLibrary";
|
slouken@1402
|
103 |
#elif defined(__MACOSX__)
|
slouken@1402
|
104 |
const char *gl_library = "/usr/X11R6/lib/libGL.1.dylib";
|
slouken@1436
|
105 |
#elif defined(__IRIX__)
|
slouken@1436
|
106 |
const char *gl_library = "libGL.so";
|
slouken@910
|
107 |
#elif defined(__QNXNTO__)
|
slouken@1402
|
108 |
const char *gl_library = "libGL.so.3";
|
slouken@842
|
109 |
#else
|
slouken@1402
|
110 |
const char *gl_library = "libGL.so.1";
|
slouken@842
|
111 |
#endif
|
slouken@1402
|
112 |
|
slouken@842
|
113 |
if (argv[1]) {
|
slouken@842
|
114 |
gl_library = argv[1];
|
slouken@839
|
115 |
}
|
slouken@839
|
116 |
|
slouken@842
|
117 |
if (SDL_Init(SDL_INIT_VIDEO)<0)
|
slouken@839
|
118 |
{
|
slouken@839
|
119 |
printf("Unable to init SDL : %s\n",SDL_GetError());
|
icculus@1151
|
120 |
return(1);
|
slouken@839
|
121 |
}
|
patmandin@990
|
122 |
|
slouken@839
|
123 |
if (SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1)<0)
|
slouken@839
|
124 |
{
|
slouken@839
|
125 |
printf("Unable to set GL attribute : %s\n",SDL_GetError());
|
icculus@1151
|
126 |
quit(1);
|
slouken@839
|
127 |
}
|
slouken@839
|
128 |
|
slouken@842
|
129 |
if (SDL_GL_LoadLibrary(gl_library)<0)
|
slouken@839
|
130 |
{
|
slouken@839
|
131 |
printf("Unable to dynamically open GL lib : %s\n",SDL_GetError());
|
icculus@1151
|
132 |
quit(1);
|
slouken@839
|
133 |
}
|
slouken@839
|
134 |
|
slouken@839
|
135 |
if (SDL_SetVideoMode(640,480,0,SDL_OPENGL)==NULL)
|
slouken@839
|
136 |
{
|
slouken@839
|
137 |
printf("Unable to open video mode : %s\n",SDL_GetError());
|
icculus@1151
|
138 |
quit(1);
|
slouken@839
|
139 |
}
|
slouken@839
|
140 |
|
slouken@910
|
141 |
/* Set the window manager title bar */
|
slouken@910
|
142 |
SDL_WM_SetCaption( "SDL Dynamic OpenGL Loading Test", "testdyngl" );
|
slouken@910
|
143 |
|
slouken@839
|
144 |
init_glfuncs(&f);
|
slouken@839
|
145 |
|
slouken@839
|
146 |
for(i=0;i<NB_PIXELS;i++)
|
slouken@839
|
147 |
{
|
slouken@839
|
148 |
pixels[3*i]=rand()%250-125;
|
slouken@839
|
149 |
pixels[3*i+1]=rand()%250-125;
|
slouken@839
|
150 |
pixels[3*i+2]=rand()%250-125;
|
slouken@839
|
151 |
}
|
slouken@839
|
152 |
|
slouken@839
|
153 |
f.glViewport(0,0,640,480);
|
slouken@839
|
154 |
|
slouken@839
|
155 |
f.glMatrixMode(GL_PROJECTION);
|
slouken@839
|
156 |
f.glLoadIdentity();
|
slouken@839
|
157 |
f.glOrtho(-100,100,-100,100,-500,500);
|
slouken@839
|
158 |
|
slouken@839
|
159 |
f.glMatrixMode(GL_MODELVIEW);
|
slouken@839
|
160 |
f.glLoadIdentity();
|
slouken@839
|
161 |
|
slouken@839
|
162 |
f.glEnable(GL_DEPTH_TEST);
|
slouken@839
|
163 |
f.glDisable(GL_TEXTURE_2D);
|
slouken@839
|
164 |
f.glEnable(GL_BLEND);
|
slouken@839
|
165 |
f.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
slouken@839
|
166 |
|
slouken@839
|
167 |
f.glClearColor(0.0f,0.0f,0.0f,0.0f);
|
slouken@839
|
168 |
f.glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
|
slouken@839
|
169 |
|
slouken@839
|
170 |
f.glEnable(GL_POINT_SMOOTH);
|
slouken@839
|
171 |
f.glHint(GL_POINT_SMOOTH_HINT,GL_NICEST);
|
slouken@839
|
172 |
f.glPointSize(5.0f);
|
slouken@839
|
173 |
f.glEnable(GL_FOG);
|
slouken@839
|
174 |
f.glFogf(GL_FOG_START,-500);
|
slouken@839
|
175 |
f.glFogf(GL_FOG_END,500);
|
slouken@839
|
176 |
f.glFogf(GL_FOG_DENSITY,0.005);
|
slouken@839
|
177 |
|
slouken@839
|
178 |
do
|
slouken@839
|
179 |
{
|
slouken@839
|
180 |
f.glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
|
slouken@839
|
181 |
|
slouken@839
|
182 |
f.glRotatef(2.0,1.0,1.0,1.0);
|
slouken@839
|
183 |
f.glRotatef(1.0,0.0,1.0,1.0);
|
slouken@839
|
184 |
|
slouken@839
|
185 |
f.glColor4ub(255,255,255,255);
|
slouken@839
|
186 |
f.glBegin(GL_POINTS);
|
slouken@839
|
187 |
for(i=0;i<NB_PIXELS;i++)
|
slouken@839
|
188 |
{
|
slouken@839
|
189 |
f.glVertex3f(pixels[3*i],pixels[3*i+1],pixels[3*i+2]);
|
slouken@839
|
190 |
}
|
slouken@839
|
191 |
f.glEnd();
|
slouken@839
|
192 |
SDL_GL_SwapBuffers();
|
slouken@839
|
193 |
|
slouken@839
|
194 |
while(SDL_PollEvent(&event))
|
slouken@839
|
195 |
{
|
slouken@839
|
196 |
if(event.type & SDL_KEYDOWN)
|
slouken@839
|
197 |
done=1;
|
slouken@839
|
198 |
}
|
slouken@839
|
199 |
|
slouken@839
|
200 |
SDL_Delay(20);
|
slouken@839
|
201 |
}
|
slouken@839
|
202 |
while(!done);
|
slouken@839
|
203 |
|
slouken@839
|
204 |
SDL_Quit();
|
slouken@839
|
205 |
return 0;
|
slouken@839
|
206 |
}
|
slouken@839
|
207 |
|
slouken@839
|
208 |
#else /* HAVE_OPENGL */
|
slouken@839
|
209 |
|
slouken@839
|
210 |
int main(int argc, char *argv[])
|
slouken@839
|
211 |
{
|
slouken@839
|
212 |
printf("No OpenGL support on this system\n");
|
slouken@839
|
213 |
return 1;
|
slouken@839
|
214 |
}
|
slouken@839
|
215 |
|
slouken@839
|
216 |
#endif /* HAVE_OPENGL */
|