Esempio n. 1
0
/*
 *  Draw patch
 *
 *  patch = set of point numbers
 *  Sx = x reflection (+/-1)
 *  Sy = y reflection (+/-1)
 *  Sz = z reflection (+/-1)
 */
static void Patch(int patch[4][4],float Sx,float Sy,float Sz)
{
   int   i,j,k;
   Point p[4][4],P[MAXN+1][MAXN+1],N[MAXN+1][MAXN+1],T[MAXN+1][MAXN+1];

   //  Copy data with reflection
   for (k=0;k<4;k++)
   {
      int K = Sx*Sy*Sz<0 ? 3-k : k;
      for (j=0;j<4;j++)
      {
         int l = patch[j][K];
         p[j][k].x = +Sx*data[l].x;
         p[j][k].z = -Sy*data[l].y;
         p[j][k].y = +Sz*data[l].z;
      }
   }

   //  Evaluate vertexes
   for (i=0;i<=n;i++)
      for (j=0;j<=n;j++)
      {
         float u = (float)i/n;
         float v = (float)j/n;
         //  Vertex coordinates
         P[i][j] = Bezier2D(p,u,v);
         //  Normal
         N[i][j] = Normal2D(p,u,v);
         //  Texture coordinates
         T[i][j].x = 1-u;
         T[i][j].y = 1-v;
         T[i][j].z = 0;
      }

   //  Draw quads
   for (i=0;i<n;i++)
      for (j=0;j<n;j++)
      {
         Point p[4] = {P[i][j],P[i+1][j],P[i+1][j+1],P[i][j+1]};
         Point n[4] = {N[i][j],N[i+1][j],N[i+1][j+1],N[i][j+1]};
         Point t[4] = {T[i][j],T[i+1][j],T[i+1][j+1],T[i][j+1]};
         DrawPolyShadow(p,n,t,4);
      }
}
Esempio n. 2
0
/*
 *  Draw patch
 */
static void Patch(int patch[4][4],float Sx,float Sy,int n)
{
   Point p[4][4],P[MAXN+1][MAXN+1],N[MAXN+1][MAXN+1],T[MAXN+1][MAXN+1];

   //  Copy data with reflection
   for (int k=0;k<4;k++)
   {
      int K = Sx*Sy<0 ? 3-k : k;
      for (int j=0;j<4;j++)
      {
         int l = patch[j][K];
         p[j][k].x = Sx*data[l].x;
         p[j][k].y = Sy*data[l].y;
         p[j][k].z =    data[l].z;
      }
   }

   //  Evaluate grid points
   for (int i=0;i<=n;i++)
      for (int j=0;j<=n;j++)
      {
         float u = (float)i/n;
         float v = (float)j/n;
         P[i][j] = Bezier2D(p,u,v);
         N[i][j] = Normal2D(p,u,v);
         T[i][j].x = 1-u;
         T[i][j].y = 1-v;
         T[i][j].z = 0;
      }

   //  Draw quads
   for (int i=0;i<n;i++)
   {
      glBegin(GL_QUAD_STRIP);
      for (int j=0;j<=n;j++)
      {
         //  Draw normals and vertexes
         glNormal3fv((float*)&N[i  ][j]); glTexCoord2fv((float*)&T[i  ][j]); glVertex3fv((float*)&P[i  ][j]);
         glNormal3fv((float*)&N[i+1][j]); glTexCoord2fv((float*)&T[i+1][j]); glVertex3fv((float*)&P[i+1][j]);
      }
      glEnd();
   }
}