Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
210 lines (175 loc) · 5.59 KB

testdyngl.c

File metadata and controls

210 lines (175 loc) · 5.59 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 :
Feb 21, 2004
Feb 21, 2004
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
*
* 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"
May 11, 2006
May 11, 2006
22
23
24
25
#ifdef __MACOS__
#define HAVE_OPENGL
#endif
26
27
28
29
#ifdef HAVE_OPENGL
#include "SDL_opengl.h"
Sep 28, 2005
Sep 28, 2005
30
/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
Jul 10, 2006
Jul 10, 2006
31
32
static void
quit(int rc)
Sep 28, 2005
Sep 28, 2005
33
{
Jul 10, 2006
Jul 10, 2006
34
35
SDL_Quit();
exit(rc);
Sep 28, 2005
Sep 28, 2005
36
37
}
Jul 10, 2006
Jul 10, 2006
38
39
void *
get_funcaddr(const char *p)
Jul 10, 2006
Jul 10, 2006
41
42
43
44
45
46
47
48
void *f = SDL_GL_GetProcAddress(p);
if (f) {
return f;
} else {
printf("Unable to get function pointer for %s\n", p);
quit(1);
}
return NULL;
49
50
51
52
}
typedef struct
{
Jul 10, 2006
Jul 10, 2006
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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);
Sep 28, 2009
Sep 28, 2009
71
const GLubyte* (APIENTRY * glGetString) (GLenum);
72
73
74
}
glfuncs;
Jul 10, 2006
Jul 10, 2006
75
76
void
init_glfuncs(glfuncs * f)
Jul 10, 2006
Jul 10, 2006
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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");
Sep 28, 2009
Sep 28, 2009
95
96
97
98
99
100
f->glGetString = get_funcaddr("glGetString");
printf("Vendor : %s\n", f->glGetString(GL_VENDOR));
printf("Renderer : %s\n", f->glGetString(GL_RENDERER));
printf("Version : %s\n", f->glGetString(GL_VERSION));
printf("Extensions : %s\n", f->glGetString(GL_EXTENSIONS));
101
102
103
104
}
#define NB_PIXELS 1000
Jul 10, 2006
Jul 10, 2006
105
106
int
main(int argc, char *argv[])
Jul 10, 2006
Jul 10, 2006
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
glfuncs f;
int i;
SDL_Event event;
int done = 0;
GLfloat pixels[NB_PIXELS * 3];
const char *gl_library = NULL; /* Use the default GL library */
if (argv[1]) {
gl_library = argv[1];
}
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
printf("Unable to init SDL : %s\n", SDL_GetError());
return (1);
}
if (SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1) < 0) {
printf("Unable to set GL attribute : %s\n", SDL_GetError());
quit(1);
}
if (SDL_GL_LoadLibrary(gl_library) < 0) {
printf("Unable to dynamically open GL lib : %s\n", SDL_GetError());
quit(1);
}
if (SDL_SetVideoMode(640, 480, 0, SDL_OPENGL) == NULL) {
printf("Unable to open video mode : %s\n", SDL_GetError());
quit(1);
}
/* Set the window manager title bar */
SDL_WM_SetCaption("SDL Dynamic OpenGL Loading Test", "testdyngl");
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)) {
Mar 7, 2008
Mar 7, 2008
190
if (event.type == SDL_KEYDOWN)
Jul 10, 2006
Jul 10, 2006
191
192
193
194
done = 1;
}
SDL_Delay(20);
Aug 27, 2008
Aug 27, 2008
195
} while (!done);
Jul 10, 2006
Jul 10, 2006
196
197
198
SDL_Quit();
return 0;
199
200
201
202
}
#else /* HAVE_OPENGL */
Jul 10, 2006
Jul 10, 2006
203
204
int
main(int argc, char *argv[])
Jul 10, 2006
Jul 10, 2006
206
207
printf("No OpenGL support on this system\n");
return 1;
208
209
210
}
#endif /* HAVE_OPENGL */