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