示例#1
0
/* 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;
}
示例#2
0
文件: camera.c 项目: mearns/raytrace
Point_t * Camera_getEye(const Camera_t *const pThis, Point_t *opEye)
{
    Point_copy(opEye, &(pThis->axes.origin));
    return opEye;
}
示例#3
0
文件: widget.cpp 项目: spetz911/CG
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;

    }



}
示例#4
0
文件: widget.cpp 项目: spetz911/CG
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;

    }



}
示例#5
0
文件: widget.cpp 项目: spetz911/CG
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;

    }



}