#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "paulslib.h"

XYZ Eval(double,double);
#define N 101
#define UMIN -PI
#define UMAX PI
#define VMIN -PI
#define VMAX PI

int main(int argc,char **argv)
{
   int i,j,k;
   double u,v,u1,v1,delta=0.001;
   XYZ p[4],n[4],p1,p2;
   COLOUR colour[4];
   COLOUR black = {0.0,0.0,0.0};

   for (i=0;i<N;i++) {
      for (j=0;j<N;j++) {

         u  = UMIN + i     * (UMAX - UMIN) / N;
         u1 = UMIN + (i+1) * (UMAX - UMIN) / N;
         v  = VMIN + j     * (VMAX - VMIN) / N;
         v1 = VMIN + (j+1) * (VMAX - VMIN) / N;

         p[0] = Eval(u,v);
         p1 = Eval(u+delta,v);
         p2 = Eval(u,v+delta);
         n[0] = CalcNormal(p[0],p1,p2);

         p[1] = Eval(u1,v);
         p1 = Eval(u1+delta,v);
         p2 = Eval(u1,v+delta);
         n[1] = CalcNormal(p[1],p1,p2);

         p[2] = Eval(u1,v1);
         p1 = Eval(u1+delta,v1);
         p2 = Eval(u1,v1+delta);
         n[2] = CalcNormal(p[2],p1,p2);

         p[3] = Eval(u,v1);
         p1 = Eval(u+delta,v1);
         p2 = Eval(u,v1+delta);
         n[3] = CalcNormal(p[3],p1,p2);

         colour[0] = GetColour(u,UMIN,UMAX,4);
         colour[1] = GetColour(u1,UMIN,UMAX,4);
         colour[2] = GetColour(u1,UMIN,UMAX,4);
         colour[3] = GetColour(u,UMIN,UMAX,4);

         printf("f4nc ");
         for (k=0;k<4;k++)
            printf("%g %g %g ",p[k].x,p[k].y,p[k].z);
         for (k=0;k<4;k++)
            printf("%g %g %g ",n[k].x,n[k].y,n[k].z);
         for (k=0;k<4;k++)
            printf("%g %g %g ",colour[k].r,colour[k].g,colour[k].b);
         printf("\n");

      }
   }
}

XYZ Eval(double u,double v)
{
   XYZ p;
   double pp;

   pp = sqrt(u*u + v*v) / sqrt(2*PI*PI);

   p.x = (1-pp)*cos(u)*cos(v)+pp*sin(u)*sin(v);
   p.y = (1-pp)*cos(u+TWOPI/3)*cos(v+TWOPI/3)+pp*sin(u+TWOPI/3)*sin(v+TWOPI/3);
   p.z = (1-pp)*cos(u+4*PI/3)*cos(v+4*PI/3)+pp*sin(u+4*PI/3)*sin(v+4*PI/3);

   return(p);
}

#include "paulslib.c"

