
#include <zpr.h>
#include <graphmisc.h>

#include <pointsurfacetest.h>


#include <pointsurface.h>


void pointsurfacetestdisplay01()
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  gobj::global->draw();

  glerrordisplay();
  
  glutSwapBuffers();
}

void pointsurfacetestkeyboard01(unsigned char key, int x, int y)
{
  switch (key)
  {
    case 27:
      exit(0);
      break;
  }
}


class pointsurfacetestOval 
{
public:

  void operator()
  (
    bool & accept,
    double & x,
    double & y,
    double & z,
    doublec u,
    doublec v
  )
  {
    double u2(u*2.0-1.0);
    double v2(v*2.0-1.0);
    if (u2*u2+v2*v2>1.0)
    {
      accept=false;
      return;
    }
   
    x=u2*3.0;
    y=0.0;
    z=v2*6.0;

//cout << SHOW(x) << " " << SHOW(y) << " " SHOW(z) << endl;

    accept=true;
  }  
};


int pointsurfacetest::test01(int argc, char** argv)
{
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  glutInitWindowSize(800,600);
  glutCreateWindow("");
  glutDisplayFunc(pointsurfacetestdisplay01);
  glutKeyboardFunc(pointsurfacetestkeyboard01);

  OpenGLinitialisation();

  glEnable(GL_DEPTH_TEST);
  glEnable(GL_CULL_FACE);
  glEnable(GL_NORMALIZE);

  xGraphics.set();

  pointsurfacetestOval f;

  pointsurface<> ps(2000);
  ps.pre.push(new gobjglColor3f(1.0,0.0,0.0) );

  ps.addsurface2D(f);

  gobjpush(&ps);

  /** Mouse interaction. */
  zpr zz;

  glutMainLoop();

  return 0;
}
  

int pointsurfacetest::test02(int argc, char** argv)
{
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  glutInitWindowSize(800,600);
  glutCreateWindow("");
  glutDisplayFunc(pointsurfacetestdisplay01);
  glutKeyboardFunc(pointsurfacetestkeyboard01);

  OpenGLinitialisation();

  glEnable(GL_DEPTH_TEST);
  glEnable(GL_CULL_FACE);
  glEnable(GL_NORMALIZE);

  /** Mouse interaction. */
  zpr zz;

  xGraphics.set();

  pointsurfaceSphere f;

  pointsurface<> ps(2000);
  ps.pre.push(new gobjglColor3ub(184,134,11) );

/*

  pointsurfacetestSphere f;

  pointsurface<> ps(2000);
  ps.pre.push(new gobjglColor3f(1.0,0.0,0.0) );
*/

  ps.addsurface3D(f);

  gobjpush(&ps);

  glutMainLoop();

  return 0;
}


int pointsurfacetest::test03(int argc, char** argv)
{
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  glutInitWindowSize(800,600);
  glutCreateWindow("");
  glutDisplayFunc(pointsurfacetestdisplay01);
  glutKeyboardFunc(pointsurfacetestkeyboard01);

  OpenGLinitialisation();

  glEnable(GL_DEPTH_TEST);
  glEnable(GL_CULL_FACE);
  glEnable(GL_NORMALIZE);

  /** Mouse interaction. */
  zpr zz;

  xGraphics.set();

  pointsurfaceParallelogram f
  ( 
    point3<double>(0.1,0.1,0.0),
    point3<double>(0.3,0.1,0.0),
    point3<double>(0.0,0.0,0.2)
  );

  pointsurface<> ps(2000);
  ps.pre.push(new gobjglColor3ub(184,134,11) );

  ps.addsurface2D(f);

  gobjpush(&ps);

  glutMainLoop();

  return 0;
}


