
#ifndef _Cone_H_
#define _Cone_H_

#include <stdlib.h>
#include <iostream.h>

#include "prim.h"
#include "vec4.h"

class Ray;

class Cone : public Prim {

	private:
		Vec4	_center;
		float	_r, _r2, _h;
		Bounds3d _bounds;

//XXX
                void CalcBounds (void) {_bounds.Set (_center.x() - _r,  _center.x() + _r, _center.y() - _r, _center.y() + _r, _center.z() - _r, _center.z() + _r);       }

		virtual void DrawFilled (void) const;
	public: 
		Cone();
		Cone(const Vec4 &center, float r, float h);
		Cone(const Cone &S) { CopyFrom(S); }
		virtual ~Cone();

		virtual Prim* CopyPrim() const { return new Cone(*this); }
		virtual const char* PrimName() const { return "Cone"; }

		Cone& CopyFrom(const Cone&);
		Cone& operator=(const Cone &S) { return CopyFrom(S); }

		friend ostream& operator<<(ostream&, const Cone&);
//		friend istream& operator>>(istream&, Cone&);
		virtual void Output(ostream &co) const { co << *this; }

		virtual void Intersect(const Ray &ray, Hit &hit);

		virtual int IntersectLinespace(const Ray &R1, const Ray &R2,
									   const Ray &R3, const Ray &R4,
									   const Vec4 &N1, const Vec4 &N2,
					       const Vec4 &N3, const Vec4 &N4) {
		  cerr << "Cone::IntersectLineSpace not implemented!" << endl; 
return 0;
}
		

		virtual void NormalAtPoint(const Vec4 &P, Vec4 &N) const {
		  cerr << "Cone::NormalAtPoint not implemented yet!" << endl;
//if not on the top or bottom, return this. otherwise, return up or down.
//				Vec4FastSub(N, P, _center);
//				N /= _r;
			}

		virtual const Bounds3d & bbox (void) const  {return _bounds;}

                virtual void calcST (const Vec4 &pt, float &s, float &t) const;

};

#endif
