X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Ftube.c;h=abcfca9160ea1dc4144fd71f0106ce0e3f2703a9;hb=49f5b54f312fe4ac2e9bc47581a72451bd0e8439;hp=6632c29d6882ec641a2e565f507b195974e3b5b4;hpb=82c5080773aae5e72ec155327c075775e023d2ee;p=xscreensaver diff --git a/hacks/glx/tube.c b/hacks/glx/tube.c index 6632c29d..abcfca91 100644 --- a/hacks/glx/tube.c +++ b/hacks/glx/tube.c @@ -1,4 +1,4 @@ -/* tube, Copyright (c) 2001 Jamie Zawinski +/* tube, Copyright (c) 2001, 2003 Jamie Zawinski * Utility functions to create tubes and cones in GL. * * Permission to use, copy, modify, distribute, and sell this software and its @@ -10,26 +10,36 @@ * implied warranty. */ -#include "config.h" -#include #include -#include + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#ifdef HAVE_COCOA +# include +#else +# include +#endif + #include "tube.h" static void -unit_tube (int faces, Bool smooth, Bool wire) +unit_tube (int faces, int smooth, int caps_p, int wire_p) { int i; GLfloat step = M_PI * 2 / faces; GLfloat s2 = step/2; GLfloat th; - GLfloat x, y, x0, y0; + GLfloat x, y, x0=0, y0=0; int z = 0; /* side walls */ glFrontFace(GL_CCW); - glBegin (wire ? GL_LINES : (smooth ? GL_QUAD_STRIP : GL_QUADS)); + glBegin (wire_p ? GL_LINES : (smooth ? GL_QUAD_STRIP : GL_QUADS)); th = 0; x = 1; @@ -70,26 +80,27 @@ unit_tube (int faces, Bool smooth, Bool wire) /* End caps */ - for (z = 0; z <= 1; z++) - { - glFrontFace(z == 0 ? GL_CCW : GL_CW); - glNormal3f(0, (z == 0 ? -1 : 1), 0); - glBegin(wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN); - if (! wire) glVertex3f(0, z, 0); - for (i = 0, th = 0; i <= faces; i++) - { - GLfloat x = cos (th); - GLfloat y = sin (th); - glVertex3f(x, z, y); - th += step; - } - glEnd(); - } + if (caps_p) + for (z = 0; z <= 1; z++) + { + glFrontFace(z == 0 ? GL_CCW : GL_CW); + glNormal3f(0, (z == 0 ? -1 : 1), 0); + glBegin(wire_p ? GL_LINE_LOOP : GL_TRIANGLE_FAN); + if (! wire_p) glVertex3f(0, z, 0); + for (i = 0, th = 0; i <= faces; i++) + { + GLfloat x = cos (th); + GLfloat y = sin (th); + glVertex3f(x, z, y); + th += step; + } + glEnd(); + } } static void -unit_cone (int faces, Bool smooth, Bool wire) +unit_cone (int faces, int smooth, int cap_p, int wire_p) { int i; GLfloat step = M_PI * 2 / faces; @@ -100,7 +111,7 @@ unit_cone (int faces, Bool smooth, Bool wire) /* side walls */ glFrontFace(GL_CW); - glBegin(wire ? GL_LINES : GL_TRIANGLES); + glBegin(wire_p ? GL_LINES : GL_TRIANGLES); th = 0; x = 1; @@ -129,18 +140,21 @@ unit_cone (int faces, Bool smooth, Bool wire) /* End cap */ - glFrontFace(GL_CCW); - glNormal3f(0, -1, 0); - glBegin(wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN); - if (! wire) glVertex3f(0, 0, 0); - for (i = 0, th = 0; i <= faces; i++) + if (cap_p) { - GLfloat x = cos (th); - GLfloat y = sin (th); - glVertex3f(x, 0, y); - th += step; + glFrontFace(GL_CCW); + glNormal3f(0, -1, 0); + glBegin(wire_p ? GL_LINE_LOOP : GL_TRIANGLE_FAN); + if (! wire_p) glVertex3f(0, 0, 0); + for (i = 0, th = 0; i <= faces; i++) + { + GLfloat x = cos (th); + GLfloat y = sin (th); + glVertex3f(x, 0, y); + th += step; + } + glEnd(); } - glEnd(); } @@ -148,31 +162,28 @@ static void tube_1 (GLfloat x1, GLfloat y1, GLfloat z1, GLfloat x2, GLfloat y2, GLfloat z2, GLfloat diameter, GLfloat cap_size, - int faces, Bool smooth, Bool wire, - Bool cone_p) + int faces, int smooth, int caps_p, int wire_p, + int cone_p) { - GLfloat length, angle, a, b, c; + GLfloat length, X, Y, Z; if (diameter <= 0) abort(); - a = (x2 - x1); - b = (y2 - y1); - c = (z2 - z1); + X = (x2 - x1); + Y = (y2 - y1); + Z = (z2 - z1); - length = sqrt (a*a + b*b + c*c); - angle = acos (a / length); + if (X == 0 && Y == 0 && Z == 0) + return; - glPushMatrix(); - glTranslatef(x1, y1, z1); - glScalef (length, length, length); + length = sqrt (X*X + Y*Y + Z*Z); - if (c == 0 && b == 0) - glRotatef (angle / (M_PI / 180), 0, 1, 0); - else - glRotatef (angle / (M_PI / 180), 0, -c, b); + glPushMatrix(); - glRotatef (-90, 0, 0, 1); - glScalef (diameter/length, 1, diameter/length); + glTranslatef(x1, y1, z1); + glRotatef (-atan2 (X, Y) * (180 / M_PI), 0, 0, 1); + glRotatef ( atan2 (Z, sqrt(X*X + Y*Y)) * (180 / M_PI), 1, 0, 0); + glScalef (diameter, length, diameter); /* extend the endpoints of the tube by the cap size in both directions */ if (cap_size != 0) @@ -183,9 +194,10 @@ tube_1 (GLfloat x1, GLfloat y1, GLfloat z1, } if (cone_p) - unit_cone (faces, smooth, wire); + unit_cone (faces, smooth, caps_p, wire_p); else - unit_tube (faces, smooth, wire); + unit_tube (faces, smooth, caps_p, wire_p); + glPopMatrix(); } @@ -194,10 +206,11 @@ void tube (GLfloat x1, GLfloat y1, GLfloat z1, GLfloat x2, GLfloat y2, GLfloat z2, GLfloat diameter, GLfloat cap_size, - int faces, Bool smooth, Bool wire) + int faces, int smooth, int caps_p, int wire_p) { - tube_1 (x1, y1, z1, x2, y2, z2, diameter, cap_size, faces, smooth, wire, - False); + tube_1 (x1, y1, z1, x2, y2, z2, diameter, cap_size, + faces, smooth, caps_p, wire_p, + 0); } @@ -205,8 +218,9 @@ void cone (GLfloat x1, GLfloat y1, GLfloat z1, GLfloat x2, GLfloat y2, GLfloat z2, GLfloat diameter, GLfloat cap_size, - int faces, Bool smooth, Bool wire) + int faces, int smooth, int cap_p, int wire_p) { - tube_1 (x1, y1, z1, x2, y2, z2, diameter, cap_size, faces, smooth, wire, - True); + tube_1 (x1, y1, z1, x2, y2, z2, diameter, cap_size, + faces, smooth, cap_p, wire_p, + 1); }