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