// openGL includes
#include <GL/gl.h>
#include <GL/glu.h>

#ifndef _GEOMOBJECT_H__
#define _GEOMOBJECT_H__

//
// Object
//
class GeomObject {
  
public:
  GeomObject         ( void );
  
  // pure virtuals - necessary to overload
public:
  virtual int        intersectWithRay      ( const Point3&, 
					     const Point3&, Point3& ) = 0;
  virtual int        nearestToRay          ( const Point3&,
					     const Point3&, Point3& ) = 0;
  virtual int        nearestToPoint        ( const Point3&, Point3& ) = 0;
  virtual int        normalAtPoint         ( const Point3&, Vector3& ) = 0;
  virtual void       bounds                ( Point3&, Point3& ) = 0;
  virtual int        update                ( const Point3&, const Point3& ) = 0;
  virtual void       draw                  ( float, float, float ) = 0;                   
  virtual void       drawBounds            ( void ) = 0;  

  // virtuals - not necessary to overload
public:
  virtual void       setPosition           ( const Point3& );
  virtual void       setColor   ( float r, float g, float b )
  { _col[0] = r; _col[1] = g; _col[2] = b; };
  virtual void       attach                ( GeomObject* c ) { _constraint = c; };

  // protected: // XXX these should be protected, with real access methods
  Point3            _pos;                  // object position (usually centroid)
  Color3            _col;                  // a distinct color for object
  GeomObject       *_constraint;           // object to which it is constrained, if any

};

//
// Sphere
//
class Sphere: public GeomObject {
  
public:
  Sphere                                   ( float radius = 1.f, 
					     int nlunes = 16, 
					     int nbands = 16 );
  
public:
  virtual int        intersectWithRay      ( const Point3&, 
					     const Point3&, Point3& );
  virtual int        nearestToRay          ( const Point3&, 
					     const Point3&, Point3& );
  virtual int        nearestToPoint        ( const Point3&, Point3& );
  virtual int        normalAtPoint         ( const Point3&, Vector3& );
  virtual void       bounds                ( Point3&, Point3& );
  virtual int        update                ( const Point3&, const Point3& );
  virtual void       draw                  ( float r, float g, float b );
  virtual void       drawBounds            ( void );

private:
  float              _radius;
  int                _nlunes;              // # sections of constant longitude
  int                _nbands;              // # sections of constant latitude
  GLUquadricObj     *_sphereQuadric;
};

#endif
