http://ftp.ksu.edu.tw/FTP/FreeBSD/distfiles/xscreensaver-4.20.tar.gz
[xscreensaver] / hacks / glx / extrusion-twistoid.c
1 /* 
2  * twistoid.c
3  *
4  * FUNCTION:
5  * Show extrusion of open contours. Also, show how torsion is applied.
6  *
7  * HISTORY:
8  * -- linas Vepstas October 1991
9  * -- heavily modified to draw corrugated surface, Feb 1993, Linas
10  * -- modified to demo twistoid March 1993
11  * -- port to glut Linas Vepstas March 1995
12  */
13
14 /* required include files */
15 #ifdef HAVE_CONFIG_H
16 #include <config.h>
17 #endif
18
19 #include <math.h>
20 #include <stdlib.h>
21 #include <GL/gl.h>
22 /*#include <GL/glut.h>*/
23 #ifdef HAVE_GLE3
24 #include <GL/gle.h>
25 #else
26 #include <GL/tube.h>
27 #endif
28
29 /* Some <math.h> files do not define M_PI... */
30 #ifndef M_PI
31 #define M_PI 3.14159265358979323846
32 #endif
33
34 /* controls shape of object */
35 extern float lastx;
36 extern float lasty;
37
38 #define OPENGL_10
39 /* =========================================================== */
40
41 #define NUM_TOID1_PTS 5
42 static double toid1_points[NUM_TOID1_PTS][3];
43 static float toid1_colors [NUM_TOID1_PTS][3];
44 static double toid1_twists [NUM_TOID1_PTS];
45
46 #define TSCALE (6.0)
47
48 #define TPTS(x,y) {                             \
49    toid1_points[i][0] = TSCALE * (x);           \
50    toid1_points[i][1] = TSCALE * (y);           \
51    toid1_points[i][2] = TSCALE * (0.0);         \
52    i++;                                         \
53 }
54
55 #define TCOLS(r,g,b) {                          \
56    toid1_colors[i][0] = (r);                    \
57    toid1_colors[i][1] = (g);                    \
58    toid1_colors[i][2] = (b);                    \
59    i++;                                         \
60 }
61
62 #define TXZERO() {                              \
63    toid1_twists[i] = 0.0;                       \
64    i++;                                         \
65 }
66
67 static void init_toid1_line (void)
68 {
69    int i;
70
71    i=0;
72    TPTS (-1.1, 0.0);
73    TPTS (-1.0, 0.0);
74    TPTS (0.0, 0.0);
75    TPTS (1.0, 0.0);
76    TPTS (1.1, 0.0);
77
78    i=0;
79    TCOLS (0.8, 0.8, 0.5);
80    TCOLS (0.8, 0.4, 0.5);
81    TCOLS (0.8, 0.8, 0.3);
82    TCOLS (0.4, 0.4, 0.5);
83    TCOLS (0.8, 0.8, 0.5);
84
85    i=0;
86    TXZERO ();
87    TXZERO ();
88    TXZERO ();
89    TXZERO ();
90    TXZERO ();
91 }
92
93 /* =========================================================== */
94
95 #define SCALE 0.6
96 #define TWIST(x,y) {                                            \
97    double ax, ay, alen;                                         \
98    twistation[i][0] = SCALE * (x);                              \
99    twistation[i][1] = SCALE * (y);                              \
100    if (i!=0) {                                                  \
101       ax = twistation[i][0] - twistation[i-1][0];               \
102       ay = twistation[i][1] - twistation[i-1][1];               \
103       alen = 1.0 / sqrt (ax*ax + ay*ay);                        \
104       ax *= alen;   ay *= alen;                                 \
105       twist_normal [i-1][0] = - ay;                             \
106       twist_normal [i-1][1] = ax;                               \
107    }                                                            \
108    i++;                                                         \
109 }
110
111 #define NUM_TWIS_PTS (20)
112
113 static double twistation [NUM_TWIS_PTS][2];
114 static double twist_normal [NUM_TWIS_PTS][2];
115
116 static void init_tripples (void)
117 {
118    int i;
119    double angle;
120    double co, si;
121
122    /* outline of extrusion */
123    i=0;
124    /* first, draw a semi-curcular "hump" */
125    while (i< 11) {
126       angle = M_PI * ((double) i) / 10.0;
127       co = cos (angle);
128       si = sin (angle);
129       TWIST ((-7.0 -3.0*co), 1.8*si);
130    }
131
132    /* now, a zig-zag corrugation */
133    while (i< NUM_TWIS_PTS) {
134       TWIST ((-10.0 +(double) i), 0.0);
135       TWIST ((-9.5 +(double) i), 1.0);
136    }
137 }
138
139    
140 /* =========================================================== */
141
142 #define V3F(x,y,z) {                                    \
143         float vvv[3];                                   \
144         vvv[0] = x; vvv[1] = y; vvv[2] = z; v3f (vvv);  \
145 }
146
147 #define N3F(x,y,z) {                                    \
148         float nnn[3];                                   \
149         nnn[0] = x; nnn[1] = y; nnn[2] = z; n3f (nnn);  \
150 }
151
152 /* =========================================================== */
153
154 void DrawStuff_twistoid (void) {
155    int i;
156
157    toid1_twists[2] = (lastx-121.0) / 8.0;
158
159    i=3;
160 /*
161    TPTS (1.0, lasty /400.0);
162    TPTS (1.1, 1.1 * lasty / 400.0);
163 */
164    TPTS (1.0, -(lasty-121.0) /200.0);
165    TPTS (1.1, -1.1 * (lasty-121.0) / 200.0);
166
167 #ifdef IBM_GL_32
168    rotate (230, 'x');
169    rotate (230, 'y');
170    scale (1.8, 1.8, 1.8);
171
172    if (mono_color) {
173       RGBcolor (178, 178, 204);
174       twist_extrusion (NUM_TWIS_PTS, twistation, twist_normal, 
175                 NULL, NUM_TOID1_PTS, toid1_points, NULL, toid1_twists);
176    } else {
177       twist_extrusion (NUM_TWIS_PTS, twistation, twist_normal, 
178               NULL, NUM_TOID1_PTS, toid1_points, toid1_colors, toid1_twists);
179    }
180 #endif
181
182 #ifdef OPENGL_10
183    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
184
185   glFrontFace(GL_CW);  /* jwz */
186
187    /* set up some matrices so that the object spins with the mouse */
188    glPushMatrix ();
189 /* glTranslatef (0.0, 0.0, -80.0); */
190 /* glRotated (43.0, 1.0, 0.0, 0.0); */
191 /* glRotated (43.0, 0.0, 1.0, 0.0); */
192    glScaled (1.8, 1.8, 1.8);
193    gleTwistExtrusion (NUM_TWIS_PTS, twistation, twist_normal, 
194               NULL, NUM_TOID1_PTS, toid1_points, NULL, toid1_twists);
195    glPopMatrix ();
196 #endif
197
198 }
199
200 /* =========================================================== */
201
202 void InitStuff_twistoid (void) 
203 {
204    int js;
205
206    init_toid1_line ();
207    init_tripples ();
208
209 #ifdef IBM_GL_32
210    js = getjoinstyle ();
211    js &= ~TUBE_CONTOUR_CLOSED;
212    setjoinstyle (js);
213 #endif
214
215 #ifdef OPENGL_10
216    js = gleGetJoinStyle ();
217    js &= ~TUBE_CONTOUR_CLOSED;
218    gleSetJoinStyle (js);
219 #endif
220
221 }
222
223 /* ------------------ end of file -------------------- */