56544ff934cbbd1c0eaddbd3cc5f5f526b5b3987
[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 (i< NUM_TWIS_PTS) {
124       TWIST ((-10.0 +(double) i), 0.0);
125       TWIST ((-9.5 +(double) i), 1.0);
126    }
127 }
128
129    
130 /* =========================================================== */
131
132 #define V3F(x,y,z) {                                    \
133         float vvv[3];                                   \
134         vvv[0] = x; vvv[1] = y; vvv[2] = z; v3f (vvv);  \
135 }
136
137 #define N3F(x,y,z) {                                    \
138         float nnn[3];                                   \
139         nnn[0] = x; nnn[1] = y; nnn[2] = z; n3f (nnn);  \
140 }
141
142 /* =========================================================== */
143
144 void DrawStuff_twistoid (void) {
145    int i;
146
147    toid1_twists[2] = (lastx-121.0) / 8.0;
148
149    i=3;
150 /*
151    TPTS (1.0, lasty /400.0);
152    TPTS (1.1, 1.1 * lasty / 400.0);
153 */
154    TPTS (1.0, -(lasty-121.0) /200.0);
155    TPTS (1.1, -1.1 * (lasty-121.0) / 200.0);
156
157 #ifdef IBM_GL_32
158    rotate (230, 'x');
159    rotate (230, 'y');
160    scale (1.8, 1.8, 1.8);
161
162    if (mono_color) {
163       RGBcolor (178, 178, 204);
164       twist_extrusion (NUM_TWIS_PTS, twistation, twist_normal, 
165                 NULL, NUM_TOID1_PTS, toid1_points, NULL, toid1_twists);
166    } else {
167       twist_extrusion (NUM_TWIS_PTS, twistation, twist_normal, 
168               NULL, NUM_TOID1_PTS, toid1_points, toid1_colors, toid1_twists);
169    }
170 #endif
171
172 #ifdef OPENGL_10
173    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
174
175   glFrontFace(GL_CW);  /* jwz */
176
177    /* set up some matrices so that the object spins with the mouse */
178    glPushMatrix ();
179 /* glTranslatef (0.0, 0.0, -80.0); */
180 /* glRotated (43.0, 1.0, 0.0, 0.0); */
181 /* glRotated (43.0, 0.0, 1.0, 0.0); */
182    glScaled (1.8, 1.8, 1.8);
183    gleTwistExtrusion (NUM_TWIS_PTS, twistation, twist_normal, 
184               NULL, NUM_TOID1_PTS, toid1_points, NULL, toid1_twists);
185    glPopMatrix ();
186 #endif
187
188 }
189
190 /* =========================================================== */
191
192 void InitStuff_twistoid (void) 
193 {
194    int js;
195
196    init_toid1_line ();
197    init_tripples ();
198
199 #ifdef IBM_GL_32
200    js = getjoinstyle ();
201    js &= ~TUBE_CONTOUR_CLOSED;
202    setjoinstyle (js);
203 #endif
204
205 #ifdef OPENGL_10
206    js = gleGetJoinStyle ();
207    js &= ~TUBE_CONTOUR_CLOSED;
208    gleSetJoinStyle (js);
209 #endif
210
211 }
212
213 /* ------------------ end of file -------------------- */