summaryrefslogtreecommitdiffstats
path: root/sdl/pyramid.c
diff options
context:
space:
mode:
Diffstat (limited to 'sdl/pyramid.c')
-rw-r--r--sdl/pyramid.c257
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();