iMesh *cylin_uv_decomp(Prim *p, Real level) { int i, j, nu = 20 * level, nv = 20 * level; Real u, v, iu = ULEN/(Real)nu, iv = VLEN/(Real)nv; Vector3 *pts = NEWARRAY((nu+3)*(nv+1), Vector3); Vector3 *pvals = NEWARRAY((nu+3)*(nv+1), Vector3); iTri *tl = NULL; iMesh *m = NULL; for (u = UMIN - iu, i = 0; i <= nu+2; u += iu, i++) { for (v = VMIN, j = 0; j <= nv; v += iv, j++) { pts[IDX2(i,j,nu+3)] = v3_make(u,v,0); pvals[IDX2(i,j,nu+3)] = prim_point(p,u,v); } } m = imesh_alloc((nu+3) * (nv+1), NULL, NULL); m->m = pts; m->p = pvals; for (i = 0; i < nu+2; i++) { for (j = 0; j < nv; j++) { tl = itri_insert(tl, itri_make(IDX2(i,j,nu+3),IDX2(i,j+1,nu+3),IDX2(i+1,j,nu+3), m)); tl = itri_insert(tl, itri_make(IDX2(i+1,j+1,nu+3),IDX2(i+1,j,nu+3),IDX2(i,j+1,nu+3), m)); } } m->t = tl; return m; }
Poly *prim_polys(Prim *s, Poly *p) { int i; Poly *l = plist_alloc(3, p->n); for (i = 0; i < p->n; i++) { PL(l)->v[i] = SL(l)->v[i] = prim_point(s, p->v[i].x, p->v[i].y); NL(l)->v[i] = prim_normal(s, p->v[i].x, p->v[i].y); } return l; }
Poly *prim_polys(Prim *s, Poly *p) { int i; Poly *l = plist_alloc(7, p->n); for (i = 0; i < p->n; i++) { PL(l)->v[i] = SL(l)->v[i] = prim_point(s, p->v[i].x, p->v[i].y); NL(l)->v[i] = prim_normal(s, p->v[i].x, p->v[i].y); TL(l)->v[i] = prim_texc(s, p->v[i].x, p->v[i].y); DUL(l)->v[i] = v3_unit(prim_du(s, p->v[i].x, p->v[i].y)); DVL(l)->v[i] = v3_unit(prim_dv(s, p->v[i].x, p->v[i].y)); } return l; }