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