1 /* tube, Copyright (c) 2001 Jamie Zawinski <jwz@jwz.org>
2 * Utility functions to create tubes and cones in GL.
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that
7 * copyright notice and this permission notice appear in supporting
8 * documentation. No representations are made about the suitability of this
9 * software for any purpose. It is provided "as is" without express or
20 unit_tube (int faces, Bool smooth, Bool wire)
23 GLfloat step = M_PI * 2 / faces;
32 glBegin (wire ? GL_LINES : (smooth ? GL_QUAD_STRIP : GL_QUADS));
46 for (i = 0; i < faces; i++)
51 glNormal3f(x0, 0, y0);
73 for (z = 0; z <= 1; z++)
75 glFrontFace(z == 0 ? GL_CCW : GL_CW);
76 glNormal3f(0, (z == 0 ? -1 : 1), 0);
77 glBegin(wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
78 if (! wire) glVertex3f(0, z, 0);
79 for (i = 0, th = 0; i <= faces; i++)
92 unit_cone (int faces, Bool smooth, Bool wire)
95 GLfloat step = M_PI * 2 / faces;
103 glBegin(wire ? GL_LINES : GL_TRIANGLES);
111 for (i = 0; i < faces; i++)
113 glNormal3f(x0, 0, y0);
116 if (smooth) glNormal3f(x, 0, y);
125 if (smooth) glNormal3f(x, 0, y);
133 glNormal3f(0, -1, 0);
134 glBegin(wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
135 if (! wire) glVertex3f(0, 0, 0);
136 for (i = 0, th = 0; i <= faces; i++)
138 GLfloat x = cos (th);
139 GLfloat y = sin (th);
148 tube_1 (GLfloat x1, GLfloat y1, GLfloat z1,
149 GLfloat x2, GLfloat y2, GLfloat z2,
150 GLfloat diameter, GLfloat cap_size,
151 int faces, Bool smooth, Bool wire,
154 GLfloat length, angle, a, b, c;
156 if (diameter <= 0) abort();
162 length = sqrt (a*a + b*b + c*c);
163 angle = acos (a / length);
166 glTranslatef(x1, y1, z1);
167 glScalef (length, length, length);
169 if (c == 0 && b == 0)
170 glRotatef (angle / (M_PI / 180), 0, 1, 0);
172 glRotatef (angle / (M_PI / 180), 0, -c, b);
174 glRotatef (-90, 0, 0, 1);
175 glScalef (diameter/length, 1, diameter/length);
177 /* extend the endpoints of the tube by the cap size in both directions */
180 GLfloat c = cap_size/length;
181 glTranslatef (0, -c, 0);
182 glScalef (1, 1+c+c, 1);
186 unit_cone (faces, smooth, wire);
188 unit_tube (faces, smooth, wire);
194 tube (GLfloat x1, GLfloat y1, GLfloat z1,
195 GLfloat x2, GLfloat y2, GLfloat z2,
196 GLfloat diameter, GLfloat cap_size,
197 int faces, Bool smooth, Bool wire)
199 tube_1 (x1, y1, z1, x2, y2, z2, diameter, cap_size, faces, smooth, wire,
205 cone (GLfloat x1, GLfloat y1, GLfloat z1,
206 GLfloat x2, GLfloat y2, GLfloat z2,
207 GLfloat diameter, GLfloat cap_size,
208 int faces, Bool smooth, Bool wire)
210 tube_1 (x1, y1, z1, x2, y2, z2, diameter, cap_size, faces, smooth, wire,