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.
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@1439
    45
	return NULL;
slouken@839
    46
}
slouken@839
    47
slouken@839
    48
typedef struct
slouken@839
    49
{
slouken@885
    50
	void(APIENTRY*glBegin)(GLenum);
slouken@885
    51
	void(APIENTRY*glEnd)();
slouken@885
    52
	void(APIENTRY*glVertex3f)(GLfloat, GLfloat, GLfloat);
slouken@885
    53
	void(APIENTRY*glClearColor)(GLfloat, GLfloat, GLfloat, GLfloat);
slouken@885
    54
	void(APIENTRY*glClear)(GLbitfield);
slouken@885
    55
	void(APIENTRY*glDisable)(GLenum);
slouken@885
    56
	void(APIENTRY*glEnable)(GLenum);
slouken@885
    57
	void(APIENTRY*glColor4ub)(GLubyte,GLubyte,GLubyte,GLubyte);
slouken@885
    58
	void(APIENTRY*glPointSize)(GLfloat);
slouken@885
    59
	void(APIENTRY*glHint)(GLenum,GLenum);
slouken@885
    60
	void(APIENTRY*glBlendFunc)(GLenum,GLenum);
slouken@885
    61
	void(APIENTRY*glMatrixMode)(GLenum);
slouken@885
    62
	void(APIENTRY*glLoadIdentity)();
slouken@885
    63
	void(APIENTRY*glOrtho)(GLdouble,GLdouble,GLdouble,GLdouble,GLdouble,GLdouble);
slouken@885
    64
	void(APIENTRY*glRotatef)(GLfloat,GLfloat,GLfloat,GLfloat);
slouken@885
    65
	void(APIENTRY*glViewport)(GLint,GLint,GLsizei,GLsizei);
slouken@885
    66
	void(APIENTRY*glFogf)(GLenum,GLfloat);
slouken@839
    67
}
slouken@839
    68
glfuncs;
slouken@839
    69
slouken@839
    70
void init_glfuncs(glfuncs* f)
slouken@839
    71
{
slouken@839
    72
	f->glBegin=get_funcaddr("glBegin");
slouken@839
    73
	f->glEnd=get_funcaddr("glEnd");
slouken@839
    74
	f->glVertex3f=get_funcaddr("glVertex3f");
slouken@839
    75
	f->glClearColor=get_funcaddr("glClearColor");
slouken@839
    76
	f->glClear=get_funcaddr("glClear");
slouken@839
    77
	f->glDisable=get_funcaddr("glDisable");
slouken@839
    78
	f->glEnable=get_funcaddr("glEnable");
slouken@839
    79
	f->glColor4ub=get_funcaddr("glColor4ub");
slouken@839
    80
	f->glPointSize=get_funcaddr("glPointSize");
slouken@839
    81
	f->glHint=get_funcaddr("glHint");
slouken@839
    82
	f->glBlendFunc=get_funcaddr("glBlendFunc");
slouken@839
    83
	f->glMatrixMode=get_funcaddr("glMatrixMode");
slouken@839
    84
	f->glLoadIdentity=get_funcaddr("glLoadIdentity");
slouken@839
    85
	f->glOrtho=get_funcaddr("glOrtho");
slouken@839
    86
	f->glRotatef=get_funcaddr("glRotatef");
slouken@839
    87
	f->glViewport=get_funcaddr("glViewport");
slouken@839
    88
	f->glFogf=get_funcaddr("glFogf");
slouken@839
    89
}
slouken@839
    90
slouken@839
    91
#define NB_PIXELS 1000
slouken@839
    92
slouken@839
    93
int main(int argc,char *argv[])
slouken@839
    94
{
slouken@839
    95
	glfuncs f;
slouken@839
    96
	int i;
slouken@839
    97
	SDL_Event event;
slouken@839
    98
	int done=0;
slouken@839
    99
	GLfloat pixels[NB_PIXELS*3];
slouken@1440
   100
	const char *gl_library = NULL; /* Use the default GL library */
slouken@1402
   101
slouken@842
   102
	if (argv[1]) {
slouken@842
   103
		gl_library = argv[1];
slouken@839
   104
	}
slouken@839
   105
	
slouken@842
   106
	if (SDL_Init(SDL_INIT_VIDEO)<0)
slouken@839
   107
	{
slouken@839
   108
		printf("Unable to init SDL : %s\n",SDL_GetError());
icculus@1151
   109
		return(1);
slouken@839
   110
	}
patmandin@990
   111
slouken@839
   112
	if (SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1)<0)
slouken@839
   113
	{
slouken@839
   114
		printf("Unable to set GL attribute : %s\n",SDL_GetError());
icculus@1151
   115
		quit(1);
slouken@839
   116
	}
slouken@839
   117
	
slouken@842
   118
	if (SDL_GL_LoadLibrary(gl_library)<0)
slouken@839
   119
	{
slouken@839
   120
		printf("Unable to dynamically open GL lib : %s\n",SDL_GetError());
icculus@1151
   121
		quit(1);
slouken@839
   122
	}
slouken@839
   123
slouken@839
   124
	if (SDL_SetVideoMode(640,480,0,SDL_OPENGL)==NULL)
slouken@839
   125
	{
slouken@839
   126
		printf("Unable to open video mode : %s\n",SDL_GetError());
icculus@1151
   127
		quit(1);
slouken@839
   128
	}
slouken@839
   129
slouken@910
   130
	/* Set the window manager title bar */
slouken@910
   131
	SDL_WM_SetCaption( "SDL Dynamic OpenGL Loading Test", "testdyngl" );
slouken@910
   132
slouken@839
   133
	init_glfuncs(&f);
slouken@839
   134
slouken@839
   135
	for(i=0;i<NB_PIXELS;i++)
slouken@839
   136
	{
slouken@839
   137
		pixels[3*i]=rand()%250-125;
slouken@839
   138
		pixels[3*i+1]=rand()%250-125;
slouken@839
   139
		pixels[3*i+2]=rand()%250-125;
slouken@839
   140
	}
slouken@839
   141
	
slouken@839
   142
	f.glViewport(0,0,640,480);
slouken@839
   143
	
slouken@839
   144
	f.glMatrixMode(GL_PROJECTION);
slouken@839
   145
	f.glLoadIdentity();
slouken@839
   146
	f.glOrtho(-100,100,-100,100,-500,500);
slouken@839
   147
	
slouken@839
   148
	f.glMatrixMode(GL_MODELVIEW);
slouken@839
   149
	f.glLoadIdentity();
slouken@839
   150
	
slouken@839
   151
	f.glEnable(GL_DEPTH_TEST);
slouken@839
   152
	f.glDisable(GL_TEXTURE_2D);
slouken@839
   153
	f.glEnable(GL_BLEND);
slouken@839
   154
	f.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
slouken@839
   155
	
slouken@839
   156
	f.glClearColor(0.0f,0.0f,0.0f,0.0f);
slouken@839
   157
	f.glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
slouken@839
   158
	
slouken@839
   159
	f.glEnable(GL_POINT_SMOOTH);
slouken@839
   160
	f.glHint(GL_POINT_SMOOTH_HINT,GL_NICEST);
slouken@839
   161
	f.glPointSize(5.0f);
slouken@839
   162
	f.glEnable(GL_FOG);
slouken@839
   163
	f.glFogf(GL_FOG_START,-500);
slouken@839
   164
	f.glFogf(GL_FOG_END,500);
slouken@839
   165
	f.glFogf(GL_FOG_DENSITY,0.005);
slouken@839
   166
	
slouken@839
   167
	do
slouken@839
   168
	{
slouken@839
   169
		f.glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
slouken@839
   170
		
slouken@839
   171
		f.glRotatef(2.0,1.0,1.0,1.0);
slouken@839
   172
		f.glRotatef(1.0,0.0,1.0,1.0);
slouken@839
   173
		
slouken@839
   174
		f.glColor4ub(255,255,255,255);
slouken@839
   175
		f.glBegin(GL_POINTS);
slouken@839
   176
		for(i=0;i<NB_PIXELS;i++)
slouken@839
   177
		{
slouken@839
   178
			f.glVertex3f(pixels[3*i],pixels[3*i+1],pixels[3*i+2]);
slouken@839
   179
		}
slouken@839
   180
		f.glEnd();
slouken@839
   181
		SDL_GL_SwapBuffers();
slouken@839
   182
slouken@839
   183
		while(SDL_PollEvent(&event))
slouken@839
   184
		{
slouken@839
   185
			if(event.type & SDL_KEYDOWN)
slouken@839
   186
				done=1;
slouken@839
   187
		}
slouken@839
   188
slouken@839
   189
		SDL_Delay(20);
slouken@839
   190
	}
slouken@839
   191
	while(!done);
slouken@839
   192
	
slouken@839
   193
	SDL_Quit();
slouken@839
   194
	return 0;
slouken@839
   195
}
slouken@839
   196
slouken@839
   197
#else /* HAVE_OPENGL */
slouken@839
   198
slouken@839
   199
int main(int argc, char *argv[])
slouken@839
   200
{
slouken@839
   201
	printf("No OpenGL support on this system\n");
slouken@839
   202
	return 1;
slouken@839
   203
}
slouken@839
   204
slouken@839
   205
#endif /* HAVE_OPENGL */