diff options
Diffstat (limited to 'hacks/glx/extrusion-taper.c')
-rw-r--r-- | hacks/glx/extrusion-taper.c | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/hacks/glx/extrusion-taper.c b/hacks/glx/extrusion-taper.c new file mode 100644 index 0000000..d2d05a1 --- /dev/null +++ b/hacks/glx/extrusion-taper.c @@ -0,0 +1,218 @@ +/* + * taper.c + * + * FUNCTION: + * Draws a tapered screw shape. + * + * HISTORY: + * -- created by Linas Vepstas October 1991 + * -- heavily modified to draw more texas shapes, Feb 1993, Linas + * -- converted to use GLUT -- December 1995, Linas + * + */ + +#include "extrusion.h" + +#include <math.h> +#include <stdlib.h> + +#ifndef NULL +#define NULL ((void *) 0x0) +#endif /* NULL */ + +/* Some <math.h> files do not define M_PI... */ +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +/* =========================================================== */ + +#define SCALE 3.33333 +#define CONTOUR(x,y) { \ + double ax, ay, alen; \ + contour[i][0] = SCALE * (x); \ + contour[i][1] = SCALE * (y); \ + if (i!=0) { \ + ax = contour[i][0] - contour[i-1][0]; \ + ay = contour[i][1] - contour[i-1][1]; \ + alen = 1.0 / sqrt (ax*ax + ay*ay); \ + ax *= alen; ay *= alen; \ + norms [i-1][0] = ay; \ + norms [i-1][1] = -ax; \ + } \ + i++; \ +} + +#define NUM_PTS (25) + +static double contour [NUM_PTS][2]; +static double norms [NUM_PTS][2]; + +static void init_contour (void) +{ + int i; + + /* outline of extrusion */ + i=0; + CONTOUR (1.0, 1.0); + CONTOUR (1.0, 2.9); + CONTOUR (0.9, 3.0); + CONTOUR (-0.9, 3.0); + CONTOUR (-1.0, 2.9); + + CONTOUR (-1.0, 1.0); + CONTOUR (-2.9, 1.0); + CONTOUR (-3.0, 0.9); + CONTOUR (-3.0, -0.9); + CONTOUR (-2.9, -1.0); + + CONTOUR (-1.0, -1.0); + CONTOUR (-1.0, -2.9); + CONTOUR (-0.9, -3.0); + CONTOUR (0.9, -3.0); + CONTOUR (1.0, -2.9); + + CONTOUR (1.0, -1.0); + CONTOUR (2.9, -1.0); + CONTOUR (3.0, -0.9); + CONTOUR (3.0, 0.9); + CONTOUR (2.9, 1.0); + + CONTOUR (1.0, 1.0); /* repeat so that last normal is computed */ +} + +/* =========================================================== */ + +#define PSIZE 40 +static double path[PSIZE][3]; +static double twist[PSIZE]; +static double taper[PSIZE]; + +static void init_taper (void) { + int j; + double z, deltaz; + double ang, dang; + + z = -10.0; + deltaz = 0.5; + + ang = 0.0; + dang = 20.0; + for (j=0; j<40; j++) { + path[j][0] = 0x0; + path[j][1] = 0x0; + path[j][2] = z; + + twist[j] = ang; + ang += dang; + + taper[j] = 0.1 * sqrt (9.51*9.51 - z*z); + + z += deltaz; + } + + taper[0] = taper[1]; + taper[39] = taper[38]; + +} + +/* =========================================================== */ + +/* controls shape of object */ +extern float lastx; +extern float lasty; + +void InitStuff_taper (void) +{ + int style; + + /* configure the pipeline */ + style = TUBE_JN_CAP; + style |= TUBE_CONTOUR_CLOSED; + style |= TUBE_NORM_FACET; + style |= TUBE_JN_ANGLE; + gleSetJoinStyle (style); + + init_contour(); + init_taper(); +} + +/* =========================================================== */ + +static void gleTaper (int ncp, + gleDouble contour[][2], + gleDouble cont_normal[][2], + gleDouble up[3], + int npoints, + gleDouble point_array[][3], + float color_array[][3], + gleDouble taper[], + gleDouble twist[]) +{ + int j; + gleAffine *xforms; + double co, si, angle; + + /* malloc the extrusion array and the twist array */ + xforms = (gleAffine *) malloc (npoints * sizeof(gleAffine)); + + for (j=0; j<npoints; j++) { + angle = (M_PI/180.0) * twist[j]; + si = sin (angle); + co = cos (angle); + xforms[j][0][0] = taper[j] * co; + xforms[j][0][1] = - taper[j] * si; + xforms[j][0][2] = 0.0; + xforms[j][1][0] = taper[j] * si; + xforms[j][1][1] = taper[j] * co; + xforms[j][1][2] = 0.0; + } + + gleSuperExtrusion (ncp, /* number of contour points */ + contour, /* 2D contour */ + cont_normal, /* 2D contour normals */ + up, /* up vector for contour */ + npoints, /* numpoints in poly-line */ + point_array, /* polyline */ + color_array, /* color of polyline */ + xforms); + + free (xforms); +} + +/* =========================================================== */ + +void DrawStuff_taper (void) { + int j; + double ang, dang; + double z, deltaz; + double ponent; + z=-1.0; + deltaz = 1.999/38; + ang = 0.0; + dang = lasty/40.0; + ponent = fabs (lastx/540.0); + for (j=1; j<39; j++) { + twist[j] = ang; + ang += dang; + + taper[j] = pow ((1.0 - pow (fabs(z), 1.0/ponent)), ponent); + z += deltaz; + } + + glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glColor3f (0.5, 0.6, 0.6); + + /* set up some matrices so that the object spins with the mouse */ + glPushMatrix (); + /* glTranslatef (0.0, 0.0, -80.0); */ + /* glRotatef (130.0, 0.0, 1.0, 0.0); */ + /* glRotatef (65.0, 1.0, 0.0, 0.0); */ + + /* draw the brand and the handle */ + gleTaper (20, contour, norms, NULL, 40, path, NULL, taper, twist); + + glPopMatrix (); +} + +/* ===================== END OF FILE ================== */ |