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