test/testdyngl.c
author Sam Lantinga <slouken@libsdl.org>
Tue, 09 May 2006 07:26:58 +0000
changeset 1790 828a17e05192
parent 1440 ae78374ac894
child 1659 14717b52abc0
permissions -rw-r--r--
Date: Mon, 8 May 2006 14:19:30 -0700
From: Bob Ippolito
Subject: SDL trunk (r2346) and Mac OS X

The current state of the trunk doesn't quite compile on Mac OS X,
I've attached a series of patches that gets it to compile and kills a
few warnings.

sdl-trunk-r2346-dlcompat-warnings.diff:
The dlcompat thing is just loaded with incorrect type signatures ..
some of them have changed since 10.2 and others are just flat wrong.
This puts it in sync with the latest headers. People on 10.2 will get
the warnings instead of people with new kits.
     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 HAVE_OPENGL
    23 
    24 #include "SDL_opengl.h"
    25 
    26 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
    27 static void quit(int rc)
    28 {
    29 	SDL_Quit();
    30 	exit(rc);
    31 }
    32 
    33 void* get_funcaddr(const char* p)
    34 {
    35 	void* f=SDL_GL_GetProcAddress(p);
    36 	if (f)
    37 	{
    38 		return f;
    39 	}
    40 	else
    41 	{
    42 		printf("Unable to get function pointer for %s\n",p);
    43 		quit(1);
    44 	}
    45 	return NULL;
    46 }
    47 
    48 typedef struct
    49 {
    50 	void(APIENTRY*glBegin)(GLenum);
    51 	void(APIENTRY*glEnd)();
    52 	void(APIENTRY*glVertex3f)(GLfloat, GLfloat, GLfloat);
    53 	void(APIENTRY*glClearColor)(GLfloat, GLfloat, GLfloat, GLfloat);
    54 	void(APIENTRY*glClear)(GLbitfield);
    55 	void(APIENTRY*glDisable)(GLenum);
    56 	void(APIENTRY*glEnable)(GLenum);
    57 	void(APIENTRY*glColor4ub)(GLubyte,GLubyte,GLubyte,GLubyte);
    58 	void(APIENTRY*glPointSize)(GLfloat);
    59 	void(APIENTRY*glHint)(GLenum,GLenum);
    60 	void(APIENTRY*glBlendFunc)(GLenum,GLenum);
    61 	void(APIENTRY*glMatrixMode)(GLenum);
    62 	void(APIENTRY*glLoadIdentity)();
    63 	void(APIENTRY*glOrtho)(GLdouble,GLdouble,GLdouble,GLdouble,GLdouble,GLdouble);
    64 	void(APIENTRY*glRotatef)(GLfloat,GLfloat,GLfloat,GLfloat);
    65 	void(APIENTRY*glViewport)(GLint,GLint,GLsizei,GLsizei);
    66 	void(APIENTRY*glFogf)(GLenum,GLfloat);
    67 }
    68 glfuncs;
    69 
    70 void init_glfuncs(glfuncs* f)
    71 {
    72 	f->glBegin=get_funcaddr("glBegin");
    73 	f->glEnd=get_funcaddr("glEnd");
    74 	f->glVertex3f=get_funcaddr("glVertex3f");
    75 	f->glClearColor=get_funcaddr("glClearColor");
    76 	f->glClear=get_funcaddr("glClear");
    77 	f->glDisable=get_funcaddr("glDisable");
    78 	f->glEnable=get_funcaddr("glEnable");
    79 	f->glColor4ub=get_funcaddr("glColor4ub");
    80 	f->glPointSize=get_funcaddr("glPointSize");
    81 	f->glHint=get_funcaddr("glHint");
    82 	f->glBlendFunc=get_funcaddr("glBlendFunc");
    83 	f->glMatrixMode=get_funcaddr("glMatrixMode");
    84 	f->glLoadIdentity=get_funcaddr("glLoadIdentity");
    85 	f->glOrtho=get_funcaddr("glOrtho");
    86 	f->glRotatef=get_funcaddr("glRotatef");
    87 	f->glViewport=get_funcaddr("glViewport");
    88 	f->glFogf=get_funcaddr("glFogf");
    89 }
    90 
    91 #define NB_PIXELS 1000
    92 
    93 int main(int argc,char *argv[])
    94 {
    95 	glfuncs f;
    96 	int i;
    97 	SDL_Event event;
    98 	int done=0;
    99 	GLfloat pixels[NB_PIXELS*3];
   100 	const char *gl_library = NULL; /* Use the default GL library */
   101 
   102 	if (argv[1]) {
   103 		gl_library = argv[1];
   104 	}
   105 	
   106 	if (SDL_Init(SDL_INIT_VIDEO)<0)
   107 	{
   108 		printf("Unable to init SDL : %s\n",SDL_GetError());
   109 		return(1);
   110 	}
   111 
   112 	if (SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1)<0)
   113 	{
   114 		printf("Unable to set GL attribute : %s\n",SDL_GetError());
   115 		quit(1);
   116 	}
   117 	
   118 	if (SDL_GL_LoadLibrary(gl_library)<0)
   119 	{
   120 		printf("Unable to dynamically open GL lib : %s\n",SDL_GetError());
   121 		quit(1);
   122 	}
   123 
   124 	if (SDL_SetVideoMode(640,480,0,SDL_OPENGL)==NULL)
   125 	{
   126 		printf("Unable to open video mode : %s\n",SDL_GetError());
   127 		quit(1);
   128 	}
   129 
   130 	/* Set the window manager title bar */
   131 	SDL_WM_SetCaption( "SDL Dynamic OpenGL Loading Test", "testdyngl" );
   132 
   133 	init_glfuncs(&f);
   134 
   135 	for(i=0;i<NB_PIXELS;i++)
   136 	{
   137 		pixels[3*i]=rand()%250-125;
   138 		pixels[3*i+1]=rand()%250-125;
   139 		pixels[3*i+2]=rand()%250-125;
   140 	}
   141 	
   142 	f.glViewport(0,0,640,480);
   143 	
   144 	f.glMatrixMode(GL_PROJECTION);
   145 	f.glLoadIdentity();
   146 	f.glOrtho(-100,100,-100,100,-500,500);
   147 	
   148 	f.glMatrixMode(GL_MODELVIEW);
   149 	f.glLoadIdentity();
   150 	
   151 	f.glEnable(GL_DEPTH_TEST);
   152 	f.glDisable(GL_TEXTURE_2D);
   153 	f.glEnable(GL_BLEND);
   154 	f.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   155 	
   156 	f.glClearColor(0.0f,0.0f,0.0f,0.0f);
   157 	f.glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
   158 	
   159 	f.glEnable(GL_POINT_SMOOTH);
   160 	f.glHint(GL_POINT_SMOOTH_HINT,GL_NICEST);
   161 	f.glPointSize(5.0f);
   162 	f.glEnable(GL_FOG);
   163 	f.glFogf(GL_FOG_START,-500);
   164 	f.glFogf(GL_FOG_END,500);
   165 	f.glFogf(GL_FOG_DENSITY,0.005);
   166 	
   167 	do
   168 	{
   169 		f.glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
   170 		
   171 		f.glRotatef(2.0,1.0,1.0,1.0);
   172 		f.glRotatef(1.0,0.0,1.0,1.0);
   173 		
   174 		f.glColor4ub(255,255,255,255);
   175 		f.glBegin(GL_POINTS);
   176 		for(i=0;i<NB_PIXELS;i++)
   177 		{
   178 			f.glVertex3f(pixels[3*i],pixels[3*i+1],pixels[3*i+2]);
   179 		}
   180 		f.glEnd();
   181 		SDL_GL_SwapBuffers();
   182 
   183 		while(SDL_PollEvent(&event))
   184 		{
   185 			if(event.type & SDL_KEYDOWN)
   186 				done=1;
   187 		}
   188 
   189 		SDL_Delay(20);
   190 	}
   191 	while(!done);
   192 	
   193 	SDL_Quit();
   194 	return 0;
   195 }
   196 
   197 #else /* HAVE_OPENGL */
   198 
   199 int main(int argc, char *argv[])
   200 {
   201 	printf("No OpenGL support on this system\n");
   202 	return 1;
   203 }
   204 
   205 #endif /* HAVE_OPENGL */