/* * 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); } }
/* * 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(); } }