| @@ -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; } ; | |||
| @@ -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]; | |||
| } | |||
| @@ -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; | |||
| @@ -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, | |||
| @@ -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]"); | |||