From 662148406f480651ad1b58901b1b4e8670edeb0a Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Wed, 19 Dec 2012 19:07:44 +0000 Subject: [PATCH] easymesh: allow central holes in gears as well as internal gears. --- src/easymesh/easymesh-parser.y | 5 ++- src/easymesh/easymesh.cpp | 75 ++++++++++++++++++------------- src/easymesh/easymesh.h | 4 +- src/generated/easymesh-parser.cpp | 33 +++++++------- tutorial/05_easymesh.cpp | 3 +- 5 files changed, 69 insertions(+), 51 deletions(-) diff --git a/src/easymesh/easymesh-parser.y b/src/easymesh/easymesh-parser.y index 31362e65..f604ae89 100644 --- a/src/easymesh/easymesh-parser.y +++ b/src/easymesh/easymesh-parser.y @@ -157,8 +157,9 @@ primitive_command: | T_DISC args3 { mc.m_mesh.AppendDisc((int)$2.f0, $2.f1, (int)$2.f2); } | T_TRIANGLE args2 { mc.m_mesh.AppendSimpleTriangle($2.f0, (int)$2.f1); } | T_QUAD args2 { mc.m_mesh.AppendSimpleQuad($2.f0, (int)$2.f1); } - | T_COG args8 { mc.m_mesh.AppendCog((int)$2.f0, $2.f1, $2.f2, $2.f3, - $2.f4, $2.f5, $2.f6, (int)$2.f7); } + | T_COG args8 { mc.m_mesh.AppendCog((int)$2.f0, $2.f1, + $2.f2 / 2, $2.f3 / 2, $2.f2, $2.f3, $2.f4, + $2.f5, $2.f6, (int)$2.f7); } ; args1: number { $$.f0 = $1; } ; diff --git a/src/easymesh/easymesh.cpp b/src/easymesh/easymesh.cpp index c81f05dd..9b437d7b 100644 --- a/src/easymesh/easymesh.cpp +++ b/src/easymesh/easymesh.cpp @@ -782,34 +782,43 @@ void EasyMesh::AppendSimpleQuad(vec2 p1, vec2 p2, float z, int fade) ComputeNormals(m_indices.Count() - 6, 6); } -void EasyMesh::AppendCog(int nbsides, float h, float r1, float r2, float r12, - float r22, float sidemul, int offset) +void EasyMesh::AppendCog(int nbsides, float h, float r10, float r20, + float r1, float r2, float r12, float r22, + float sidemul, int offset) { int ibase = m_indices.Count(); int vbase = m_vert.Count(); - AddVertex(vec3(0.f, h * .5f, 0.f)); - AddVertex(vec3(0.f, h * -.5f, 0.f)); - SetCurVertColor(m_color2); + /* FIXME: enforce this some other way */ + if (r12 < 0) + { + r10 *= 2.5; + r20 *= 2.5; + h = -h; + } mat3 rotmat = mat3::rotate(180.0f / nbsides, 0.f, 1.f, 0.f); mat3 smat1 = mat3::rotate(sidemul * 180.0f / nbsides, 0.f, 1.f, 0.f); mat3 smat2 = mat3::rotate(sidemul * -360.0f / nbsides, 0.f, 1.f, 0.f); - vec3 p[8]; + vec3 p[12]; - p[0] = vec3(r1, h * .5f, 0.f); + p[0] = vec3(r10, h * .5f, 0.f); p[1] = rotmat * p[0]; - p[2] = smat1 * (rotmat * vec3(r1 + r12, h * .5f, 0.f)); - p[3] = smat2 * (rotmat * p[2]); - - p[4] = vec3(r2, h * -.5f, 0.f); - p[5] = rotmat * p[4]; - p[6] = smat1 * (rotmat * vec3(r2 + r22, h * -.5f, 0.f)); - p[7] = smat2 * (rotmat * p[6]); + p[2] = vec3(r1, h * .5f, 0.f); + p[3] = rotmat * p[2]; + p[4] = smat1 * (rotmat * vec3(r1 + r12, h * .5f, 0.f)); + p[5] = smat2 * (rotmat * p[4]); + + p[6] = vec3(r20, h * -.5f, 0.f); + p[7] = rotmat * p[6]; + p[8] = vec3(r2, h * -.5f, 0.f); + p[9] = rotmat * p[8]; + p[10] = smat1 * (rotmat * vec3(r2 + r22, h * -.5f, 0.f)); + p[11] = smat2 * (rotmat * p[10]); if (offset & 1) - for (int n = 0; n < 8; n++) + for (int n = 0; n < 12; n++) p[n] = rotmat * p[n]; rotmat = rotmat * rotmat; @@ -818,28 +827,34 @@ void EasyMesh::AppendCog(int nbsides, float h, float r1, float r2, float r12, { /* Each vertex will share three faces, so three different * normals, therefore we add each vertex three times. */ - for (int n = 0; n < 24; n++) + for (int n = 0; n < 3 * 12; n++) { AddVertex(p[n / 3]); - if (n / 3 >= 4) + if (n / 3 >= 6) SetCurVertColor(m_color2); } - int j = 24 * i, k = 24 * ((i + 1) % nbsides); + int j = 3 * 12 * i, k = 3 * 12 * ((i + 1) % nbsides); /* The top and bottom faces */ - AppendQuad(0, j + 2, j + 5, k + 2, vbase); - AppendQuad(1, k + 14, j + 17, j + 14, vbase); - AppendQuad(j + 5, j + 8, j + 11, k + 2, vbase); - AppendQuad(k + 14, j + 23, j + 20, j + 17, vbase); - - /* The side quads */ - AppendQuad(j + 6, j + 3, j + 15, j + 18, vbase); - AppendQuad(j + 9, j + 7, j + 19, j + 21, vbase); - AppendQuad(j + 12, j + 10, j + 22, j + 24, vbase); - AppendQuad(k + 4, j + 13, j + 25, k + 16, vbase); - - for (int n = 0; n < 8; n++) + AppendQuad(j, j + 6, j + 9, j + 3, vbase); + AppendQuad(j + 21, j + 27, j + 24, j + 18, vbase); + AppendQuad(j + 3, j + 9, k + 6, k, vbase); + AppendQuad(k + 18, k + 24, j + 27, j + 21, vbase); + AppendQuad(j + 9, j + 12, j + 15, k + 6, vbase); + AppendQuad(k + 24, j + 33, j + 30, j + 27, vbase); + + /* The inner side quads */ + AppendQuad(j + 1, j + 4, j + 22, j + 19, vbase); + AppendQuad(j + 5, k + 2, k + 20, j + 23, vbase); + + /* The outer side quads */ + AppendQuad(j + 10, j + 7, j + 25, j + 28, vbase); + AppendQuad(j + 13, j + 11, j + 29, j + 31, vbase); + AppendQuad(j + 16, j + 14, j + 32, j + 34, vbase); + AppendQuad(k + 8, j + 17, j + 35, k + 26, vbase); + + for (int n = 0; n < 12; n++) p[n] = rotmat * p[n]; } diff --git a/src/easymesh/easymesh.h b/src/easymesh/easymesh.h index 639a29aa..3fc40c05 100644 --- a/src/easymesh/easymesh.h +++ b/src/easymesh/easymesh.h @@ -86,8 +86,8 @@ public: void AppendSimpleTriangle(float size, int fade = 0); void AppendSimpleQuad(float size, int fade = 0); void AppendSimpleQuad(vec2 p1, vec2 p2, float z = 0.f, int fade = 0); - void AppendCog(int nbsides, float h, float r1, float r2, - float r12, float r22, float sidemul, int offset); + void AppendCog(int nbsides, float h, float r10, float r20, float r1, + float r2, float r12, float r22, float sidemul, int offset); private: vec4 m_color, m_color2; diff --git a/src/generated/easymesh-parser.cpp b/src/generated/easymesh-parser.cpp index 0480b4b4..b8375ad9 100644 --- a/src/generated/easymesh-parser.cpp +++ b/src/generated/easymesh-parser.cpp @@ -707,84 +707,85 @@ namespace lol { /* Line 677 of lalr1.cc */ #line 160 "easymesh/easymesh-parser.y" - { mc.m_mesh.AppendCog((int)(yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, (yysemantic_stack_[(2) - (2)].args).f2, (yysemantic_stack_[(2) - (2)].args).f3, - (yysemantic_stack_[(2) - (2)].args).f4, (yysemantic_stack_[(2) - (2)].args).f5, (yysemantic_stack_[(2) - (2)].args).f6, (int)(yysemantic_stack_[(2) - (2)].args).f7); } + { mc.m_mesh.AppendCog((int)(yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, + (yysemantic_stack_[(2) - (2)].args).f2 / 2, (yysemantic_stack_[(2) - (2)].args).f3 / 2, (yysemantic_stack_[(2) - (2)].args).f2, (yysemantic_stack_[(2) - (2)].args).f3, (yysemantic_stack_[(2) - (2)].args).f4, + (yysemantic_stack_[(2) - (2)].args).f5, (yysemantic_stack_[(2) - (2)].args).f6, (int)(yysemantic_stack_[(2) - (2)].args).f7); } break; case 50: /* Line 677 of lalr1.cc */ -#line 164 "easymesh/easymesh-parser.y" +#line 165 "easymesh/easymesh-parser.y" { (yyval.args).f0 = (yysemantic_stack_[(1) - (1)].fval); } break; case 51: /* Line 677 of lalr1.cc */ -#line 165 "easymesh/easymesh-parser.y" +#line 166 "easymesh/easymesh-parser.y" { (yyval.args) = (yysemantic_stack_[(2) - (1)].args); (yyval.args).f1 = (yysemantic_stack_[(2) - (2)].fval); } break; case 52: /* Line 677 of lalr1.cc */ -#line 166 "easymesh/easymesh-parser.y" +#line 167 "easymesh/easymesh-parser.y" { (yyval.args) = (yysemantic_stack_[(2) - (1)].args); (yyval.args).f2 = (yysemantic_stack_[(2) - (2)].fval); } break; case 53: /* Line 677 of lalr1.cc */ -#line 167 "easymesh/easymesh-parser.y" +#line 168 "easymesh/easymesh-parser.y" { (yyval.args) = (yysemantic_stack_[(2) - (1)].args); (yyval.args).f3 = (yysemantic_stack_[(2) - (2)].fval); } break; case 54: /* Line 677 of lalr1.cc */ -#line 168 "easymesh/easymesh-parser.y" +#line 169 "easymesh/easymesh-parser.y" { (yyval.args) = (yysemantic_stack_[(2) - (1)].args); (yyval.args).f4 = (yysemantic_stack_[(2) - (2)].fval); } break; case 55: /* Line 677 of lalr1.cc */ -#line 169 "easymesh/easymesh-parser.y" +#line 170 "easymesh/easymesh-parser.y" { (yyval.args) = (yysemantic_stack_[(2) - (1)].args); (yyval.args).f5 = (yysemantic_stack_[(2) - (2)].fval); } break; case 56: /* Line 677 of lalr1.cc */ -#line 170 "easymesh/easymesh-parser.y" +#line 171 "easymesh/easymesh-parser.y" { (yyval.args) = (yysemantic_stack_[(2) - (1)].args); (yyval.args).f6 = (yysemantic_stack_[(2) - (2)].fval); } break; case 57: /* Line 677 of lalr1.cc */ -#line 171 "easymesh/easymesh-parser.y" +#line 172 "easymesh/easymesh-parser.y" { (yyval.args) = (yysemantic_stack_[(2) - (1)].args); (yyval.args).f7 = (yysemantic_stack_[(2) - (2)].fval); } break; case 58: /* Line 677 of lalr1.cc */ -#line 174 "easymesh/easymesh-parser.y" +#line 175 "easymesh/easymesh-parser.y" { (yyval.fval) = (yysemantic_stack_[(1) - (1)].fval); } break; case 59: /* Line 677 of lalr1.cc */ -#line 175 "easymesh/easymesh-parser.y" +#line 176 "easymesh/easymesh-parser.y" { (yyval.fval) = -(yysemantic_stack_[(2) - (2)].fval); } break; /* Line 677 of lalr1.cc */ -#line 788 "generated/easymesh-parser.cpp" +#line 789 "generated/easymesh-parser.cpp" default: break; } @@ -1205,7 +1206,7 @@ namespace lol { 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 141, 144, 145, 147, 149, 151, 152, 153, 155, 157, 158, 159, 160, - 164, 165, 166, 167, 168, 169, 170, 171, 174, 175 + 165, 166, 167, 168, 169, 170, 171, 172, 175, 176 }; // Print the state stack on the debug stream. @@ -1298,11 +1299,11 @@ namespace lol { } // lol /* Line 1053 of lalr1.cc */ -#line 1302 "generated/easymesh-parser.cpp" +#line 1303 "generated/easymesh-parser.cpp" /* Line 1055 of lalr1.cc */ -#line 178 "easymesh/easymesh-parser.y" +#line 179 "easymesh/easymesh-parser.y" void lol::EasyMeshParser::error(const EasyMeshParser::location_type& l, diff --git a/tutorial/05_easymesh.cpp b/tutorial/05_easymesh.cpp index 83ccba88..df0828a7 100644 --- a/tutorial/05_easymesh.cpp +++ b/tutorial/05_easymesh.cpp @@ -44,7 +44,8 @@ public: { m_angle = 0; - m_mesh.Compile("sc#ffb scb#ffb acg 12 10 30 30 5 5 0.1 0"); + //m_mesh.Compile("sc#ffb scb#ffb acg 12 10 30 30 5 5 0.1 0"); + m_mesh.Compile("sc#ffb scb#ffb acg 12 10 30 30 -5 -5 0.1 0"); #if 0 m_mesh.Compile("sc#8d3 [ato40 10 40 rx20 ry130 tx30]");