Hi,

thanks for your comments so far. I've rebased my fixes on the latest git
code.

Here's three patches (which I release under the license of the original
source files):

geartrain_1_3_loading.patch
improves the loading routines. If you like pain, take a close look at
the strset() implementation and figure out what happens when it's called
with ch = 0. Or, for that matter, called on an uninitialized buffer. Ouch.

geartrain_2_3_gears.patch
fixes the geometry on beveled gears, adds some missing normals and makes
slight corrections to others, sets everything to FLAT shading as that
was obviously intended by the author.
(I just noticed I'm now setting some normals twice, but that doesn't hurt.)

geartrain_3_3_backfaces.patch
switches part of the geometry around to render the outer faces of the
gears as backfaces.


Please let me know if you either require further changes to these
patches or any kind of formality hoops I should jump through for submitting.


greetings,
Christian
diff --git a/src/demos/geartrain.c b/src/demos/geartrain.c
index 49a9a70..5d5e5e2 100644
--- a/src/demos/geartrain.c
+++ b/src/demos/geartrain.c
@@ -105,25 +105,14 @@ static GLint T0 = 0;
 static GLint Frames = 0;
 
 
-#ifndef _WIN32
-static void
-strset (char buf[], char ch)
-{
-    int i;
-    for (i = 0; i < strlen (buf); i++)
-      buf[i] = ch;
-}
-#endif
-
-
 static void
 Clear_Buffers (void)
 {
-    strset (Buf1, 0);
-    strset (Buf2, 0);
-    strset (Buf3, 0);
-    strset (Buf4, 0);
-    strset (Buf5, 0);
+    memset (Buf1, '\0', 256);
+    memset (Buf2, '\0', 256);
+    memset (Buf3, '\0', 256);
+    memset (Buf4, '\0', 256);
+    memset (Buf5, '\0', 256);
 }
 
 
@@ -274,9 +263,12 @@ getdata (char filename[])
        if (!(strcmp (Buf1, "GEAR2NAME")))
          LoadText (b[belt_count - 1].gear2_name);
     }
-
     while (Buf1[0] != 0);
 
+    number_of_gears = gear_count;
+    number_of_axles = axle_count;
+    number_of_belts = belt_count;
+
     for (i = 0; i < number_of_gears; i++)
     {
        g[i].axis = -1;
@@ -284,9 +276,6 @@ getdata (char filename[])
        g[i].angular_velocity = 0.0;
     }
 
-    number_of_gears = gear_count;
-    number_of_axles = axle_count;
-    number_of_belts = belt_count;
     fclose (mainfile);
 }
 
diff --git a/src/demos/geartrain.c b/src/demos/geartrain.c
index 5d5e5e2..95f527f 100644
--- a/src/demos/geartrain.c
+++ b/src/demos/geartrain.c
@@ -332,29 +332,27 @@ gear (GLint j, char type[], GLfloat radius, GLfloat width,
       GLint teeth, GLfloat tooth_depth)
 {
     GLint i;
-    GLfloat r1, r2;
+    GLfloat r1, r2_front, r2_back;
     GLfloat angle, da;
     GLfloat u, v, len, fraction = 0.5;
     GLfloat n = 1.0;
 
     r1 = radius - tooth_depth;
-    r2 = radius;
+    r2_front = r2_back = radius;
+
+    fraction = 0.5;
+    n = 1.0;
 
     da = 2.0 * M_PI / teeth / 4.0;
-    if (!g[j].face)
-    {
-       fraction = -0.5;
-       n = -1.0;
-    }
-    if (!(strcmp (type, "NORMAL")))
+    if (!(strcmp (type, "BEVEL")))
     {
-       fraction = 0.5;
-       n = 1.0;
+        if (g[j].face)
+            r2_front = radius - width;
+        else
+            r2_back = radius - width;
     }
 
     /* draw front face */
-    if (!(strcmp (type, "NORMAL")))
-    {
        glNormal3f (0.0, 0.0, 1.0 * n);
        glBegin (GL_QUAD_STRIP);
        for (i = 0; i <= teeth; i++)
@@ -366,25 +364,8 @@ gear (GLint j, char type[], GLfloat radius, GLfloat width,
            glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), 
width * fraction);
        }
        glEnd ();
-    }
-    else
-    {
-       glNormal3f (0.0, 0.0, 1.0 * n);
-       glBegin (GL_QUAD_STRIP);
-       for (i = 0; i <= teeth; i++)
-       {
-           angle = i * 2.0 * M_PI / teeth;
-           glVertex3f (0.0, 0.0, width * fraction);
-           glVertex3f ((r2 - width) * cos (angle), (r2 - width) * sin (angle), 
width * fraction);
-           glVertex3f (0.0, 0.0, width * fraction);
-           glVertex3f ((r2 - width) * cos (angle + 3 * da), (r2 - width) * sin 
(angle + 3 * da), width * fraction);
-       }
-       glEnd ();
-    }
 
     /* draw front sides of teeth */
-    if (!(strcmp (type, "NORMAL")))
-    {
        glNormal3f (0.0, 0.0, 1.0 * n);
        glBegin (GL_QUADS);
        da = 2.0 * M_PI / teeth / 4.0;
@@ -392,16 +373,14 @@ gear (GLint j, char type[], GLfloat radius, GLfloat width,
        {
            angle = i * 2.0 * M_PI / teeth;
            glVertex3f (r1 * cos (angle), r1 * sin (angle), width * fraction);
-           glVertex3f (r2 * cos (angle + da), r2 * sin (angle + da), width * 
fraction);
-           glVertex3f (r2 * cos (angle + 2 * da), r2 * sin (angle + 2 * da), 
width * fraction);
+           glVertex3f (r2_front * cos (angle + da), r2_front * sin (angle + 
da), width * fraction);
+           glVertex3f (r2_front * cos (angle + 2 * da), r2_front * sin (angle 
+ 2 * da), width * fraction);
            glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), 
width * fraction);
        }
        glEnd ();
-    }
-
-    glNormal3f (0.0, 0.0, -1.0 * n);
 
     /* draw back face */
+    glNormal3f (0.0, 0.0, -1.0 * n);
     glBegin (GL_QUAD_STRIP);
     for (i = 0; i <= teeth; i++)
     {
@@ -421,70 +400,45 @@ gear (GLint j, char type[], GLfloat radius, GLfloat width,
     {
        angle = i * 2.0 * M_PI / teeth;
        glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), 
-width * fraction);
-       glVertex3f (r2 * cos (angle + 2 * da), r2 * sin (angle + 2 * da), 
-width * fraction);
-       glVertex3f (r2 * cos (angle + da), r2 * sin (angle + da), -width * 
fraction);
+       glVertex3f (r2_back * cos (angle + 2 * da), r2_back * sin (angle + 2 * 
da), -width * fraction);
+       glVertex3f (r2_back * cos (angle + da), r2_back * sin (angle + da), 
-width * fraction);
        glVertex3f (r1 * cos (angle), r1 * sin (angle), -width * fraction);
     }
     glEnd ();
 
 
     /* draw outward faces of teeth */
-    if (!(strcmp (type, "NORMAL")))
-    {
        glBegin (GL_QUAD_STRIP);
        for (i = 0; i < teeth; i++)
        {
            angle = i * 2.0 * M_PI / teeth;
 
+           glNormal3f (cos (angle - 0.5*da), sin (angle - 0.5*da), 0.0);
            glVertex3f (r1 * cos (angle), r1 * sin (angle), width * fraction);
            glVertex3f (r1 * cos (angle), r1 * sin (angle), -width * fraction);
-           u = r2 * cos (angle + da) - r1 * cos (angle);
-           v = r2 * sin (angle + da) - r1 * sin (angle);
+           u = (r2_front+r2_back)/2.0 * cos (angle + da) - r1 * cos (angle);
+           v = (r2_front+r2_back)/2.0 * sin (angle + da) - r1 * sin (angle);
            len = sqrt (u * u + v * v);
            u /= len;
            v /= len;
            glNormal3f (v, -u, 0.0);
-           glVertex3f (r2 * cos (angle + da), r2 * sin (angle + da), width * 
fraction);
-           glVertex3f (r2 * cos (angle + da), r2 * sin (angle + da), -width * 
fraction);
-           glNormal3f (cos (angle), sin (angle), 0.0);
-           glVertex3f (r2 * cos (angle + 2 * da), r2 * sin (angle + 2 * da), 
width * fraction);
-           glVertex3f (r2 * cos (angle + 2 * da), r2 * sin (angle + 2 * da), 
-width * fraction);
-           u = r1 * cos (angle + 3 * da) - r2 * cos (angle + 2 * da);
-           v = r1 * sin (angle + 3 * da) - r2 * sin (angle + 2 * da);
-           glNormal3f (v, -u, 0.0);
-           glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), 
width * fraction);
-           glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), 
-width * fraction);
-           glNormal3f (cos (angle), sin (angle), 0.0);
-       }
-    }
-    else
-    {
-       glBegin (GL_QUAD_STRIP);
-       for (i = 0; i < teeth; i++)
-       {
-           angle = i * 2.0 * M_PI / teeth;
-           glVertex3f (r1 * cos (angle), r1 * sin (angle), width * fraction);
-           glVertex3f (r1 * cos (angle), r1 * sin (angle), -width * fraction);
-           u = r2 * cos (angle + da) - r1 * cos (angle);
-           v = r2 * sin (angle + da) - r1 * sin (angle);
+           glVertex3f (r2_front * cos (angle + da), r2_front * sin (angle + 
da), width * fraction);
+           glVertex3f (r2_back * cos (angle + da), r2_back * sin (angle + da), 
-width * fraction);
+           glNormal3f (cos (angle + 1.5*da), sin (angle + 1.5*da), 0.0);
+           glVertex3f (r2_front * cos (angle + 2 * da), r2_front * sin (angle 
+ 2 * da), width * fraction);
+           glVertex3f (r2_back * cos (angle + 2 * da), r2_back * sin (angle + 
2 * da), -width * fraction);
+           u = r1 * cos (angle + 3 * da) - (r2_front+r2_back)/2.0 * cos (angle 
+ 2 * da);
+           v = r1 * sin (angle + 3 * da) - (r2_front+r2_back)/2.0 * sin (angle 
+ 2 * da);
            len = sqrt (u * u + v * v);
            u /= len;
            v /= len;
            glNormal3f (v, -u, 0.0);
-           glVertex3f ((r2 - width) * cos (angle + da), (r2 - width) * sin 
(angle + da), width * fraction);
-           glVertex3f (r2 * cos (angle + da), r2 * sin (angle + da), -width * 
fraction);
-           glNormal3f (cos (angle), sin (angle), n);
-           glVertex3f ((r2 - width) * cos (angle + 2 * da), (r2 - width) * sin 
(angle + 2 * da), width * fraction);
-           glVertex3f (r2 * cos (angle + 2 * da), r2 * sin (angle + 2 * da), 
-width * fraction);
-           u = r1 * cos (angle + 3 * da) - r2 * cos (angle + 2 * da);
-           v = r1 * sin (angle + 3 * da) - r2 * sin (angle + 2 * da);
-           glNormal3f (v, -u, 0.0);
            glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), 
width * fraction);
            glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), 
-width * fraction);
-           glNormal3f (cos (angle), sin (angle), n);
+           glNormal3f (cos (angle + 3.5*da), sin (angle + 3.5*da), 0.0);
        }
-    }
 
+    glNormal3f (cos (-0.5*da), sin (-0.5*da), 0.0);
     glVertex3f (r1 * cos (0), r1 * sin (0), width * fraction);
     glVertex3f (r1 * cos (0), r1 * sin (0), -width * fraction);
     glEnd ();
@@ -992,6 +946,7 @@ reshape (int width, int height)
 static void
 init (void)
 {
+    glShadeModel(GL_FLAT);
     GLfloat matShine = 20.00F;
     GLfloat light0Pos[4] =
     {
diff --git a/src/demos/geartrain.c b/src/demos/geartrain.c
index 95f527f..266f0a7 100644
--- a/src/demos/geartrain.c
+++ b/src/demos/geartrain.c
@@ -407,40 +407,40 @@ gear (GLint j, char type[], GLfloat radius, GLfloat width,
     glEnd ();
 
 
-    /* draw outward faces of teeth */
+    /* draw outward faces of teeth. The visible faces are the backfaces, for 
testing purposes */
        glBegin (GL_QUAD_STRIP);
        for (i = 0; i < teeth; i++)
        {
            angle = i * 2.0 * M_PI / teeth;
 
-           glNormal3f (cos (angle - 0.5*da), sin (angle - 0.5*da), 0.0);
-           glVertex3f (r1 * cos (angle), r1 * sin (angle), width * fraction);
+           glNormal3f (-cos (angle - 0.5*da), -sin (angle - 0.5*da), 0.0);
            glVertex3f (r1 * cos (angle), r1 * sin (angle), -width * fraction);
+           glVertex3f (r1 * cos (angle), r1 * sin (angle), width * fraction);
            u = (r2_front+r2_back)/2.0 * cos (angle + da) - r1 * cos (angle);
            v = (r2_front+r2_back)/2.0 * sin (angle + da) - r1 * sin (angle);
            len = sqrt (u * u + v * v);
            u /= len;
            v /= len;
-           glNormal3f (v, -u, 0.0);
-           glVertex3f (r2_front * cos (angle + da), r2_front * sin (angle + 
da), width * fraction);
+           glNormal3f (-v, u, 0.0);
            glVertex3f (r2_back * cos (angle + da), r2_back * sin (angle + da), 
-width * fraction);
-           glNormal3f (cos (angle + 1.5*da), sin (angle + 1.5*da), 0.0);
-           glVertex3f (r2_front * cos (angle + 2 * da), r2_front * sin (angle 
+ 2 * da), width * fraction);
+           glVertex3f (r2_front * cos (angle + da), r2_front * sin (angle + 
da), width * fraction);
+           glNormal3f (-cos (angle + 1.5*da), -sin (angle + 1.5*da), 0.0);
            glVertex3f (r2_back * cos (angle + 2 * da), r2_back * sin (angle + 
2 * da), -width * fraction);
+           glVertex3f (r2_front * cos (angle + 2 * da), r2_front * sin (angle 
+ 2 * da), width * fraction);
            u = r1 * cos (angle + 3 * da) - (r2_front+r2_back)/2.0 * cos (angle 
+ 2 * da);
            v = r1 * sin (angle + 3 * da) - (r2_front+r2_back)/2.0 * sin (angle 
+ 2 * da);
            len = sqrt (u * u + v * v);
            u /= len;
            v /= len;
-           glNormal3f (v, -u, 0.0);
-           glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), 
width * fraction);
+           glNormal3f (-v, u, 0.0);
            glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), 
-width * fraction);
-           glNormal3f (cos (angle + 3.5*da), sin (angle + 3.5*da), 0.0);
+           glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), 
width * fraction);
+           glNormal3f (-cos (angle + 3.5*da), -sin (angle + 3.5*da), 0.0);
        }
 
-    glNormal3f (cos (-0.5*da), sin (-0.5*da), 0.0);
-    glVertex3f (r1 * cos (0), r1 * sin (0), width * fraction);
+    glNormal3f (-cos (-0.5*da), -sin (-0.5*da), 0.0);
     glVertex3f (r1 * cos (0), r1 * sin (0), -width * fraction);
+    glVertex3f (r1 * cos (0), r1 * sin (0), width * fraction);
     glEnd ();
 }
 
@@ -947,6 +947,7 @@ static void
 init (void)
 {
     glShadeModel(GL_FLAT);
+    glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1);
     GLfloat matShine = 20.00F;
     GLfloat light0Pos[4] =
     {
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to