test/testdyngles.c
author Ryan C. Gordon <icculus@icculus.org>
Sun, 11 Jan 2009 04:05:28 +0000
changeset 3017 3272431eeee2
parent 2765 f55c87ae336b
child 3087 0b6f51c29267
permissions -rw-r--r--
Added testresample.c
     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 __IPHONEOS__
    23 #define HAVE_OPENGLES
    24 #endif
    25 
    26 #ifdef HAVE_OPENGLES
    27 
    28 #include "SDL_opengles.h"
    29 
    30 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
    31 static void
    32 quit(int rc)
    33 {
    34     SDL_Quit();
    35     exit(rc);
    36 }
    37 
    38 void *
    39 get_funcaddr(const char *p)
    40 {
    41     void *f = SDL_GL_GetProcAddress(p);
    42     if (f) {
    43         return f;
    44     } else {
    45         printf("Unable to get function pointer for %s\n", p);
    46         quit(1);
    47     }
    48     return NULL;
    49 }
    50 
    51 typedef struct
    52 {
    53     //void (APIENTRY * glBegin) (GLenum);
    54     //void (APIENTRY * glEnd) ();
    55     //void (APIENTRY * glVertex3f) (GLfloat, GLfloat, GLfloat);
    56 
    57     void (APIENTRY * glEnableClientState) (GLenum array);
    58     void (APIENTRY * glVertexPointer) (GLint size, GLenum type,
    59                                        GLsizei stride,
    60                                        const GLvoid * pointer);
    61     void (APIENTRY * glDrawArrays) (GLenum mode, GLint first, GLsizei count);
    62 
    63 
    64     void (APIENTRY * glClearColor) (GLfloat, GLfloat, GLfloat, GLfloat);
    65     void (APIENTRY * glClear) (GLbitfield);
    66     void (APIENTRY * glDisable) (GLenum);
    67     void (APIENTRY * glEnable) (GLenum);
    68     void (APIENTRY * glColor4ub) (GLubyte, GLubyte, GLubyte, GLubyte);
    69     void (APIENTRY * glPointSize) (GLfloat);
    70     void (APIENTRY * glHint) (GLenum, GLenum);
    71     void (APIENTRY * glBlendFunc) (GLenum, GLenum);
    72     void (APIENTRY * glMatrixMode) (GLenum);
    73     void (APIENTRY * glLoadIdentity) ();
    74     void (APIENTRY * glOrthof) (GLfloat, GLfloat, GLfloat, GLfloat,
    75                                 GLfloat, GLfloat);
    76     void (APIENTRY * glRotatef) (GLfloat, GLfloat, GLfloat, GLfloat);
    77     void (APIENTRY * glViewport) (GLint, GLint, GLsizei, GLsizei);
    78     void (APIENTRY * glFogf) (GLenum, GLfloat);
    79 }
    80 glfuncs;
    81 
    82 void
    83 init_glfuncs(glfuncs * f)
    84 {
    85     f->glEnableClientState = get_funcaddr("glEnableClientState");
    86     f->glVertexPointer = get_funcaddr("glVertexPointer");
    87     f->glDrawArrays = get_funcaddr("glDrawArrays");
    88     f->glClearColor = get_funcaddr("glClearColor");
    89     f->glClear = get_funcaddr("glClear");
    90     f->glDisable = get_funcaddr("glDisable");
    91     f->glEnable = get_funcaddr("glEnable");
    92     f->glColor4ub = get_funcaddr("glColor4ub");
    93     f->glPointSize = get_funcaddr("glPointSize");
    94     f->glHint = get_funcaddr("glHint");
    95     f->glBlendFunc = get_funcaddr("glBlendFunc");
    96     f->glMatrixMode = get_funcaddr("glMatrixMode");
    97     f->glLoadIdentity = get_funcaddr("glLoadIdentity");
    98     f->glOrthof = get_funcaddr("glOrthof");
    99     f->glRotatef = get_funcaddr("glRotatef");
   100     f->glViewport = get_funcaddr("glViewport");
   101     f->glFogf = get_funcaddr("glFogf");
   102 }
   103 
   104 #define NB_PIXELS 1000
   105 
   106 int
   107 main(int argc, char *argv[])
   108 {
   109     glfuncs f;
   110     int i;
   111     SDL_Event event;
   112     int done = 0;
   113     GLfloat pixels[NB_PIXELS * 3];
   114     const char *gl_library = NULL;      /* Use the default GL library */
   115 
   116     int video_w, video_h;
   117 
   118     /* you may want to change these according to the platform */
   119     video_w = 320;
   120     video_h = 480;
   121 
   122     if (argv[1]) {
   123         gl_library = argv[1];
   124     }
   125 
   126     if (SDL_Init(SDL_INIT_VIDEO) < 0) {
   127         printf("Unable to init SDL : %s\n", SDL_GetError());
   128         return (1);
   129     }
   130 
   131     if (SDL_GL_LoadLibrary(gl_library) < 0) {
   132         printf("Unable to dynamically open GL lib : %s\n", SDL_GetError());
   133         quit(1);
   134     }
   135 
   136     if (SDL_SetVideoMode(video_h, video_w, 0, SDL_OPENGL) == NULL) {
   137         printf("Unable to open video mode : %s\n", SDL_GetError());
   138         quit(1);
   139     }
   140 
   141     /* Set the window manager title bar */
   142     SDL_WM_SetCaption("SDL Dynamic OpenGL Loading Test", "testdyngl");
   143 
   144     init_glfuncs(&f);
   145 
   146     for (i = 0; i < NB_PIXELS; i++) {
   147         pixels[3 * i] = rand() % 250 - 125;
   148         pixels[3 * i + 1] = rand() % 250 - 125;
   149         pixels[3 * i + 2] = rand() % 250 - 125;
   150     }
   151 
   152     f.glViewport(0, 0, video_w, video_h);
   153 
   154     f.glMatrixMode(GL_PROJECTION);
   155     f.glLoadIdentity();
   156     f.glOrthof(-100, 100, -100, 100, -500, 500);
   157 
   158     f.glMatrixMode(GL_MODELVIEW);
   159     f.glLoadIdentity();
   160 
   161     f.glEnable(GL_DEPTH_TEST);
   162     f.glDisable(GL_TEXTURE_2D);
   163     f.glEnable(GL_BLEND);
   164     f.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   165 
   166     f.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
   167     f.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   168 
   169     f.glEnable(GL_POINT_SMOOTH);
   170     f.glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
   171     f.glPointSize(5.0f);
   172     f.glEnable(GL_FOG);
   173     f.glFogf(GL_FOG_START, -500);
   174     f.glFogf(GL_FOG_END, 500);
   175     f.glFogf(GL_FOG_DENSITY, 0.005);
   176 
   177     do {
   178         f.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   179 
   180         f.glRotatef(2.0, 1.0, 1.0, 1.0);
   181         f.glRotatef(1.0, 0.0, 1.0, 1.0);
   182 
   183         f.glColor4ub(255, 255, 255, 255);
   184 
   185         f.glEnableClientState(GL_VERTEX_ARRAY);
   186         f.glVertexPointer(3, GL_FLOAT, 0, pixels);
   187         f.glDrawArrays(GL_POINTS, 0, NB_PIXELS);
   188 
   189         SDL_GL_SwapBuffers();
   190 
   191         while (SDL_PollEvent(&event)) {
   192             if (event.type == SDL_KEYDOWN)
   193                 done = 1;
   194         }
   195 
   196         SDL_Delay(20);
   197     }
   198     while (!done);
   199 
   200     SDL_Quit();
   201     return 0;
   202 }
   203 
   204 #else /* HAVE_OPENGLES */
   205 
   206 int
   207 main(int argc, char *argv[])
   208 {
   209     printf("No OpenGL support on this system\n");
   210     return 1;
   211 }
   212 
   213 #endif /* HAVE_OPENGLES */