浏览代码

easymesh: allow central holes in gears as well as internal gears.

legacy
Sam Hocevar sam 12 年前
父节点
当前提交
662148406f
共有 5 个文件被更改,包括 69 次插入51 次删除
  1. +3
    -2
      src/easymesh/easymesh-parser.y
  2. +45
    -30
      src/easymesh/easymesh.cpp
  3. +2
    -2
      src/easymesh/easymesh.h
  4. +17
    -16
      src/generated/easymesh-parser.cpp
  5. +2
    -1
      tutorial/05_easymesh.cpp

+ 3
- 2
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; } ;


+ 45
- 30
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];
}



+ 2
- 2
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;


+ 17
- 16
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,


+ 2
- 1
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]");


正在加载...
取消
保存