/* Adds a unit cube, axis-aligned and centered on zero to the Module. * If solid is zero, add only lines. If solid is non-zero, use * polygons. Only lines need to be supported now. */ void Module_cube(Module *md, int solid, Texture *tex[6]) { Point v[8]; Point tv[4]; Vector normal[4]; TextureCoord st[4]; printf("adding cube...\n"); // corners of a cube, centered at (0, 0, 0) Point_set( &v[0], -0.5, -0.5, -0.5 ); Point_set( &v[1], 0.5, -0.5, -0.5 ); Point_set( &v[2], 0.5, 0.5, -0.5 ); Point_set( &v[3], -0.5, 0.5, -0.5 ); Point_set( &v[4], -0.5, -0.5, 0.5 ); Point_set( &v[5], 0.5, -0.5, 0.5 ); Point_set( &v[6], 0.5, 0.5, 0.5 ); Point_set( &v[7], -0.5, 0.5, 0.5 ); // add only line if (solid == 0) { Line temp; Line_set(&temp,v[0],v[1]); Module_line(md,&temp); Line_set(&temp,v[0],v[3]); Module_line(md,&temp); Line_set(&temp,v[0],v[4]); Module_line(md,&temp); Line_set(&temp,v[1],v[2]); Module_line(md,&temp); Line_set(&temp,v[1],v[5]); Module_line(md,&temp); Line_set(&temp,v[2],v[3]); Module_line(md,&temp); Line_set(&temp,v[2],v[6]); Module_line(md,&temp); Line_set(&temp,v[3],v[7]); Module_line(md,&temp); Line_set(&temp,v[4],v[5]); Module_line(md,&temp); Line_set(&temp,v[4],v[7]); Module_line(md,&temp); Line_set(&temp,v[5],v[6]); Module_line(md,&temp); Line_set(&temp,v[6],v[7]); Module_line(md,&temp); } // use polygons else { Polygon temp; Polygon_setNULL(&temp); // THIS IS HARD-CODED !!!!! if (tex != NULL) { st[0].s = 372; st[0].t = 0; st[1].s = 0; st[1].t = 0; st[2].s = 0; st[2].t = 372; st[3].s = 372; st[3].t = 372; } // front side Polygon_set( &temp, 4, &(v[0]) ); Vector front = {{0.0,0.0,-1.0}}; normal[0] = normal[1] = normal[2] = normal[3] = front; Polygon_setNormals( &temp, 4, normal); if (tex != NULL) Module_texture(md,tex[0]); Polygon_setTexture(&temp, 4, st); Module_polygon(md,&temp); // back side Polygon_set( &temp, 4, &(v[4]) ); Vector back = {{0.0,0.0,1.0}}; normal[0] = normal[1] = normal[2] = normal[3] = back; Polygon_setNormals( &temp, 4, normal); if (tex != NULL) Module_texture(md,tex[1]); Polygon_setTexture(&temp, 4, st); Module_polygon(md,&temp); // top side Point_copy( &tv[0], &v[2] ); Point_copy( &tv[1], &v[3] ); Point_copy( &tv[2], &v[7] ); Point_copy( &tv[3], &v[6] ); Polygon_set( &temp, 4, tv ); Vector top = {{0.0,1.0,0.0}}; normal[0] = normal[1] = normal[2] = normal[3] = top; Polygon_setNormals( &temp, 4, normal); if (tex != NULL) Module_texture(md,tex[2]); Polygon_setTexture(&temp, 4, st); Module_polygon(md,&temp); // bottom side Point_copy( &tv[0], &v[0] ); Point_copy( &tv[1], &v[1] ); Point_copy( &tv[2], &v[5] ); Point_copy( &tv[3], &v[4] ); Polygon_set( &temp, 4, tv ); Vector bottom = {{0.0,-1.0,0.0}}; normal[0] = normal[1] = normal[2] = normal[3] = bottom; Polygon_setNormals( &temp, 4, normal); if (tex != NULL) Module_texture(md,tex[3]); Polygon_setTexture(&temp, 4, st); Module_polygon(md,&temp); // left side Point_copy( &tv[0], &v[0] ); Point_copy( &tv[1], &v[3] ); Point_copy( &tv[2], &v[7] ); Point_copy( &tv[3], &v[4] ); Polygon_set( &temp, 4, tv ); Vector left = {{-1.0,0.0,0.0}}; normal[0] = normal[1] = normal[2] = normal[3] = left; Polygon_setNormals( &temp, 4, normal); if (tex != NULL) Module_texture(md,tex[4]); Polygon_setTexture(&temp, 4, st); Module_polygon(md,&temp); // right side Point_copy( &tv[0], &v[1] ); Point_copy( &tv[1], &v[2] ); Point_copy( &tv[2], &v[6] ); Point_copy( &tv[3], &v[5] ); Polygon_set( &temp, 4, tv ); Vector right = {{1.0,0.0,0.0}}; normal[0] = normal[1] = normal[2] = normal[3] = right; Polygon_setNormals( &temp, 4, normal); if (tex != NULL) Module_texture(md,tex[5]); Polygon_setTexture(&temp, 4, st); Module_polygon(md,&temp); } return; }
Point_t * Camera_getEye(const Camera_t *const pThis, Point_t *opEye) { Point_copy(opEye, &(pThis->axes.origin)); return opEye; }
void GenSphere() { int i,j,k; double R = 5; double p = 3; double q = 3; double a = 0.1; double b = 1.5; double c = 1; double d = -4; Point p0 = {0.0, 7.0, 0.0, 1.0}; Point p1, p2, p3, p4; double PI = 4*atan(1); double x, y, z; double phi, phi2, dphi; dphi = 2*PI/aproximate; for(phi=0; phi<2*PI; phi+=dphi) { phi2 = phi+dphi; p1[0] = cos(phi ); p2[0] = cos(phi2); double ss; double dss = PI / aproximate; for (ss = -PI/2+0.001; ss < PI/2; ss+=dss) { float ddss=dss; if(ss+dss>PI/2){ //ss=PI/2-0.001; ddss=PI/2-ss-0.001; } p1[2] = sin(phi)*cos(ss); p1[0] = cos(phi)*cos(ss); p1[1] = sin(ss); p2[2] = sin(phi+dphi)*cos(ss); p2[0] = cos(phi+dphi)*cos(ss); p2[1] = sin(ss); p3[2] = sin(phi)*cos(ss+ddss); p3[0] = cos(phi)*cos(ss+ddss); p3[1] = sin(ss+ddss); p4[2] = sin(phi+dphi)*cos(ss+ddss); p4[0] = cos(phi+dphi)*cos(ss+ddss); p4[1] = sin(ss+ddss); Point_copy(Quads[quads++],p1); Point_copy(Quads[quads++],p2); Point_copy(Quads[quads++],p4); Point_copy(Quads[quads++],p3); } } for (i=0;i<quads;i++) { Quads[i][0]*=p/q; } }
void GenKonus( double p) { int i,j; // double p = 3; double q = 2; double a = 0.1; double b = 1.5; double c = 1; double d = -4; Point p0 = {0.0, 7.0, 0.0, 1.0}; Point p1, p2, p3, p4; double PI = 4*atan(1); double phi, phi2, dphi; dphi = 2*PI/aproximate; for(phi=0; phi<2*PI; phi+=dphi) { phi2 = phi+dphi; p1[0] = sin(phi ); p2[0] = sin(phi2); p1[1] = 0; p2[1] = 0; p1[2] = cos(phi ); p2[2] = cos(phi2); p1[3] = 1.0; p2[3] = 1.0; float r1 = -d/(a*sin(phi) + b*cos(phi) + b*p0[1]/1.0); float r2 = -d/(a*sin(phi2) + b*cos(phi2) + b*p0[1]/1.0); float y1 = p0[1]*(1-r1)/1.0; float y2 = p0[1]*(1-r2)/1.0; if (y2 >= p0[1]) { p3[0] = 0; p3[1] = p0[1]; p4[2] = 0; } else { p3[0] = r2*sin(phi2); p3[1] = y2; p3[2] = r2*cos(phi2); } if (y1 >= p0[1]) { p4[0] = 0; p4[1] = p0[1]; p4[2] = 0; } else { p4[0] = r1*sin(phi); p4[1] = y1; p4[2] = r1*cos(phi); } p3[3] = 1.0; p4[3] = 1.0; Point_copy(Quads[quads++],p1); Point_copy(Quads[quads++],p2); Point_copy(Quads[quads++],p3); Point_copy(Quads[quads++],p4); } for (i=0;i<quads;i++) { Quads[i][0]*=p/q; } }
void GenTorus(double p) { int i,j,k; double R = 5; double r = 1; // double p = 3; double q = 3; Point p1, p2, p3, p4; double PI = 4*atan(1); double x, y, z; double phi, phi2, dphi; dphi = 2*PI/aproximate; for(phi=0; phi<2*PI; phi+=dphi) { phi2 = phi+dphi; p1[0] = cos(phi ); p2[0] = cos(phi2); double ss; double dss = PI / aproximate; for (ss = 0.001; ss < 2*PI; ss+=dss) { p1[2] = (R+r*cos(ss))*sin(phi); p1[0] = (R+r*cos(ss))*cos(phi); p1[1] = r*sin(ss); p2[2] = (R+r*cos(ss))*sin(phi+dphi); p2[0] = (R+r*cos(ss))*cos(phi+dphi); p2[1] = r*sin(ss); p3[2] = (R+r*cos(ss+dss))*sin(phi); p3[0] = (R+r*cos(ss+dss))*cos(phi); p3[1] = r*sin(ss+dss); p4[2] = (R+r*cos(ss+dss))*sin(phi+dphi); p4[0] = (R+r*cos(ss+dss))*cos(phi+dphi); p4[1] = r*sin(ss+dss); Point_copy(Quads[quads++],p1); Point_copy(Quads[quads++],p2); Point_copy(Quads[quads++],p4); Point_copy(Quads[quads++],p3); } } for (i=0;i<quads;i++) { Quads[i][0]*=p/q; } }