#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) { PPT oloc[6]; PPT cloc[8]; int tv[12*2]; int nt; int mx; MATERIAL *mat; double cscale; 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 dface(int o1, int c1, int o2, int c2) { int po1; int pc1; int po2; int pc2; POINT *p; int tx; TRIANGLE *t; PT3 n; n = unit3(add3(add3(oloc[o1].loc,oloc[o2].loc), add3(cloc[c1].loc,cloc[c2].loc))); po1 = new_point(m); pc1 = new_point(m); po2 = new_point(m); pc2 = new_point(m); p = get_point(m,po1); p->loc = oloc[o1].mx; p->type = PT_SURFACE; p->normal = (XYZ){.x=n.x,.y=n.y,.z=n.z}; p = get_point(m,po2); p->loc = oloc[o2].mx; p->type = PT_SURFACE; p->normal = (XYZ){.x=n.x,.y=n.y,.z=n.z}; p = get_point(m,pc1); p->loc = cloc[c1].mx; p->type = PT_SURFACE; p->normal = (XYZ){.x=n.x,.y=n.y,.z=n.z}; p = get_point(m,pc2); p->loc = cloc[c2].mx; p->type = PT_SURFACE; p->normal = (XYZ){.x=n.x,.y=n.y,.z=n.z}; tx = new_triangle(m); tv[nt++] = tx; t = get_triangle(m,tx); t->material = mx; t->corner[0] = po1; t->corner[1] = pc1; t->corner[2] = po2; tx = new_triangle(m); tv[nt++] = tx; t = get_triangle(m,tx); t->material = mx; t->corner[0] = po1; t->corner[1] = po2; t->corner[2] = pc2; } 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_cscale(void) { PT3 omid; PT3 cp1; PT3 cp2; PT3 cmid; omid = interp3(oloc[0].loc,.5,oloc[2].loc); cp1 = add3(add3(oloc[0].loc,oloc[2].loc),oloc[4].loc); cp2 = add3(add3(oloc[0].loc,oloc[2].loc),oloc[5].loc); cmid = interp3(cp1,.5,cp2); cscale = norm3(omid) / norm3(cmid); } m = new_model(); mx = new_material(m); mat = get_material(m,mx); mat->name = strdup("M"); mat->selflum = (RGB){0,0,0}; mat->reflect = (RGB){.6,1,.6}; mat->spec_exp = 10; mat->spec_mul = .5; oloc[0] = add_loc(MAKEPT3( 1, 0, 0)); oloc[1] = add_loc(MAKEPT3(-1, 0, 0)); oloc[2] = add_loc(MAKEPT3( 0, 1, 0)); oloc[3] = add_loc(MAKEPT3( 0,-1, 0)); oloc[4] = add_loc(MAKEPT3( 0, 0, 1)); oloc[5] = add_loc(MAKEPT3( 0, 0,-1)); compute_cscale(); cloc[0] = add_loc(smul3(cscale,add3(add3(oloc[0].loc,oloc[2].loc),oloc[4].loc))); cloc[1] = add_loc(smul3(cscale,add3(add3(oloc[0].loc,oloc[2].loc),oloc[5].loc))); cloc[2] = add_loc(smul3(cscale,add3(add3(oloc[0].loc,oloc[3].loc),oloc[4].loc))); cloc[3] = add_loc(smul3(cscale,add3(add3(oloc[0].loc,oloc[3].loc),oloc[5].loc))); cloc[4] = add_loc(smul3(cscale,add3(add3(oloc[1].loc,oloc[2].loc),oloc[4].loc))); cloc[5] = add_loc(smul3(cscale,add3(add3(oloc[1].loc,oloc[2].loc),oloc[5].loc))); cloc[6] = add_loc(smul3(cscale,add3(add3(oloc[1].loc,oloc[3].loc),oloc[4].loc))); cloc[7] = add_loc(smul3(cscale,add3(add3(oloc[1].loc,oloc[3].loc),oloc[5].loc))); nt = 0; dface(0,0,2,1); dface(0,3,3,2); dface(0,2,4,0); dface(0,1,5,3); dface(2,0,4,4); dface(2,5,5,1); dface(3,6,4,2); dface(3,3,5,7); dface(1,5,2,4); dface(1,6,3,7); dface(1,4,4,6); dface(1,7,5,5); add_obj(nt,&tv[0]); save_model(m,stdout); return(0); }