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