1 /* tube, Copyright (c) 2001, 2003 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
22 # include <OpenGL/gl.h>
30 unit_tube (int faces, int smooth, int caps_p, int wire_p)
33 GLfloat step = M_PI * 2 / faces;
36 GLfloat x, y, x0=0, y0=0;
42 glBegin (wire_p ? GL_LINES : (smooth ? GL_QUAD_STRIP : GL_QUADS));
56 for (i = 0; i < faces; i++)
61 glNormal3f(x0, 0, y0);
84 for (z = 0; z <= 1; z++)
86 glFrontFace(z == 0 ? GL_CCW : GL_CW);
87 glNormal3f(0, (z == 0 ? -1 : 1), 0);
88 glBegin(wire_p ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
89 if (! wire_p) glVertex3f(0, z, 0);
90 for (i = 0, th = 0; i <= faces; i++)
103 unit_cone (int faces, int smooth, int cap_p, int wire_p)
106 GLfloat step = M_PI * 2 / faces;
109 GLfloat x, y, x0, y0;
114 glBegin(wire_p ? GL_LINES : GL_TRIANGLES);
122 for (i = 0; i < faces; i++)
124 glNormal3f(x0, 0, y0);
127 if (smooth) glNormal3f(x, 0, y);
136 if (smooth) glNormal3f(x, 0, y);
146 glNormal3f(0, -1, 0);
147 glBegin(wire_p ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
148 if (! wire_p) glVertex3f(0, 0, 0);
149 for (i = 0, th = 0; i <= faces; i++)
151 GLfloat x = cos (th);
152 GLfloat y = sin (th);
162 tube_1 (GLfloat x1, GLfloat y1, GLfloat z1,
163 GLfloat x2, GLfloat y2, GLfloat z2,
164 GLfloat diameter, GLfloat cap_size,
165 int faces, int smooth, int caps_p, int wire_p,
168 GLfloat length, X, Y, Z;
170 if (diameter <= 0) abort();
176 if (X == 0 && Y == 0 && Z == 0)
179 length = sqrt (X*X + Y*Y + Z*Z);
183 glTranslatef(x1, y1, z1);
184 glRotatef (-atan2 (X, Y) * (180 / M_PI), 0, 0, 1);
185 glRotatef ( atan2 (Z, sqrt(X*X + Y*Y)) * (180 / M_PI), 1, 0, 0);
186 glScalef (diameter, length, diameter);
188 /* extend the endpoints of the tube by the cap size in both directions */
191 GLfloat c = cap_size/length;
192 glTranslatef (0, -c, 0);
193 glScalef (1, 1+c+c, 1);
197 unit_cone (faces, smooth, caps_p, wire_p);
199 unit_tube (faces, smooth, caps_p, wire_p);
206 tube (GLfloat x1, GLfloat y1, GLfloat z1,
207 GLfloat x2, GLfloat y2, GLfloat z2,
208 GLfloat diameter, GLfloat cap_size,
209 int faces, int smooth, int caps_p, int wire_p)
211 tube_1 (x1, y1, z1, x2, y2, z2, diameter, cap_size,
212 faces, smooth, caps_p, wire_p,
218 cone (GLfloat x1, GLfloat y1, GLfloat z1,
219 GLfloat x2, GLfloat y2, GLfloat z2,
220 GLfloat diameter, GLfloat cap_size,
221 int faces, int smooth, int cap_p, int wire_p)
223 tube_1 (x1, y1, z1, x2, y2, z2, diameter, cap_size,
224 faces, smooth, cap_p, wire_p,