diff options
author | Oliver Schinagl <oliver@schinagl.nl> | 2007-10-25 13:32:58 (GMT) |
---|---|---|
committer | Oliver Schinagl <oliver@schinagl.nl> | 2007-10-25 13:32:58 (GMT) |
commit | 2f019eddfc78e7a03110ee52437aa4fb3e41c588 (patch) | |
tree | 13be4b850a3da9a5cedfe132d4c95aa980c0c7e8 /Smoke/snowman.c | |
parent | d6d4a555d93bca7b0855144c28b591c1773aa9fe (diff) | |
download | 2iv35-2f019eddfc78e7a03110ee52437aa4fb3e41c588.zip 2iv35-2f019eddfc78e7a03110ee52437aa4fb3e41c588.tar.gz 2iv35-2f019eddfc78e7a03110ee52437aa4fb3e41c588.tar.bz2 |
tja ..
Diffstat (limited to 'Smoke/snowman.c')
-rw-r--r-- | Smoke/snowman.c | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/Smoke/snowman.c b/Smoke/snowman.c new file mode 100644 index 0000000..4c86532 --- /dev/null +++ b/Smoke/snowman.c @@ -0,0 +1,206 @@ + +#include <math.h> +#include <GL/glut.h> + + + + +float angle=0.0,deltaAngle = 0.0,ratio; +float x=0.0f,y=1.75f,z=5.0f; +float lx=0.0f,ly=0.0f,lz=-1.0f; +GLint snowman_display_list; +int deltaMove = 0; + + +void changeSize(int w, int h) + { + + // Prevent a divide by zero, when window is too short + // (you cant make a window of zero width). + if(h == 0) + h = 1; + + ratio = 1.0f * w / h; + // Reset the coordinate system before modifying + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + // Set the viewport to be the entire window + glViewport(0, 0, w, h); + + // Set the clipping volume + gluPerspective(45,ratio,1,1000); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + gluLookAt(x, y, z, + x + lx,y + ly,z + lz, + 0.0f,1.0f,0.0f); + + + } + + +void drawSnowMan() { + + + glColor3f(1.0f, 1.0f, 1.0f); + +// Draw Body + glTranslatef(0.0f ,0.75f, 0.0f); + glutSolidSphere(0.75f,20,20); + + +// Draw Head + glTranslatef(0.0f, 1.0f, 0.0f); + glutSolidSphere(0.25f,20,20); + +// Draw Eyes + glPushMatrix(); + glColor3f(0.0f,0.0f,0.0f); + glTranslatef(0.05f, 0.10f, 0.18f); + glutSolidSphere(0.05f,10,10); + glTranslatef(-0.1f, 0.0f, 0.0f); + glutSolidSphere(0.05f,10,10); + glPopMatrix(); + +// Draw Nose + glColor3f(1.0f, 0.5f , 0.5f); + glRotatef(0.0f,1.0f, 0.0f, 0.0f); + glutSolidCone(0.08f,0.5f,10,2); +} + + + +GLuint createDL() { + GLuint snowManDL; + + // Create the id for the list + snowManDL = glGenLists(1); + + // start list + glNewList(snowManDL,GL_COMPILE); + + // call the function that contains + // the rendering commands + drawSnowMan(); + + // endList + glEndList(); + + return(snowManDL); +} + +void initScene() { + + glEnable(GL_DEPTH_TEST); + snowman_display_list = createDL(); + +} + +void orientMe(float ang) { + + + lx = sin(ang); + lz = -cos(ang); + glLoadIdentity(); + gluLookAt(x, y, z, + x + lx,y + ly,z + lz, + 0.0f,1.0f,0.0f); +} + + +void moveMeFlat(int i) { + x = x + i*(lx)*0.1; + z = z + i*(lz)*0.1; + glLoadIdentity(); + gluLookAt(x, y, z, + x + lx,y + ly,z + lz, + 0.0f,1.0f,0.0f); +} + + +void renderScene(void) { + int i, j; + + if (deltaMove) + moveMeFlat(deltaMove); + if (deltaAngle) { + angle += deltaAngle; + orientMe(angle); + } + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); +// Draw ground + + glColor3f(0.9f, 0.9f, 0.9f); + glBegin(GL_QUADS); + glVertex3f(-100.0f, 0.0f, -100.0f); + glVertex3f(-100.0f, 0.0f, 100.0f); + glVertex3f( 100.0f, 0.0f, 100.0f); + glVertex3f( 100.0f, 0.0f, -100.0f); + glEnd(); + +// Draw 36 SnowMen + + for(i = -3; i < 3; i++) + for(j = -3; j < 3; j++) { + glPushMatrix(); + glTranslatef(i*10.0,0,j * 10.0); + glCallList(snowman_display_list);; + glPopMatrix(); + } + glutSwapBuffers(); +} + + +void pressKey(int key, int x, int y) { + + switch (key) { + case GLUT_KEY_LEFT : + deltaAngle = -0.01f;break; + case GLUT_KEY_RIGHT : + deltaAngle = 0.01f;break; + case GLUT_KEY_UP : + deltaMove = 1;break; + case GLUT_KEY_DOWN : + deltaMove = -1;break; + } +} + +void releaseKey(int key, int x, int y) { + + switch (key) { + case GLUT_KEY_LEFT : + case GLUT_KEY_RIGHT : + deltaAngle = 0.0f;break; + case GLUT_KEY_UP : + case GLUT_KEY_DOWN : + deltaMove = 0;break; + } +} + + +int main(int argc, char **argv) +{ + glutInit(&argc, argv); + glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); + glutInitWindowPosition(100,100); + glutInitWindowSize(640,360); + glutCreateWindow("SnowMen from 3D-Tech"); + + initScene(); + + glutIgnoreKeyRepeat(1); + glutSpecialFunc(pressKey); + glutSpecialUpFunc(releaseKey); + + glutDisplayFunc(renderScene); + glutIdleFunc(renderScene); + + glutReshapeFunc(changeSize); + + glutMainLoop(); + + return(0); +} + + |