#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; PT3 iloc[12]; PPT loc[20]; int tv[20]; int tvx; int matx[5]; int gen_material(const char *name, double r, double g, double b) { int x; MATERIAL *mat; x = new_material(m); mat = get_material(m,x); mat->name = strdup(name); mat->selflum = (RGB){0,0,0}; mat->reflect = (RGB){r,g,b}; mat->spec_exp = 10; mat->spec_mul = .5; return(x); } PPT add_loc(int x1, int x2, int x3) { int inx; PT3 p; p = unit3(add3(add3(iloc[x1],iloc[x2]),iloc[x3])); inx = new_location(m); get_location(m,inx)->l = (XYZ){p.x,p.y,p.z}; return((PPT){.mx=inx,.loc=p}); } void triface(int matx, int x1, int x2, int x3) { int p1; int p2; int p3; POINT *p; int tx; TRIANGLE *t; PT3 n; n = unit3(cross(sub3(loc[x3].loc,loc[x2].loc), sub3(loc[x2].loc,loc[x1].loc))); p1 = new_point(m); p2 = new_point(m); p3 = new_point(m); p = get_point(m,p1); p->loc = loc[x1].mx; p->type = PT_SURFACE; p->normal = (XYZ){.x=n.x,.y=n.y,.z=n.z}; p = get_point(m,p2); p->loc = loc[x2].mx; p->type = PT_SURFACE; p->normal = (XYZ){.x=n.x,.y=n.y,.z=n.z}; p = get_point(m,p3); p->loc = loc[x3].mx; p->type = PT_SURFACE; p->normal = (XYZ){.x=n.x,.y=n.y,.z=n.z}; tx = new_triangle(m); tv[tvx++] = tx; t = get_triangle(m,tx); t->material = matx; t->corner[0] = p1; t->corner[1] = p2; t->corner[2] = p3; } void do_tetra(int matx, int x1, int x2, int x3, int x4) { triface(matx,x1,x2,x4); triface(matx,x1,x4,x3); triface(matx,x3,x4,x2); triface(matx,x1,x3,x2); } 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)); } 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; matx[0] = gen_material("W",.7,.7,.7); matx[1] = gen_material("R",1,.5,.5); matx[2] = gen_material("G",.5,1,.5); matx[3] = gen_material("B",.5,.5,1); matx[4] = gen_material("Y",.8,.8,.5); iloc[ 0] = MAKEPT3(0,0,1); iloc[ 1] = MAKEPT3(r,0,h); iloc[ 2] = MAKEPT3(r*c72,r*s72,h); iloc[ 3] = MAKEPT3(r*c144,r*s144,h); iloc[ 4] = MAKEPT3(r*c144,-r*s144,h); iloc[ 5] = MAKEPT3(r*c72,-r*s72,h); iloc[ 6] = MAKEPT3(0,0,-1); iloc[ 7] = MAKEPT3(-r,0,-h); iloc[ 8] = MAKEPT3(-r*c72,r*s72,-h); iloc[ 9] = MAKEPT3(-r*c144,r*s144,-h); iloc[10] = MAKEPT3(-r*c144,-r*s144,-h); iloc[11] = MAKEPT3(-r*c72,-r*s72,-h); loc[ 0] = add_loc( 0, 2, 1); loc[ 1] = add_loc( 0, 3, 2); loc[ 2] = add_loc( 0, 4, 3); loc[ 3] = add_loc( 0, 5, 4); loc[ 4] = add_loc( 0, 1, 5); loc[ 5] = add_loc( 1, 2, 9); loc[ 6] = add_loc( 2, 3, 8); loc[ 7] = add_loc( 3, 4, 7); loc[ 8] = add_loc( 4, 5,11); loc[ 9] = add_loc( 5, 1,10); loc[10] = add_loc( 2, 8, 9); loc[11] = add_loc( 3, 7, 8); loc[12] = add_loc( 4,11, 7); loc[13] = add_loc( 5,10,11); loc[14] = add_loc( 1, 9,10); loc[15] = add_loc( 6, 7,11); loc[16] = add_loc( 6,11,10); loc[17] = add_loc( 6,10, 9); loc[18] = add_loc( 6, 9, 8); loc[19] = add_loc( 6, 8, 7); tvx = 0; do_tetra(0, 0,17,11, 8); do_tetra(1, 1,18,12, 9); do_tetra(2, 2,19,13, 5); do_tetra(3, 3,15,14, 6); do_tetra(4, 4,16,10, 7); add_obj(4,&tv[0]); save_model(m,stdout); return(0); }