#include <bsptree001.h>
#include <bsptreeD2disp03.h>
#include <bsptreeD2dispregions01.h>
#include <zpr.h>


bsptree001* bsptree001::scene = 0;

string bsptree001::doc[] = 
{
  "",
  ""
};

bsptree001::bsptree001(int argc, char** argv)
{
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  glutInitWindowSize(800,600);
  glutCreateWindow("");
  glutDisplayFunc(display);
  glutKeyboardFunc(keyboard);

  OpenGLinitialisation();
  glEnable(GL_CULL_FACE);
  glEnable(GL_NORMALIZE);

  xGraphics.set();

  scene = this;

  keyboarddelta = 0.1;

  spherequadric.radius = 0.2;
  spherequadric.slices = 30;
  spherequadric.loops = 7;

  commandline cmd(argc,argv);

  bspbuild();

  bsptreeD2disp03<pt2,double,uint> * disp
    = new bsptreeD2disp03<pt2,double,uint>(bsp,0.02);
  disp->update();
  gobjpush(disp);
  
  bsptreeD2dispregions01<pt2,double,uint> *dispregions
    = new bsptreeD2dispregions01<pt2,double,uint>(bsp);
  dispregions->delta=0.4;
  dispregions->update();
  gobjpush(dispregions);

  update();


  zpr zz;
  zz.update();

  glutMainLoop();


}

// http://www.codeproject.com/KB/openGL/GLUT_WINDOW_TEMPLATE.aspx
void bsptree001::special(int key, int x, int y)
{
  assertreturn(scene!=0);

  switch (key)
  {
    case GLUT_KEY_RIGHT : scene->spherepos.x += scene->keyboarddelta; break; 
    case GLUT_KEY_LEFT : scene->spherepos.x -= scene->keyboarddelta; break; 
    case GLUT_KEY_UP : scene->spherepos.y += scene->keyboarddelta; break; 
    case GLUT_KEY_DOWN : scene->spherepos.y -= scene->keyboarddelta; break; 
  }

  scene->update();
}

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

/*
    case '+': scene->keyboarddelta *= 10.0; 
      if (scene->keyboarddelta==0.0) 
        scene->keyboarddelta=0.1; 
      break;
    case '-': scene->keyboarddelta /= 10.0; break;

    case 'h': if (help!=0) *help = !*help; break;
*/
  }

  update();
}

void bsptree001::bspbuild()
{
  cout << "Building a simple 2D partition." << endl;
  cout << " Using manual insertion commands : move to the node before" << endl;
  cout << " inserting new node, then adding associated half-space to vi." << endl << endl;

  bsp.addroot( halfspaceD2<pt2,double>(pt2(0.0,0.0),pt2(0.0,1.0)) );
  bsp.addleft( 0,0,halfspaceD2<pt2,double>(pt2(-1.0,1.0),pt2(0.0,1.0)) );
  bsp.addright( 0,0,halfspaceD2<pt2,double>(pt2(0.0,-0.5),pt2(1.0,-0.5)) );
  bsp.addleft( 1*1,1,halfspaceD2<pt2,double>(pt2(4.0,0.0),pt2(4.0,1.0)) );
}


void bsptree001::update()
{
  assertreturn(scene!=0);



/*
  targetg->push(targetsphere);

  targetsphere->x = target.x;
  targetsphere->y = target.y;

  glutPostRedisplay();
*/
}

void bsptree001::currentsphere()
{
  assertreturn(scene!=0);

  uint i;
  scene->bsp.find(i,scene->spherepos);
  switch (i)
  {
    case 1: gobjpush(new gobjglColor3ub(220,20,60)); break;
    case 2: gobjpush(new gobjglColor3ub(0,206,209)); break;
    case 3: gobjpush(new gobjglColor3ub(255,140,0)); break;
    case 4: gobjpush(new gobjglColor3ub(143,188,139)); break;
    case 5: gobjpush(new gobjglColor3ub(184,134,11)); break;

    default:
      gobjpush(new gobjglColor3ub(255,0,0));
  }

  gobjpush
  (
    new gobjMySphereDraw
    (
      scene->spherepos,
      scene->spherequadric
    )
  );

}

void bsptree001::display()
{ 
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  gobj::global->draw();
  glerrordisplay();
  
  glutSwapBuffers();
}


/*
void treeindexedD2test::update03()
{
  assert(targetg!=0);
  assert(targetsphere!=0);

  targetg->kill(1);
  targetg->nuke();
  
  uint i;
  bsp.find(i,target);
  switch (i)
  {
    case 1: targetg->push(new gobjglColor3ub(220,20,60)); break;
    case 2: targetg->push(new gobjglColor3ub(0,206,209)); break;
    case 3: targetg->push(new gobjglColor3ub(255,140,0)); break;
    case 4: targetg->push(new gobjglColor3ub(143,188,139)); break;
    case 5: targetg->push(new gobjglColor3ub(184,134,11)); break;

    default:
      targetg->push(new gobjglColor3ub(255,0,0));
  }

  targetg->push(targetsphere);

  targetsphere->x = target.x;
  targetsphere->y = target.y;

  glutPostRedisplay();
}
*/




