// -*- C++ -*-
#ifndef RITEXTURE_H
#define RITEXTURE_H
/* Copyright 1998 
 * Tue Oct 20 13:27:14 1998  Brian Smits  (bes@phoenix.cs.utah.edu)
 * 
 * RiTexture.H
 * 
 *	
 * 
 * $Id: RiTexture.H,v 1.2 1999/10/01 18:27:12 bes Exp $ 
 * 
 */
#ifndef RICOMMON_H
#include <RiCommon.H>
#endif

#ifndef RIVECTOR3_H
#include <RiVector3.H>
#endif

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

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

#ifndef RISPECTRUM_H
#include <RiSpectrum.H>
#endif

#ifndef RIMATERIAL_H
#include <RiMaterial.H>
#endif



/***************************************************************
CLASS
    RiTexture
     <one line summary> 

DESCRIPTION
     <Detailed description with any warnings>

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

class RiTexture {
  public:
    // GROUP: Constructors and assignment
    //// Destructor
    virtual ~RiTexture();
    // GROUP: Accessors
				////
    virtual RiReal GetScalar(RiMaterialRegion &hit) = 0;
				////
    virtual RiVector2 GetVector2(RiMaterialRegion &hit) = 0;
				////
    virtual RiVector3 GetVector3(RiMaterialRegion &hit) = 0;
				////
    virtual RiSpectrum GetSpectrum(RiMaterialRegion &hit) = 0;
    // GROUP: Members
  private:
};

class RiScalarTextureProxy {
  public:
    RiScalarTextureProxy();
    RiScalarTextureProxy(RiReal val);
    RiScalarTextureProxy(RiTexture *tex);
    RiReal GetValue(RiMaterialRegion &hit);
  private:
    bool textured;
    RiReal val;
    RiTexture *tex;
};

class RiVector2TextureProxy {
  public:
    RiVector2TextureProxy();
    RiVector2TextureProxy(RiVector2 val);
    RiVector2TextureProxy(RiTexture *tex);
    RiVector2 GetValue(RiMaterialRegion &hit);
  private:
    bool textured;
    RiVector2 val;
    RiTexture *tex;
};

class RiVector3TextureProxy {
    friend class RiSpectrumTextureProxy;
  public:
    RiVector3TextureProxy();
    RiVector3TextureProxy(RiVector3 val);
    RiVector3TextureProxy(RiTexture *tex);
    RiVector3 GetValue(RiMaterialRegion &hit);
  private:
    bool textured;
    RiVector3 val;
    RiTexture *tex;
};


class RiSpectrumTextureProxy {
  public:
    RiSpectrumTextureProxy();
    RiSpectrumTextureProxy(RiSpectrum val);
    RiSpectrumTextureProxy(RiReal red, RiReal green, RiReal blue);
    RiSpectrumTextureProxy(RiTexture *tex, bool rgbTexture = false);
//    RiSpectrumTextureProxy(const RiVector3TextureProxy &);
    RiSpectrum GetValue(RiMaterialRegion &hit);
  private:
    bool textured;
    bool rgbTexture;
    RiSpectrum val;
    RiTexture *tex;
};




class Ri3DCheckerTexture : public RiTexture {
  public:
				// group: Constructors and assignment
    Ri3DCheckerTexture(const RiAffineTMatrix3 &placement, bool xOn = true, bool yOn = true, bool zOn = true);
				////
    void SetColor1(const RiSpectrumTextureProxy &color1);
				////
    void SetColor2(const RiSpectrumTextureProxy &color2);
				////
    virtual RiReal GetScalar(RiMaterialRegion &hit);
				////
    virtual RiVector2 GetVector2(RiMaterialRegion &hit);
				////
    virtual RiVector3 GetVector3(RiMaterialRegion &hit);
				////
    virtual RiSpectrum GetSpectrum(RiMaterialRegion &hit);
  private:
    RiSpectrumTextureProxy clr1;
    RiSpectrumTextureProxy clr2;
    RiAffineTMatrix3 texPlace;
    bool xOn, yOn, zOn;
};



#endif /* RITEXTURE_H */

