
#ifndef _JL_Prim_H_
#define _JL_Prim_H_

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

#include "texture.h"
#include "raycastable.h"

class Vec4;
class Ray;

class Prim : public RayCastable {

protected:
  float			_color[3];
  RCFloat			_hit_cache;
  unsigned int	_time_stamp;
  Texture                 *_texture;                

public: 
  static int		_intersect_count;

public: 
  Prim();
  Prim(const Prim &P) { CopyFrom(P); }
  virtual ~Prim();

  virtual RayCastable* CopyRayCastable() const { return CopyPrim(); }
  virtual Prim* CopyPrim() const = 0;
  virtual const char* PrimName() const = 0;
  
  virtual void Draw (DrawStyle flag) const; //overriding RayCastable::Draw
  
  Prim& CopyFrom(const Prim&);
  Prim& operator=(const Prim &P) { return CopyFrom(P); }

  friend ostream& operator<<(ostream&, const Prim&);
  //		friend istream& operator>>(istream&, Prim&);
  virtual void Output(ostream &co) const
  { co << "Prim (no specialize output function)" << endl; }

  void SetColor(float r, float g, float b)
  { _color[0] = r; _color[1] = g; _color[2] = b; }

   
  virtual Vec4 GetRepresentativeColor (void) {return Vec4 (_color[0], _color[1], _color[2]);}
  virtual void GetColor(const Vec4 &pt, Color &col, Hit &hit, int texlevel) const;

  virtual void setTexture (Texture *newtex) {_texture = newtex;}
  virtual void calcST (const Vec4 &pt, float &s, float &t) const = 0;
  /*
    virtual Prim* Intersect(const Ray &R, RCFloat &hit) = 0;

    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) = 0;

    virtual void NormalAtPoint(const Vec4 &P, Vec4 &N) const = 0;
    */

};

#endif
