void QuadDice::add_grid(SubPatch& sub, int Mu, int Mv, int offset) { /* create inner grid */ float du = 1.0f/(float)Mu; float dv = 1.0f/(float)Mv; for(int j = 1; j < Mv; j++) { for(int i = 1; i < Mu; i++) { float u = i*du; float v = j*dv; add_vert(sub, u, v); if(i < Mu-1 && j < Mv-1) { int i1 = offset + 4 + (i-1) + (j-1)*(Mu-1); int i2 = offset + 4 + i + (j-1)*(Mu-1); int i3 = offset + 4 + i + j*(Mu-1); int i4 = offset + 4 + (i-1) + j*(Mu-1); add_triangle(i1, i2, i3); add_triangle(i1, i3, i4); } } } }
void QuadDice::add_side_v(SubPatch& sub, vector<int>& outer, vector<int>& inner, int Mu, int Mv, int tv, int side, int offset) { outer.clear(); inner.clear(); /* set verts on the edge of the patch */ outer.push_back(offset + ((side)? 1: 0)); for(int j = 1; j < tv; j++) { float u = (side)? 1.0f: 0.0f; float v = j/(float)tv; outer.push_back(add_vert(sub, u, v)); } outer.push_back(offset + ((side)? 3: 2)); /* set verts on the edge of the inner grid */ for(int j = 0; j < Mv-1; j++) { int i = (side)? Mu-1-1: 0; inner.push_back(offset + 4 + i + j*(Mu-1)); } }
void QuadDice::add_side_u(SubPatch& sub, vector<int>& outer, vector<int>& inner, int Mu, int Mv, int tu, int side, int offset) { outer.clear(); inner.clear(); /* set verts on the edge of the patch */ outer.push_back(offset + ((side)? 2: 0)); for(int i = 1; i < tu; i++) { float u = i/(float)tu; float v = (side)? 1.0f: 0.0f; outer.push_back(add_vert(sub, u, v)); } outer.push_back(offset + ((side)? 3: 1)); /* set verts on the edge of the inner grid */ for(int i = 0; i < Mu-1; i++) { int j = (side)? Mv-1-1: 0; inner.push_back(offset + 4 + i + j*(Mu-1)); } }
polygon::polygon(int sides) { double newx, newy; for(int i=0; i<sides; i++) { newx = cos(2.0 * M_PIl * i / sides); newy = sin(2.0 * M_PIl * i / sides); add_vert(newx, newy); } }
polygon::polygon(SHAPE myshape) { double newx, newy; switch(myshape) { case star: for(int i=0; i<5; i++) { newx = cos(2.0 * M_PIl * i / 5); newy = sin(2.0 * M_PIl * i / 5); add_vert(newx, newy); newx += cos(2.0 * M_PIl * (i+1) / 5); newx /= 4; newy += sin(2.0 * M_PIl * (i+1) / 5); newy /= 4; add_vert(newx, newy); } break; case rhombus: for(int i=0; i<4; i++) { newx = cos(2.0 * M_PIl * i / 7); newy = sin(2.0 * M_PIl * i / 5); if(i%2) newx /= 2; else newy /= 2; add_vert(newx, newy); } break; } }
void QuadDice::add_corners(SubPatch& sub) { /* add verts for patch corners */ if(sub.patch->is_triangle()) { add_vert(sub, 0.0f, 0.0f); add_vert(sub, 1.0f, 0.0f); add_vert(sub, 0.0f, 1.0f); } else { add_vert(sub, 0.0f, 0.0f); add_vert(sub, 1.0f, 0.0f); add_vert(sub, 0.0f, 1.0f); add_vert(sub, 1.0f, 1.0f); } }
void TriangleDice::add_grid(SubPatch& sub, EdgeFactors& ef, int M) { // XXX normals are flipped, why? /* grid is constructed starting from the outside edges, and adding progressively smaller inner triangles that connected to the outer one, until M = 1 or 2, the we fill up the last part. */ vector<int> outer_u, outer_v, outer_w; int m; /* add outer corners vertices */ { float2 p_u = make_float2(1.0f, 0.0f); float2 p_v = make_float2(0.0f, 1.0f); float2 p_w = make_float2(0.0f, 0.0f); int corner_u = add_vert(sub, p_u); int corner_v = add_vert(sub, p_v); int corner_w = add_vert(sub, p_w); outer_u.push_back(corner_v); outer_v.push_back(corner_w); outer_w.push_back(corner_u); for(int i = 1; i < ef.tu; i++) outer_u.push_back(add_vert(sub, interp(p_v, p_w, i/(float)ef.tu))); for(int i = 1; i < ef.tv; i++) outer_v.push_back(add_vert(sub, interp(p_w, p_u, i/(float)ef.tv))); for(int i = 1; i < ef.tw; i++) outer_w.push_back(add_vert(sub, interp(p_u, p_v, i/(float)ef.tw))); outer_u.push_back(corner_w); outer_v.push_back(corner_u); outer_w.push_back(corner_v); } for(m = M-2; m > 0; m -= 2) { vector<int> inner_u, inner_v, inner_w; float t = m/(float)M; float2 center = make_float2(1.0f/3.0f, 1.0f/3.0f); /* 3 corner vertices */ float2 p_u = interp(center, make_float2(1.0f, 0.0f), t); float2 p_v = interp(center, make_float2(0.0f, 1.0f), t); float2 p_w = interp(center, make_float2(0.0f, 0.0f), t); int corner_u = add_vert(sub, p_u); int corner_v = add_vert(sub, p_v); int corner_w = add_vert(sub, p_w); /* construct array of vertex indices for each side */ inner_u.push_back(corner_v); inner_v.push_back(corner_w); inner_w.push_back(corner_u); for(int i = 1; i < m; i++) { /* add vertices between corners */ float t = i/(float)m; inner_u.push_back(add_vert(sub, interp(p_v, p_w, t))); inner_v.push_back(add_vert(sub, interp(p_w, p_u, t))); inner_w.push_back(add_vert(sub, interp(p_u, p_v, t))); } inner_u.push_back(corner_w); inner_v.push_back(corner_u); inner_w.push_back(corner_v); /* stitch together inner/outer with triangles */ stitch_triangles(outer_u, inner_u); stitch_triangles(outer_v, inner_v); stitch_triangles(outer_w, inner_w); outer_u = inner_u; outer_v = inner_v; outer_w = inner_w; } /* fill up last part */ if(m == -1) { /* single triangle */ add_triangle(outer_w[0], outer_u[0], outer_v[0]); } else { /* center vertex + 6 triangles */ int center = add_vert(sub, make_float2(1.0f/3.0f, 1.0f/3.0f)); add_triangle(outer_w[0], outer_w[1], center); add_triangle(outer_w[1], outer_w[2], center); add_triangle(outer_u[0], outer_u[1], center); add_triangle(outer_u[1], outer_u[2], center); add_triangle(outer_v[0], outer_v[1], center); add_triangle(outer_v[1], outer_v[2], center); } }