//
// RiTMatrix3Factory.h -- RiTMatrix3Factory class definition
//
// Author:    Peter Shirley, April 24, 1997

#ifndef RITMATRIX3FACTORY_H
#define RITMATRIX3FACTORY_H

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

#ifndef RIFRAME3_H
#include <RiFrame3.H>
#endif



/***************************************************************
CLASS
    RiTMatrix3Factory
    This stract class that represents a homegeneous transform
    matrix and its inverse.

DESCRIPTION
    Used to generate RiAffineTMatrix3 via calls to build
    matrices via Create* calls.

PATTERN
    This is a factory for generating RiAffineTMatrix3 and
    other TMatrix3 (when implemented)

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

class RiTMatrix3Factory {
public:
				//// Create an Identity Matrix.
    static RiAffineTMatrix3 CreateIdentity();
                                   //// Create inverse of matrix m
    static RiAffineTMatrix3 CreateInverse( const RiAffineTMatrix3 &m);
                                   //// Resulting matrix takes vector
                                   // written in terms of basis (with 
                                   // canonical origin) to 
                                   // vector written in canonical coords.
    static RiAffineTMatrix3 CreateBasisToCanonical( const RiONB3 &basis);
                                   //// Resulting matrix takes vector
                                   // written in terms of canonical basis to
                                   // vector written in basis coords.
    static RiAffineTMatrix3 CreateCanonicalToBasis( const RiONB3 &basis);
                                   //// Resulting matrix takes vector
                                   // written in terms of frame to 
                                   // vector written in canonical coords.
    static RiAffineTMatrix3 CreateFrameToCanonical( const RiFrame3 &frame);
                                    //// Resulting matrix takes vector
                                   // written in terms of canonical basis to 
                                   // vector written in frame coords.
     static RiAffineTMatrix3 CreateCanonicalToFrame( const RiFrame3 &frame);
                                   //// Resulting matrix will translate
    static RiAffineTMatrix3 CreateTranslate( const RiVector3 &v);
                                   //// Resulting matrix will scale
    static RiAffineTMatrix3 CreateScale( const RiVector3 &v);
				//// Resulting matrix Rotates (clockwise) around the given vector
    static RiAffineTMatrix3 CreateRotation(const RiVector3 &rotVector, RiReal amountRad);
				//// Create a matrix based on 4 column vectors
    static RiAffineTMatrix3 CreateDirect(const RiVector3 &c0, const RiVector3 &c1,
					 const RiVector3 &c2, const RiVector3 &c3); 
};



#endif // RITMATRIX3FACTORY_H

