test/testdyngl.c
author Sam Lantinga <slouken@libsdl.org>
Tue, 17 Feb 2004 22:04:44 +0000
changeset 842 0eec9985767d
parent 839 7b255f0290da
child 847 0afe0e38e02c
permissions -rw-r--r--
Load the correct library on Windows
     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
     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 HAVE_OPENGL
    23 
    24 #include "SDL_opengl.h"
    25 
    26 void* get_funcaddr(const char* p)
    27 {
    28 	void* f=SDL_GL_GetProcAddress(p);
    29 	if (f)
    30 	{
    31 		return f;
    32 	}
    33 	else
    34 	{
    35 		printf("Unable to get function pointer for %s\n",p);
    36 		exit(1);
    37 	}
    38 }
    39 
    40 typedef struct
    41 {
    42 	void(*glBegin)(GLenum);
    43 	void(*glEnd)();
    44 	void(*glVertex3f)(GLfloat, GLfloat, GLfloat);
    45 	void(*glClearColor)(GLfloat, GLfloat, GLfloat, GLfloat);
    46 	void(*glClear)(GLbitfield);
    47 	void(*glDisable)(GLenum);
    48 	void(*glEnable)(GLenum);
    49 	void(*glColor4ub)(GLubyte,GLubyte,GLubyte,GLubyte);
    50 	void(*glPointSize)(GLfloat);
    51 	void(*glHint)(GLenum,GLenum);
    52 	void(*glBlendFunc)(GLenum,GLenum);
    53 	void(*glMatrixMode)(GLenum);
    54 	void(*glLoadIdentity)();
    55 	void(*glOrtho)(GLdouble,GLdouble,GLdouble,GLdouble,GLdouble,GLdouble);
    56 	void(*glRotatef)(GLfloat,GLfloat,GLfloat,GLfloat);
    57 	void(*glViewport)(GLint,GLint,GLsizei,GLsizei);
    58 	void(*glFogf)(GLenum,GLfloat);
    59 }
    60 glfuncs;
    61 
    62 void init_glfuncs(glfuncs* f)
    63 {
    64 	f->glBegin=get_funcaddr("glBegin");
    65 	f->glEnd=get_funcaddr("glEnd");
    66 	f->glVertex3f=get_funcaddr("glVertex3f");
    67 	f->glClearColor=get_funcaddr("glClearColor");
    68 	f->glClear=get_funcaddr("glClear");
    69 	f->glDisable=get_funcaddr("glDisable");
    70 	f->glEnable=get_funcaddr("glEnable");
    71 	f->glColor4ub=get_funcaddr("glColor4ub");
    72 	f->glPointSize=get_funcaddr("glPointSize");
    73 	f->glHint=get_funcaddr("glHint");
    74 	f->glBlendFunc=get_funcaddr("glBlendFunc");
    75 	f->glMatrixMode=get_funcaddr("glMatrixMode");
    76 	f->glLoadIdentity=get_funcaddr("glLoadIdentity");
    77 	f->glOrtho=get_funcaddr("glOrtho");
    78 	f->glRotatef=get_funcaddr("glRotatef");
    79 	f->glViewport=get_funcaddr("glViewport");
    80 	f->glFogf=get_funcaddr("glFogf");
    81 }
    82 
    83 #define NB_PIXELS 1000
    84 
    85 int main(int argc,char *argv[])
    86 {
    87 	glfuncs f;
    88 	int i;
    89 	SDL_Event event;
    90 	int done=0;
    91 	GLfloat pixels[NB_PIXELS*3];
    92 #ifdef _WIN32
    93 	char *gl_library = "OpenGL32.DLL";
    94 #else
    95 	char *gl_library = "libGL.so.1";
    96 #endif
    97 	
    98 	if (argv[1]) {
    99 		gl_library = argv[1];
   100 	}
   101 	
   102 	if (SDL_Init(SDL_INIT_VIDEO)<0)
   103 	{
   104 		printf("Unable to init SDL : %s\n",SDL_GetError());
   105 		exit(1);
   106 	}
   107 	
   108 	if (SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1)<0)
   109 	{
   110 		printf("Unable to set GL attribute : %s\n",SDL_GetError());
   111 		exit(1);
   112 	}
   113 	
   114 	if (SDL_GL_LoadLibrary(gl_library)<0)
   115 	{
   116 		printf("Unable to dynamically open GL lib : %s\n",SDL_GetError());
   117 		exit(1);
   118 	}
   119 
   120 	if (SDL_SetVideoMode(640,480,0,SDL_OPENGL)==NULL)
   121 	{
   122 		printf("Unable to open video mode : %s\n",SDL_GetError());
   123 		exit(1);
   124 	}
   125 
   126 	init_glfuncs(&f);
   127 
   128 	for(i=0;i<NB_PIXELS;i++)
   129 	{
   130 		pixels[3*i]=rand()%250-125;
   131 		pixels[3*i+1]=rand()%250-125;
   132 		pixels[3*i+2]=rand()%250-125;
   133 	}
   134 	
   135 	f.glViewport(0,0,640,480);
   136 	
   137 	f.glMatrixMode(GL_PROJECTION);
   138 	f.glLoadIdentity();
   139 	f.glOrtho(-100,100,-100,100,-500,500);
   140 	
   141 	f.glMatrixMode(GL_MODELVIEW);
   142 	f.glLoadIdentity();
   143 	
   144 	f.glEnable(GL_DEPTH_TEST);
   145 	f.glDisable(GL_TEXTURE_2D);
   146 	f.glEnable(GL_BLEND);
   147 	f.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   148 	
   149 	f.glClearColor(0.0f,0.0f,0.0f,0.0f);
   150 	f.glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
   151 	
   152 	f.glEnable(GL_POINT_SMOOTH);
   153 	f.glHint(GL_POINT_SMOOTH_HINT,GL_NICEST);
   154 	f.glPointSize(5.0f);
   155 	f.glEnable(GL_FOG);
   156 	f.glFogf(GL_FOG_START,-500);
   157 	f.glFogf(GL_FOG_END,500);
   158 	f.glFogf(GL_FOG_DENSITY,0.005);
   159 	
   160 	do
   161 	{
   162 		f.glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
   163 		
   164 		f.glRotatef(2.0,1.0,1.0,1.0);
   165 		f.glRotatef(1.0,0.0,1.0,1.0);
   166 		
   167 		f.glColor4ub(255,255,255,255);
   168 		f.glBegin(GL_POINTS);
   169 		for(i=0;i<NB_PIXELS;i++)
   170 		{
   171 			f.glVertex3f(pixels[3*i],pixels[3*i+1],pixels[3*i+2]);
   172 		}
   173 		f.glEnd();
   174 		SDL_GL_SwapBuffers();
   175 
   176 		while(SDL_PollEvent(&event))
   177 		{
   178 			if(event.type & SDL_KEYDOWN)
   179 				done=1;
   180 		}
   181 
   182 		SDL_Delay(20);
   183 	}
   184 	while(!done);
   185 	
   186 	SDL_Quit();
   187 	return 0;
   188 }
   189 
   190 #else /* HAVE_OPENGL */
   191 
   192 int main(int argc, char *argv[])
   193 {
   194 	printf("No OpenGL support on this system\n");
   195 	return 1;
   196 }
   197 
   198 #endif /* HAVE_OPENGL */