#ifndef HALFSPACED3DISPLAY_H
#define HALFSPACED3DISPLAY_H


#include <halfspaceD3.h>
#include <OpenGLtemplated.h>

template< typename HS >
class halfspaceD3display : public gobj
{
public:

  HS halfspace;

  halfspaceD3display(HS & halfspace_)
    : halfspace(halfspace_) {}

  /** Draw just the half space geometry. */
  void draw()
  {
    
    glBegin(GL_TRIANGLES);
    glVertex3T<GLdouble>()(halfspace.p0);
    glVertex3T<GLdouble>()(halfspace.p1);
    glVertex3T<GLdouble>()(halfspace.p2);
    glEnd();
    glPushMatrix();
    glTranslateT<GLdouble>()( (halfspace.p0+halfspace.p1+halfspace.p2)/3.0 );
    glBegin(GL_LINES);
    glVertex3f(0.0,0.0,0.0);
    glVertex3f
    (
      halfspace.normal.x,
      halfspace.normal.y,
      halfspace.normal.z
    );
    glEnd();

    glPopMatrix();
  }
};


template< typename HS >
class halfspaceD3displaywinding : public gobj
{
public:

  HS halfspace;
  GLdouble factor;

  halfspaceD3displaywinding(HS & halfspace_, GLdouble factor_)
    : halfspace(halfspace_), factor(factor_) {}

  /** Draw just the half space geometry. */
  void draw()
  {
    glBegin(GL_TRIANGLES);
    glColor4T<GLdouble>()(1.0,0.0,0.0,factor);
    glVertex3T<GLdouble>()(halfspace.p0);
    glColor4T<GLdouble>()(0.0,1.0,0.0,factor);
    glVertex3T<GLdouble>()(halfspace.p1);
    glColor4T<GLdouble>()(0.0,0.0,1.0,factor);
    glVertex3T<GLdouble>()(halfspace.p2);
    glEnd();
    glPushMatrix();
    glTranslateT<GLdouble>()( (halfspace.p0+halfspace.p1+halfspace.p2)/3.0 );
    glBegin(GL_LINES);
    glColor4T<GLdouble>()(1.0,1.0,1.0,factor);
    glVertex4f(0.0,0.0,0.0,factor);
    glColor4T<GLdouble>()(0.0,0.0,0.0,factor);
    glVertex4f
    (
      halfspace.normal.x,
      halfspace.normal.y,
      halfspace.normal.z,
      factor
    );
    glEnd();

    glPopMatrix();
  }
};



#endif



