- if (!invert)
- {
- r0 = inner_radius;
- r1 = outer_radius - tooth_depth / 2.0;
- r2 = outer_radius + tooth_depth / 2.0;
- glFrontFace(GL_CCW);
- }
- else
- {
- r0 = outer_radius;
- r2 = inner_radius + tooth_depth / 2.0;
- r1 = outer_radius - tooth_depth / 2.0;
- glFrontFace(GL_CW);
- }
-
- da = 2.0 * M_PI / teeth / 4.0;
-
- glShadeModel(GL_FLAT);
-
- /* This subroutine got kind of messy when I added all the checks
- * for wireframe mode. A much cleaner solution that I sometimes
- * use is to have a variable hold the value GL_LINE_LOOP when
- * in wireframe mode, or hold the value GL_POLYGON otherwise.
- * Then I just call glBegin(that_variable), give my polygon
- * coordinates, and glEnd(). Pretty neat eh? Too bad I couldn't
- * integrate that trick here.
- * --Ed.
- */
-
- if (!wire)
- glNormal3f(0.0, 0.0, 1.0);
-
- /* draw front face */
- if (!wire)
- glBegin(GL_QUAD_STRIP);
- for (i = 0; i <= teeth; i++) {
- if (wire)
- glBegin(GL_LINES);
- angle = i * 2.0 * M_PI / teeth;
- glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
- glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
- if (!wire) {
- glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
- glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
- } else {
- glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
- glVertex3f(r1 * cos(angle + 4 * da), r1 * sin(angle + 4 * da), width * 0.5);
- glEnd();
- }
- }
- if (!wire)
- glEnd();
-
- /* draw front sides of teeth */
- if (!wire)
- glBegin(GL_QUADS);
- da = 2.0 * M_PI / teeth / 4.0;
- for (i = 0; i < teeth; i++) {
- angle = i * 2.0 * M_PI / teeth;
-
- if (wire)
- glBegin(GL_LINE_LOOP);
- glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
- glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
- glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);
- glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
- if (wire)
- glEnd();
- }
- if (!wire)
- glEnd();
-
-
- if (!wire)
- glNormal3f(0.0, 0.0, -1.0);
-
- /* draw back face */
- if (!wire)
- glBegin(GL_QUAD_STRIP);
- for (i = 0; i <= teeth; i++) {
- angle = i * 2.0 * M_PI / teeth;
- if (wire)
- glBegin(GL_LINES);
- glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
- glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
- if (!wire) {
- glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
- glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
- } else {
- glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
- glVertex3f(r1 * cos(angle + 4 * da), r1 * sin(angle + 4 * da), -width * 0.5);
- glEnd();
- }
- }
- if (!wire)
- glEnd();
-
- /* draw back sides of teeth */
- if (!wire)
- glBegin(GL_QUADS);
- da = 2.0 * M_PI / teeth / 4.0;
- for (i = 0; i < teeth; i++) {
- angle = i * 2.0 * M_PI / teeth;
-
- if (wire)
- glBegin(GL_LINE_LOOP);
- glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
- glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);
- glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
- glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
- if (wire)
- glEnd();
- }
- if (!wire)
- glEnd();
-
-
- /* draw outward faces of teeth */
- if (!wire)
- glBegin(GL_QUAD_STRIP);
- for (i = 0; i <= teeth; i++) {
- angle = i * 2.0 * M_PI / teeth;
-
- if(!invert) {
- u = r2 * cos(angle + da) - r1 * cos(angle);
- v = r2 * sin(angle + da) - r1 * sin(angle);
- } else {
- u = r2 * cos(angle + da + M_PI/2) - r1 * cos(angle + M_PI/2);
- v = r2 * sin(angle + da + M_PI/2) - r1 * sin(angle + M_PI/2);
- }
+ if (event->xany.type == ButtonPress &&
+ event->xbutton.button == Button1)
+ {
+ bp->button_down_p = True;
+ gltrackball_start (bp->trackball,
+ event->xbutton.x, event->xbutton.y,
+ MI_WIDTH (mi), MI_HEIGHT (mi));
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease &&
+ event->xbutton.button == Button1)
+ {
+ bp->button_down_p = False;
+ return True;
+ }
+ else if (event->xany.type == ButtonPress &&
+ (event->xbutton.button == Button4 ||
+ event->xbutton.button == Button5))
+ {
+ gltrackball_mousewheel (bp->trackball, event->xbutton.button, 10,
+ !!event->xbutton.state);
+ return True;
+ }
+ else if (event->xany.type == MotionNotify &&
+ bp->button_down_p)
+ {
+ gltrackball_track (bp->trackball,
+ event->xmotion.x, event->xmotion.y,
+ MI_WIDTH (mi), MI_HEIGHT (mi));
+ return True;
+ }