summaryrefslogtreecommitdiffstats
path: root/Smoke/snowman.c
diff options
context:
space:
mode:
authorOliver Schinagl <oliver@schinagl.nl>2007-10-25 13:32:58 (GMT)
committerOliver Schinagl <oliver@schinagl.nl>2007-10-25 13:32:58 (GMT)
commit2f019eddfc78e7a03110ee52437aa4fb3e41c588 (patch)
tree13be4b850a3da9a5cedfe132d4c95aa980c0c7e8 /Smoke/snowman.c
parentd6d4a555d93bca7b0855144c28b591c1773aa9fe (diff)
download2iv35-2f019eddfc78e7a03110ee52437aa4fb3e41c588.zip
2iv35-2f019eddfc78e7a03110ee52437aa4fb3e41c588.tar.gz
2iv35-2f019eddfc78e7a03110ee52437aa4fb3e41c588.tar.bz2
tja ..
Diffstat (limited to 'Smoke/snowman.c')
-rw-r--r--Smoke/snowman.c206
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);
+}
+
+