0001 (**
0002 * cube.sml
0003 *
0004 * @copyright (c) 2006-2007, Tohoku University.
0005 * @author UENO Katsuhiro
0006 * @version $Id: cube.sml,v 1.3.2.1 2007/03/26 06:26:50 katsu Exp $
0007 *)
0008
0009 use "libglut.sml";
0010
0011 open GL GLU GLUT
0012
0013 infix ++
0014 val op ++ = Word.orb
0015
0016 val progname = "smlsharp"
0017 val r = ref 0.0
0018
0019 (*
0020 * (0,h,d) +-------+ (w,h,d)
0021 * /| /|
0022 * / | / |
0023 * (0,h,0) +-------+ |(w,h,0)
0024 * (0,0,d)| +-------+ (w,0,d)
0025 * h | / | /
0026 * |/ |/ d
0027 * (0,0,0) +-------+ (w,0,0)
0028 * w
0029 *)
0030
0031 fun cube (w, h, d) =
0032 (glBegin GL_QUADS;
0033 app (fn (normal,vertexes) =>
0034 (glNormal3dv normal;
0035 app glVertex3dv vertexes))
0036 [
0037 (( 1.0, 0.0, 0.0),
0038 [( w, 0.0, 0.0),( w, h, 0.0),( w, h, d),( w, 0.0, d)]),
0039 (( 0.0, 1.0, 0.0),
0040 [(0.0, h, 0.0),(0.0, h, d),( w, h, d),( w, h, 0.0)]),
0041 (( 0.0, 0.0,~1.0),
0042 [(0.0, 0.0, 0.0),(0.0, h, 0.0),( w, h, 0.0),( w, 0.0, 0.0)]),
0043 ((~1.0, 0.0, 0.0),
0044 [(0.0, 0.0, d),(0.0, h, d),(0.0, h, 0.0),(0.0, 0.0, 0.0)]),
0045 (( 0.0,~1.0, 0.0),
0046 [(0.0, 0.0, d),(0.0, 0.0, 0.0),( w, 0.0, 0.0),( w, 0.0, d)]),
0047 (( 0.0, 0.0, 1.0),
0048 [( w, 0.0, d),( w, h, d),(0.0, h, d),(0.0, 0.0, d)])
0049 ];
0050 glEnd ())
0051
0052 fun display () =
0053 (glClear (GL_COLOR_BUFFER_BIT ++ GL_DEPTH_BUFFER_BIT);
0054 glLoadIdentity ();
0055 gluLookAt (3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
0056 glLightfv (GL_LIGHT0, GL_POSITION, (0.0, 3.0, 5.0, 1.0));
0057 glLightfv (GL_LIGHT1, GL_POSITION, (5.0, 3.0, 0.0, 1.0));
0058
0059 glPushMatrix ();
0060
0061 glRotated(!r, 0.0, 1.0, 0.0);
0062 glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, (0.2, 0.2, 0.8, 1.0));
0063 cube (1.0, 1.0, 1.0);
0064
0065 glTranslated (0.5, 0.0, 0.5);
0066 glRotated (2.0 * !r, 0.0, 1.0, 0.0);
0067 glTranslated (1.0, 0.0, ~0.5);
0068 glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, (0.8, 0.2, 0.2, 1.0));
0069 cube (1.0, 1.0, 1.0);
0070
0071 glPopMatrix ();
0072 glutSwapBuffers ())
0073
0074 fun resize (w, h) =
0075 (glViewport (0, 0, w, h);
0076
0077 glMatrixMode GL_PROJECTION;
0078 glLoadIdentity ();
0079 gluPerspective (30.0, real w / real h, 1.0, 100.0);
0080
0081 glMatrixMode GL_MODELVIEW;
0082 glLoadIdentity ();
0083 gluLookAt (3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0))
0084
0085 fun timer n =
0086 (r := !r + 1.0;
0087 if !r >= 360.0 then r := 0.0 else ();
0088 glutPostRedisplay ();
0089 glutTimerFunc (10, timer, 0))
0090 (*FIXME: unaligned double *)
0091
0092 val _ = glutInit (ref 1, Array.fromList [progname])
0093 val _ = glutInitDisplayMode (GLUT_RGBA ++ GLUT_DOUBLE ++ GLUT_DEPTH)
0094 val _ = glutCreateWindow progname
0095 val _ = glutDisplayFunc display
0096 val _ = glutReshapeFunc resize
0097 val _ = glutTimerFunc (10, timer, 0)
0098
0099 val _ = glClearColor (0.95, 0.95, 1.0, 1.0)
0100
0101 val _ = glEnable GL_DEPTH_TEST
0102 val _ = glEnable GL_CULL_FACE
0103 val _ = glCullFace GL_BACK
0104
0105 val _ = app glEnable [GL_LIGHTING, GL_LIGHT0, GL_LIGHT1]
0106 val _ = glLightfv (GL_LIGHT1, GL_DIFFUSE, (0.0, 1.0, 0.0, 1.0))
0107 val _ = glLightfv (GL_LIGHT1, GL_SPECULAR, (0.0, 1.0, 0.0, 1.0))
0108
0109 val _ = glutMainLoop ()