Files
bitbox/gfx/fs.cpp
2014-01-18 15:06:11 +01:00

109 lines
2.8 KiB
C++

// g++ -I /usr/include/SDL -o fs fs.cpp -lSDL -lGL -lGLU -lm
#include <SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <math.h>
void quad(float x0, float y0, float z0,
float x1, float y1, float z1,
float x2, float y2, float z2,
float x3, float y3, float z3)
{
float vx1 = x1 - x0;
float vx2 = x2 - x0;
float vy1 = y1 - y0;
float vy2 = y2 - y0;
float vz1 = z1 - z0;
float vz2 = z2 - z0;
glNormal3f(vy1 * vz2 - vz1 * vy2, vz1 * vx2 - vx1 * vz2, vx1 * vy2 - vy1 * vx2);
glVertex3f(x0, y0, z0);
glVertex3f(x1, y1, z1);
glVertex3f(x2, y2, z2);
glVertex3f(x3, y3, z3);
}
void drawFlyingSaucer(const float res = 12.0)
{
static const int nb = 9;
static const float h[nb] = { 1.0, 0.9, 0.8, 0.5, 0.4, 0.3, 0.15, 0.01, 0.0 };
static const float r[nb] = { 0.001, 0.2, 0.3, 0.4, 0.8, 1.0, 0.8, 0.5, 0.0 };
glBegin(GL_QUADS);
glColor3f(0.5, 0.5, 0.5);
for ( int i = 0 ; i < nb - 1 ; i++ ) {
for ( float j = 0.0 ; j < 2.0 * M_PI ; j += 2.0 * M_PI / res ) {
quad(cosf(j)*r[i], h[i], sinf(j)*r[i],
cosf(j+2.0*M_PI/res)*r[i], h[i], sinf(j+2.0*M_PI/res)*r[i],
cosf(j+2.0*M_PI/res)*r[i+1], h[i+1], sinf(j+2.0*M_PI/res)*r[i+1],
cosf(j)*r[i+1], h[i+1], sinf(j)*r[i+1]);
}
}
glEnd();
}
int main(int argc, char ** argv)
{
bool running = true;
SDL_Event event;
float ry = 0.0;
float rz = 0.0;
SDL_Init(SDL_INIT_VIDEO);
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_DEPTH_SIZE, 24);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_Surface * screen = SDL_SetVideoMode(640, 480, 32, SDL_OPENGL|SDL_HWSURFACE);
SDL_WM_SetCaption("Flying Saucer !", "");
glShadeModel(GL_SMOOTH);
glClearColor(0.0, 0.0, 0.0, 0.0);
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable(GL_LIGHTING);
glEnable(GL_NORMALIZE);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_AMBIENT, (float[]) { 1.0, 1.0, 1.0 });
glLightfv(GL_LIGHT0, GL_DIFFUSE, (float[]) { 1.0, 1.0, 1.0 });
glLightfv(GL_LIGHT0, GL_POSITION, (float[]) { 0.0, 20.0, 0.0 });
glViewport(0, 0, 640, 480);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, 640.0 / 480.0, 0.5, 100.0);
glMatrixMode(GL_MODELVIEW);
while ( running ) {
while ( SDL_PollEvent(& event) ) {
if ( event.type == SDL_QUIT || (event.type == SDL_KEYDOWN
&& event.key.keysym.sym == SDLK_ESCAPE ) )
running = false;
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslated(2.0*cosf(rz), 2.0*sinf(rz), -10.0);
rz += 0.001;
glRotatef(ry, 0.0, 1.0, 0.0);
ry += 0.1;
drawFlyingSaucer();
glRotatef(ry/5.0, 0.0, 1.0, 0.5);
glTranslatef(1.0, 2.0*cosf(ry/100.0), -3.0+cosf(rz/50.0));
drawFlyingSaucer(70.0);
SDL_GL_SwapBuffers();
}
SDL_FreeSurface(screen);
SDL_Quit();
return 0;
}