diff options
Diffstat (limited to 'sdl/pyramid.c')
-rw-r--r-- | sdl/pyramid.c | 257 |
1 files changed, 41 insertions, 216 deletions
diff --git a/sdl/pyramid.c b/sdl/pyramid.c index 3b63168..b3e1b2e 100644 --- a/sdl/pyramid.c +++ b/sdl/pyramid.c @@ -24,35 +24,23 @@ #include "glframe.h" #include "gltools.h" #include "math3d.h" -#define FRAMES_PER_SECOND 60 +#include "platform.h" +#include "window.h" /* function prototypes */ -static void window_resize(int, int); -static void setup_opengl(void); -static void setup_sdl(void); -static void setup_glew(void); -static inline void fps_control(unsigned int); static void keys(SDL_keysym *, const unsigned int *, const int); static void process_events(void); -static void render(void); static void platform_init(void); static void platform_destroy(void); +static void render(void); /* global */ int program_running = 1; const unsigned int xres = 640; const unsigned int yres = 480; -const unsigned int bpp = 32; - -/* few arrays, they could make into the header at some point */ -GLfloat fNoLight[] = { 0.0f, 0.0f, 0.0f, 0.0f }; -GLfloat fLowLight[] = { 0.25f, 0.25f, 0.25f, 1.0f }; -GLfloat fBrightLight[] = { 1.0f, 1.0f, 1.0f, 1.0f }; - -/* light values and coordinates */ -GLfloat whiteLight[] = { 0.05f, 0.05f, 0.05f, 1.0f }; -GLfloat sourceLight[] = { 0.75f, 0.75f, 0.75f, 1.0f }; -GLfloat lightPos[] = { -10.f, 5.0f, 5.0f, 1.0f }; +const unsigned int bpp = 32; +const char *window_caption = "Textured Pyramid"; +const char *window_icon_path = "tux.png"; /* platform struct */ static struct @@ -67,169 +55,6 @@ static struct GLfloat yrot; } p; -static void window_resize(int w, int h) -{ - printf("window: resizing to %dx%d\n", w, h); - GLfloat fAspect = (GLfloat) w / (GLfloat) h; - if (h == 0) - h = 1; - glViewport(0, 0, w, h); - - /* reset coordinate system */ - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - /* produce the perspective projection */ - /* void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar) */ - gluPerspective(40.0f, fAspect, 1.0, 40.0); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - /* this needs to be ran again, glut does it for you I suppose */ - SDL_SetVideoMode(w, h, bpp, SDL_OPENGL | SDL_RESIZABLE); -} - -static void setup_opengl(void) -{ - /* setup fog */ - glEnable(GL_FOG); - glFogfv(GL_FOG_COLOR, fLowLight); /* set fog color to match background */ - glFogf(GL_FOG_START, 4.0f); - glFogf(GL_FOG_END, 20.0f); - glFogi(GL_FOG_MODE, GL_LINEAR); /* fog equation */ - - glEnable(GL_DEPTH_TEST); /* hidden surface removal */ - glFrontFace(GL_CCW); /* counter clock-wise polygons face out */ - glEnable(GL_CULL_FACE); /* do not calculate inside of a pyramid */ - - /* setup and enable light 0 */ - /* ambient RGBA intensity of the entire scene */ - glLightModelfv(GL_LIGHT_MODEL_AMBIENT, whiteLight); - glLightfv(GL_LIGHT0, GL_AMBIENT, sourceLight); - glLightfv(GL_LIGHT0, GL_DIFFUSE, fBrightLight); - glLightfv(GL_LIGHT0, GL_SPECULAR, fBrightLight); - glLightfv(GL_LIGHT0, GL_POSITION, lightPos); - - /* enable lighting */ - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); - - /* enable color tracking */ - glEnable(GL_COLOR_MATERIAL); - - /* set Material properties to follow glColor values */ - glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); - glMaterialfv(GL_FRONT, GL_SPECULAR, fBrightLight); - glMateriali(GL_FRONT, GL_SHININESS, 128); - - /* turn on anti aliasing for points, lines, and polygons */ - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL_BLEND); - glEnable(GL_POINT_SMOOTH); - glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); - glEnable(GL_LINE_SMOOTH); - glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); - /* screws up snowman */ - //glEnable(GL_POLYGON_SMOOTH); - //glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); - - /* gray background */ - glClearColor(0.5f, 0.5f, 0.5f, 1.0f); - - /* original texture loading used to be here */ - - /* texture filtering, we modify default values since we don't have mipmaps */ - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - /* how OpenGL combines the colors from texels with the color of the underlying - * geometry is controlled by the texture environment mode */ - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - - /* once texture is loaded and enabled, it will applied to every primitive - * that specifies coordinates */ - glEnable(GL_TEXTURE_2D); - - /* multisampling for polygons, conflicts with anti-aliasing */ - //glEnable(GL_MULTISAMPLE); - - /* don't know about this, but why not */ - glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR); -} - -static void setup_sdl(void) -{ - SDL_Surface *screen; - - if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0 ) - { - fprintf(stderr, "unable to init SDL: %s\n", SDL_GetError()); - exit(-1); - } - atexit(SDL_Quit); - SDL_WM_SetCaption("Textured Pyramid", NULL); - SDL_WM_SetIcon(IMG_Load("tux.png"), NULL); - - SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); - - if ((screen = SDL_SetVideoMode(xres, yres, bpp, SDL_OPENGL | SDL_RESIZABLE)) == NULL) - { - fprintf(stderr, "unable to set video mode: %s\n", SDL_GetError()); - exit(-1); - } - - SDL_EnableUNICODE(1); - /* SDL doesn't trigger off a ResizeEvent at startup, but as we need this - * for OpenGL, we do this ourselves */ - SDL_Event resizeEvent; - resizeEvent.type = SDL_VIDEORESIZE; - resizeEvent.resize.w = xres; - resizeEvent.resize.h = yres; - SDL_PushEvent(&resizeEvent); -} - -static void setup_glew(void) -{ - /* initalize glew */ - GLenum glewerr = glewInit(); - if (GLEW_OK != glewerr) - { - fprintf(stderr, "error: %s\n", glewGetErrorString(glewerr)); - exit(-1); - } - else - fprintf(stdout, "status: using GLEW %s\n", glewGetString(GLEW_VERSION)); - - /* display OpenGL version */ - GLint major; - GLint minor; - glGetIntegerv(GL_MAJOR_VERSION, &major); - glGetIntegerv(GL_MINOR_VERSION, &minor); - fprintf(stdout, "version: OpenGL %d.%d detected\n", major, minor); -} - -static inline void fps_control(const unsigned int startclock) -{ - unsigned int deltaclock = SDL_GetTicks() - startclock; - if (deltaclock < 1000 / FRAMES_PER_SECOND) - SDL_Delay((1000 / FRAMES_PER_SECOND) - deltaclock); - -#ifdef STAT_FPS - char buffer[30] = { 0 }; - sprintf(buffer, "Textured Pyramid: %4d fps", - 1000 / (SDL_GetTicks() - startclock)); - SDL_WM_SetCaption(buffer, NULL); -#endif -} - static void keys(SDL_keysym *keysym, const unsigned int *keys_held, const int flag) { if (!flag) @@ -273,9 +98,9 @@ static void keys(SDL_keysym *keysym, const unsigned int *keys_held, const int fl p.yrot = (GLfloat) ((const int) p.yrot % 360); } -/* process SDL events */ static void process_events(void) { + /* process SDL events */ SDL_Event event; unsigned static int keys_held[323]; SDLKey sym; @@ -317,40 +142,6 @@ static void process_events(void) flag = !flag; } -static void render(void) -{ - /* clear the window with current clearing color */ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - /* save the matrix state and do the rotations */ - glPushMatrix(); - /* apply camera transform, and draw the ground */ - glframe_apply_camera_transform(&p.camera); - glColor3ub(255, 0, 255); - glCallList(p.ground_list); - - glPushMatrix(); - /* move object back and do in place rotation */ - glTranslatef(0.0f, 0.2f, -3.5f); - glRotatef(p.xrot, 1.0f, 0.0f, 0.0f); - glRotatef(p.yrot, 0.0f, 1.0f, 0.0f); - - /* draw the pyramid */ - glColor3f(1.0f, 1.0f, 1.0f); - glCallList(p.triangle_list); - glPopMatrix(); - - /* draw a snowman */ - glTranslatef(0.0f, 0.0f, -7.0f); - gltDrawSnowman(); - - /* restore the matrix state */ - glPopMatrix(); - - /* buffer swap */ - SDL_GL_SwapBuffers(); -} - static void platform_init(void) { /* variables used for texture loading */ @@ -392,6 +183,40 @@ static void platform_destroy(void) glDeleteLists(p.ground_list, 2); } +static void render(void) +{ + /* clear the window with current clearing color */ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + /* save the matrix state and do the rotations */ + glPushMatrix(); + /* apply camera transform, and draw the ground */ + glframe_apply_camera_transform(&p.camera); + glColor3ub(255, 0, 255); + glCallList(p.ground_list); + + glPushMatrix(); + /* move object back and do in place rotation */ + glTranslatef(0.0f, 0.2f, -3.5f); + glRotatef(p.xrot, 1.0f, 0.0f, 0.0f); + glRotatef(p.yrot, 0.0f, 1.0f, 0.0f); + + /* draw the pyramid */ + glColor3f(1.0f, 1.0f, 1.0f); + glCallList(p.triangle_list); + glPopMatrix(); + + /* draw a snowman */ + glTranslatef(0.0f, 0.0f, -7.0f); + gltDrawSnowman(); + + /* restore the matrix state */ + glPopMatrix(); + + /* buffer swap */ + SDL_GL_SwapBuffers(); +} + int main(int argc, char **argv) { setup_sdl(); |