Overview  Index  Help 
spectrum

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 ()


Overview  Index  Help 
spectrum