
#ifndef _JL_Geometry_H_
#define _JL_Geometry_H_

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

#include "raycastnode.h"
#include "raycastablelist.h"

class Ray;

class Geometry : public RayCastNode {

	private:
		RayCastableList		_objects;
                Bounds3d _bounds;  

	public: 
		Geometry();
		Geometry(RayCastNode *p, float, float, float, float, float, float);
		Geometry(RayCastNode *p, const Bounds3d&);
		Geometry(const Geometry &G) { CopyFrom(G); }
		virtual ~Geometry();

                virtual const Bounds3d & bbox (void) const {return _bounds;}
		virtual RayCastable* CopyRayCastable() const
				{ return new Geometry(*this); }

//		virtual Prim* Copy() const { return new Geometry(*this); }
//		virtual const char* PrimName() const { return "RCN:Geometry"; }

		Geometry& CopyFrom(const Geometry&);
		Geometry& operator=(const Geometry &G) { return CopyFrom(G); }

		friend ostream& operator<<(ostream&, const Geometry&);
//		friend istream& operator>>(istream&, Geometry&);

		virtual void PlaceRayCastable(RayCastable *object)
				{ Bounds3d objbbox = object->bbox();
                                  _bounds.IncludePoint (Vec4(objbbox.x1(), objbbox.y1(), objbbox.z1()));
                                  _bounds.IncludePoint (Vec4(objbbox.x2(), objbbox.y2(), objbbox.z2()));
                                  _objects.PlaceInList(object); }

		RayCastableList& GetObjects() { return _objects; }

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

		virtual int IntersectLinespace(const Ray&, const Ray&,
									   const Ray&, const Ray&,
									   const Vec4&, const Vec4&,
									   const Vec4&, const Vec4&) {

				cerr << "Geometry::IntersectLinespace() not implemented"
					 << endl;
				exit(-1);
				return 0;
			}

//		virtual void DrawStructure();
//		virtual void DrawContents(int recurse=0);
};

#endif
