File: cube.sml

package info (click to toggle)
smlsharp 4.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 123,732 kB
  • sloc: ansic: 16,725; sh: 4,347; makefile: 2,191; java: 742; haskell: 493; ruby: 305; cpp: 284; pascal: 256; ml: 255; lisp: 141; asm: 97; sql: 74
file content (107 lines) | stat: -rw-r--r-- 3,125 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
(**
 * cube.sml
 *
 * @copyright (C) 2021 SML# Development Team.
 * @author UENO Katsuhiro
 * @version $Id: cube.sml,v 1.4 2007/04/02 09:42:29 katsu Exp $
 *)

open GL GLU GLUT

infix ++
val op ++ = Word.orb

val progname = "smlsharp"
val r = ref 0.0

(*
 *     (0,h,d) +-------+ (w,h,d)
 *            /|      /|
 *           / |     / |
 *  (0,h,0) +-------+  |(w,h,0)
 *   (0,0,d)|  +-------+ (w,0,d)
 *        h | /     | /
 *          |/      |/  d
 *  (0,0,0) +-------+ (w,0,0)
 *              w
 *)

fun cube (w, h, d) =
    (glBegin GL_QUADS;
     app (fn (normal,vertexes) =>
             (glNormal3dv normal;
              app glVertex3dv vertexes))
         [
           (( 1.0, 0.0, 0.0),
            [(  w, 0.0, 0.0),(  w,   h, 0.0),(  w,   h,   d),(  w, 0.0,   d)]),
           (( 0.0, 1.0, 0.0),
            [(0.0,   h, 0.0),(0.0,   h,   d),(  w,   h,   d),(  w,   h, 0.0)]),
           (( 0.0, 0.0,~1.0),
            [(0.0, 0.0, 0.0),(0.0,   h, 0.0),(  w,   h, 0.0),(  w, 0.0, 0.0)]),
           ((~1.0, 0.0, 0.0),
            [(0.0, 0.0,   d),(0.0,   h,   d),(0.0,   h, 0.0),(0.0, 0.0, 0.0)]),
           (( 0.0,~1.0, 0.0),
            [(0.0, 0.0,   d),(0.0, 0.0, 0.0),(  w, 0.0, 0.0),(  w, 0.0,   d)]),
           (( 0.0, 0.0, 1.0),
            [(  w, 0.0,   d),(  w,   h,   d),(0.0,   h,   d),(0.0, 0.0,   d)])
         ];
     glEnd ())

fun display () =
    (glClear (GL_COLOR_BUFFER_BIT ++ GL_DEPTH_BUFFER_BIT);
     glLoadIdentity ();
     gluLookAt (3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
     glLightfv (GL_LIGHT0, GL_POSITION, (0.0, 3.0, 5.0, 1.0));
     glLightfv (GL_LIGHT1, GL_POSITION, (5.0, 3.0, 0.0, 1.0));

     glPushMatrix ();

     glRotated(!r, 0.0, 1.0, 0.0);
     glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, (0.2, 0.2, 0.8, 1.0));
     cube (1.0, 1.0, 1.0);

     glTranslated (0.5, 0.0, 0.5);
     glRotated (2.0 * !r, 0.0, 1.0, 0.0);
     glTranslated (1.0, 0.0, ~0.5);
     glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, (0.8, 0.2, 0.2, 1.0));
     cube (1.0, 1.0, 1.0);

     glPopMatrix ();
     glutSwapBuffers ())

fun resize (w, h) =
    (glViewport (0, 0, w, h);

     glMatrixMode GL_PROJECTION;
     glLoadIdentity ();
     gluPerspective (30.0, real w / real h, 1.0, 100.0);

     glMatrixMode GL_MODELVIEW;
     glLoadIdentity ();
     gluLookAt (3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0))

fun timer n =
    (r := !r + 1.0;
     if !r >= 360.0 then r := 0.0 else ();
     glutPostRedisplay ();
     glutTimerFunc (10, timer, 0))
    (*FIXME: unaligned double *)

val _ = glutInit (ref 1, Array.fromList [progname])
val _ = glutInitDisplayMode (GLUT_RGBA ++ GLUT_DOUBLE ++ GLUT_DEPTH)
val _ = glutCreateWindow progname
val _ = glutDisplayFunc display
val _ = glutReshapeFunc resize
val _ = glutTimerFunc (10, timer, 0)

val _ = glClearColor (0.95, 0.95, 1.0, 1.0)

val _ = glEnable GL_DEPTH_TEST
val _ = glEnable GL_CULL_FACE
val _ = glCullFace GL_BACK

val _ = app glEnable [GL_LIGHTING, GL_LIGHT0, GL_LIGHT1]
val _ = glLightfv (GL_LIGHT1, GL_DIFFUSE, (0.0, 1.0, 0.0, 1.0))
val _ = glLightfv (GL_LIGHT1, GL_SPECULAR, (0.0, 1.0, 0.0, 1.0))

val _ = glutMainLoop ()