#include #include #include #include #include "3d.h" #include "model.h" typedef struct ppt PPT; struct ppt { int mx; PT3 loc; } ; static MODEL *m; int main(void); int main(void) { double sqrt5; double r; double h; double s36; double c36; double s72; double c72; double s144; double c144; PPT iloc[12]; PPT dloc[20]; int tv[60]; int i; int mx; MATERIAL *mat; double dscale; PPT add_loc(PT3 at) { int inx; inx = new_location(m); get_location(m,inx)->l = (XYZ){at.x,at.y,at.z}; return((PPT){.mx=inx,.loc=at}); } void rface(int i1, int d1, int i2, int d2) { int p1; int p2; int p3; int p4; POINT *p; int tx; TRIANGLE *t; PT3 n; n = unit3(cross(sub3(iloc[i2].loc,dloc[d1].loc), sub3(dloc[d1].loc,iloc[i1].loc))); p1 = new_point(m); p2 = new_point(m); p3 = new_point(m); p4 = new_point(m); p = get_point(m,p1); p->loc = iloc[i1].mx; p->type = PT_SURFACE; p->normal = (XYZ){.x=n.x,.y=n.y,.z=n.z}; p = get_point(m,p2); p->loc = dloc[d1].mx; p->type = PT_SURFACE; p->normal = (XYZ){.x=n.x,.y=n.y,.z=n.z}; p = get_point(m,p3); p->loc = iloc[i2].mx; p->type = PT_SURFACE; p->normal = (XYZ){.x=n.x,.y=n.y,.z=n.z}; p = get_point(m,p4); p->loc = dloc[d2].mx; p->type = PT_SURFACE; p->normal = (XYZ){.x=n.x,.y=n.y,.z=n.z}; tx = new_triangle(m); tv[i++] = tx; t = get_triangle(m,tx); t->material = mx; t->corner[0] = p1; t->corner[1] = p2; t->corner[2] = p3; tx = new_triangle(m); tv[i++] = tx; t = get_triangle(m,tx); t->material = mx; t->corner[0] = p1; t->corner[1] = p3; t->corner[2] = p4; } void add_obj(int nt, int *txv) { OBJECT *o; o = get_object(m,new_object(m)); o->ntriangles = nt; free(o->triangles); o->triangles = malloc(nt*sizeof(*o->triangles)); bcopy(txv,o->triangles,nt*sizeof(int)); } void compute_dscale(void) { PT3 imid; PT3 dp1; PT3 dp2; PT3 dmid; imid = interp3(iloc[0].loc,.5,iloc[2].loc); dp1 = add3(add3(iloc[0].loc,iloc[2].loc),iloc[1].loc); dp2 = add3(add3(iloc[0].loc,iloc[3].loc),iloc[2].loc); dmid = interp3(dp1,.5,dp2); dscale = norm3(imid) / norm3(dmid); } m = new_model(); sqrt5 = sqrt(5); c36 = (sqrt5 + 1) / 4; s36 = sqrt((5-sqrt5)/8); c72 = (sqrt5 - 1) / 4; s72 = sqrt((5+sqrt5)/8); c144 = - c36; s144 = s36; h = 1 / sqrt5; r = 2 / sqrt5; mx = new_material(m); mat = get_material(m,mx); mat->name = strdup("M"); mat->selflum = (RGB){0,0,0}; mat->reflect = (RGB){.8,.8,.8}; mat->spec_exp = 10; mat->spec_mul = .5; iloc[ 0] = add_loc(MAKEPT3(0,0,1)); iloc[ 1] = add_loc(MAKEPT3(r,0,h)); iloc[ 2] = add_loc(MAKEPT3(r*c72,r*s72,h)); iloc[ 3] = add_loc(MAKEPT3(r*c144,r*s144,h)); iloc[ 4] = add_loc(MAKEPT3(r*c144,-r*s144,h)); iloc[ 5] = add_loc(MAKEPT3(r*c72,-r*s72,h)); iloc[ 6] = add_loc(MAKEPT3(0,0,-1)); iloc[ 7] = add_loc(MAKEPT3(-r,0,-h)); iloc[ 8] = add_loc(MAKEPT3(-r*c72,r*s72,-h)); iloc[ 9] = add_loc(MAKEPT3(-r*c144,r*s144,-h)); iloc[10] = add_loc(MAKEPT3(-r*c144,-r*s144,-h)); iloc[11] = add_loc(MAKEPT3(-r*c72,-r*s72,-h)); compute_dscale(); dloc[ 0] = add_loc(smul3(dscale,add3(add3(iloc[ 0].loc,iloc[ 2].loc),iloc[ 1].loc))); dloc[ 1] = add_loc(smul3(dscale,add3(add3(iloc[ 0].loc,iloc[ 3].loc),iloc[ 2].loc))); dloc[ 2] = add_loc(smul3(dscale,add3(add3(iloc[ 0].loc,iloc[ 4].loc),iloc[ 3].loc))); dloc[ 3] = add_loc(smul3(dscale,add3(add3(iloc[ 0].loc,iloc[ 5].loc),iloc[ 4].loc))); dloc[ 4] = add_loc(smul3(dscale,add3(add3(iloc[ 0].loc,iloc[ 1].loc),iloc[ 5].loc))); dloc[ 5] = add_loc(smul3(dscale,add3(add3(iloc[ 1].loc,iloc[ 2].loc),iloc[ 9].loc))); dloc[ 6] = add_loc(smul3(dscale,add3(add3(iloc[ 2].loc,iloc[ 3].loc),iloc[ 8].loc))); dloc[ 7] = add_loc(smul3(dscale,add3(add3(iloc[ 3].loc,iloc[ 4].loc),iloc[ 7].loc))); dloc[ 8] = add_loc(smul3(dscale,add3(add3(iloc[ 4].loc,iloc[ 5].loc),iloc[11].loc))); dloc[ 9] = add_loc(smul3(dscale,add3(add3(iloc[ 5].loc,iloc[ 1].loc),iloc[10].loc))); dloc[10] = add_loc(smul3(dscale,add3(add3(iloc[ 2].loc,iloc[ 8].loc),iloc[ 9].loc))); dloc[11] = add_loc(smul3(dscale,add3(add3(iloc[ 3].loc,iloc[ 7].loc),iloc[ 8].loc))); dloc[12] = add_loc(smul3(dscale,add3(add3(iloc[ 4].loc,iloc[11].loc),iloc[ 7].loc))); dloc[13] = add_loc(smul3(dscale,add3(add3(iloc[ 5].loc,iloc[10].loc),iloc[11].loc))); dloc[14] = add_loc(smul3(dscale,add3(add3(iloc[ 1].loc,iloc[ 9].loc),iloc[10].loc))); dloc[15] = add_loc(smul3(dscale,add3(add3(iloc[ 6].loc,iloc[ 7].loc),iloc[11].loc))); dloc[16] = add_loc(smul3(dscale,add3(add3(iloc[ 6].loc,iloc[11].loc),iloc[10].loc))); dloc[17] = add_loc(smul3(dscale,add3(add3(iloc[ 6].loc,iloc[10].loc),iloc[ 9].loc))); dloc[18] = add_loc(smul3(dscale,add3(add3(iloc[ 6].loc,iloc[ 9].loc),iloc[ 8].loc))); dloc[19] = add_loc(smul3(dscale,add3(add3(iloc[ 6].loc,iloc[ 8].loc),iloc[ 7].loc))); i = 0; rface(0,0,1,4); rface(0,1,2,0); rface(0,2,3,1); rface(0,3,4,2); rface(0,4,5,3); rface(1,0,2,5); rface(2,1,3,6); rface(3,2,4,7); rface(4,3,5,8); rface(5,4,1,9); rface(1,14,10,9); rface(2,10,9,5); rface(3,11,8,6); rface(4,12,7,7); rface(5,13,11,8); rface(1,5,9,14); rface(2,6,8,10); rface(3,7,7,11); rface(4,8,11,12); rface(5,9,10,13); rface(7,19,8,11); rface(8,18,9,10); rface(9,17,10,14); rface(10,16,11,13); rface(11,15,7,12); rface(6,19,7,15); rface(6,15,11,16); rface(6,16,10,17); rface(6,17,9,18); rface(6,18,8,19); add_obj(i,&tv[0]); /* iface( 0, 2, 1); iface( 0, 3, 2); iface( 0, 4, 3); iface( 0, 5, 4); iface( 0, 1, 5); iface( 1, 2, 9); iface( 2, 3, 8); iface( 3, 4, 7); iface( 4, 5,11); iface( 5, 1,10); iface( 2, 8, 9); iface( 3, 7, 8); iface( 4,11, 7); iface( 5,10,11); iface( 1, 9,10); iface( 6, 7,11); iface( 6,11,10); iface( 6,10, 9); iface( 6, 9, 8); iface( 6, 8, 7); i = 0; dface( 0, 4, 3, 2, 1); dface( 0, 1, 6,10, 5); dface( 1, 2, 7,11, 6); dface( 2, 3, 8,12, 7); dface( 3, 4, 9,13, 8); dface( 4, 0, 5,14, 9); dface(15,16,17,18,19); dface(15,12, 8,13,16); dface(16,13, 9,14,17); dface(17,14, 5,10,18); dface(18,10, 6,11,19); dface(19,11, 7,12,15); add_obj(60,&t[0]); */ save_model(m,stdout); return(0); }