// -*- C++ -*-
#ifndef RICAMERA_H
#define RICAMERA_H
/* Copyright 1996 
 * Wed Aug 13 10:09:47 1997  Brian Smits  (bes@phoenix.cs.utah.edu)
 * 
 * RiCamera.H
 * 
 *	
 * 
 * $Id: RiCamera.H,v 1.1 1997/08/15 16:09:23 bes Exp $ 
 * 
 */
#ifndef RICOMMON_H
#include <RiCommon.H>
#endif

#ifndef RIAFFINETMATRIX3_H
#include <RiAffineTMatrix3.H>
#endif

#ifndef RIRAY3_H
#include <RiRay3.H>
#endif

#ifndef RIVECTOR2_H
#include <RiVector2.H>
#endif


/***************************************************************
CLASS
    RiCamera
    Generic base class for all cameras

DESCRIPTION
    This should hold general manipulation 

****************************************************************/

class RiCamera {
  public:
				//// Destructor
    virtual ~RiCamera() {};
				// GROUP: Members
				//// General manipulation of the camera.  Some cameras may
				// not allow a scale or perhaps even a rotation (Cylindrical panoramic),
				// these need to catch or ignore this component of the matrix.
    virtual void Transform(const RiAffineTMatrix3 &) = 0;
  private:
};


/***************************************************************
CLASS
    RiRayCamera
    An RiCamera that allows the creation of rays.

DESCRIPTION
    A mixin class that simply allows rays to be generated from the camera, the only thing
    a ray tracer (in the form of an RiRayCameraPixelRenderer) needs

****************************************************************/

class RiRayCamera : public RiCamera {
  public:
				// GROUP: Members
                                //// Screen coord is in the range[0,1]^2.
                                //  (0,0) is lower-left corner.  lensCoord
                                // is a seed in [0,1]^2 for lens sampling.
    virtual RiRay3 GetRay( const RiVector2& screenCoord, const RiVector2& lensCoord ) const = 0;
};



#endif /* RICAMERA_H */

