Simple Vector Library 1.5 http://www.cs.cmu.edu/~ajw/doc/svl.html

Mat4.h

Committer:
BartJanssens
Date:
2016-01-05
Revision:
1:e25ff4b06ed2
Parent:
0:785cff1e5a7c

File content as of revision 1:e25ff4b06ed2:

/*
    File:           Mat4.h

    Function:       Defines a 4 x 4 matrix.

    Author(s):      Andrew Willmott

    Copyright:      (c) 1995-2001, Andrew Willmott
 */

#ifndef __Mat4__
#define __Mat4__

#include "Vec3.h"
#include "Vec4.h"


// --- Mat4 Class -------------------------------------------------------------

class Mat4
{
public:

    // Constructors

                Mat4();
                Mat4(Real a, Real b, Real c, Real d,
                     Real e, Real f, Real g, Real h,
                     Real i, Real j, Real k, Real l,
                     Real m, Real n, Real o, Real p);
                Mat4(const Mat4 &m);
                Mat4(ZeroOrOne k);
                Mat4(Block k);

    // Accessor functions

    Int          Rows() const { return(4); };
    Int          Cols() const { return(4); };

    Vec4        &operator [] (Int i);
    const Vec4  &operator [] (Int i) const;

    Real        *Ref() const;

    // Assignment operators

    Mat4        &operator =  (const Mat4 &m);
    Mat4        &operator =  (ZeroOrOne k);
    Mat4        &operator =  (Block k);
    Mat4        &operator += (const Mat4 &m);
    Mat4        &operator -= (const Mat4 &m);
    Mat4        &operator *= (const Mat4 &m);
    Mat4        &operator *= (Real s);
    Mat4        &operator /= (Real s);

    // Comparison operators

    Bool        operator == (const Mat4 &m) const;  // M == N?
    Bool        operator != (const Mat4 &m) const;  // M != N?

    // Arithmetic operators

    Mat4        operator + (const Mat4 &m) const;   // M + N
    Mat4        operator - (const Mat4 &m) const;   // M - N
    Mat4        operator - () const;                // -M
    Mat4        operator * (const Mat4 &m) const;   // M * N
    Mat4        operator * (Real s) const;          // M * s
    Mat4        operator / (Real s) const;          // M / s

    // Initialisers

    Void        MakeZero();                         // Zero matrix
    Void        MakeDiag(Real k = vl_one);          // I
    Void        MakeBlock(Real k = vl_one);         // all elts = k

    // Homogeneous Transforms

    Mat4&       MakeHRot(const Vec3 &axis, Real theta);
                                    // Rotate by theta radians about axis
    Mat4&       MakeHRot(const Vec4 &q);    // Rotate by quaternion
    Mat4&       MakeHScale(const Vec3 &s);  // Scale by components of s

    Mat4&       MakeHTrans(const Vec3 &t);  // Translation by t

    Mat4&       Transpose();                // transpose in place
    Mat4&       AddShift(const Vec3 &t);    // Concatenate shift

    // Private...

protected:

    Vec4        row[4];
};


// --- Matrix operators -------------------------------------------------------

Vec4            operator * (const Mat4 &m, const Vec4 &v);  // m * v
Vec4            operator * (const Vec4 &v, const Mat4 &m);  // v * m
Vec4            &operator *= (Vec4 &a, const Mat4 &m);      // v *= m
inline Mat4     operator * (Real s, const Mat4 &m);         // s * m

Mat4            trans(const Mat4 &m);               // Transpose
Real            trace(const Mat4 &m);               // Trace
Mat4            adj(const Mat4 &m);                 // Adjoint
Real            det(const Mat4 &m);                 // Determinant
Mat4            inv(const Mat4 &m);                 // Inverse
Mat4            oprod(const Vec4 &a, const Vec4 &b);
                                                    // Outer product

// The xform functions help avoid dependence on whether row or column
// vectors are used to represent points and vectors.
inline Vec4     xform(const Mat4 &m, const Vec4 &v); // Transform of v by m
inline Vec3     xform(const Mat4 &m, const Vec3 &v); // Hom. xform of v by m
inline Mat4     xform(const Mat4 &m, const Mat4 &n); // Xform v -> m(n(v))

//std::ostream         &operator << (std::ostream &s, const Mat4 &m);
//std::istream         &operator >> (std::istream &s, Mat4 &m);

void printMat4(const Mat4 &m);

// --- Inlines ----------------------------------------------------------------

inline Mat4::Mat4()
{
}

inline Vec4 &Mat4::operator [] (Int i)
{
    CheckRange(i, 0, 4, "(Mat4::[i]) index out of range");
    return(row[i]);
}

inline const Vec4 &Mat4::operator [] (Int i) const
{
    CheckRange(i, 0, 4, "(Mat4::[i]) index out of range");
    return(row[i]);
}

inline Real *Mat4::Ref() const
{
    return((Real *) row);
}

inline Mat4::Mat4(ZeroOrOne k)
{
    MakeDiag(k);
}

inline Mat4::Mat4(Block k)
{
    MakeBlock((ZeroOrOne) k);
}

inline Mat4 &Mat4::operator = (ZeroOrOne k)
{
    MakeDiag(k);

    return(SELF);
}

inline Mat4 &Mat4::operator = (Block k)
{
    MakeBlock((ZeroOrOne) k);

    return(SELF);
}

inline Mat4 operator * (Real s, const Mat4 &m)
{
    return(m * s);
}

#ifdef VL_ROW_ORIENT
inline Vec3 xform(const Mat4 &m, const Vec3 &v)
{ return(proj(Vec4(v, 1.0) * m)); }
inline Vec4 xform(const Mat4 &m, const Vec4 &v)
{ return(v * m); }
inline Mat4 xform(const Mat4 &m, const Mat4 &n)
{ return(n * m); }
#else
inline Vec3 xform(const Mat4 &m, const Vec3 &v)
{ return(proj(m * Vec4(v, 1.0))); }
inline Vec4 xform(const Mat4 &m, const Vec4 &v)
{ return(m * v); }
inline Mat4 xform(const Mat4 &m, const Mat4 &n)
{ return(m * n); }
#endif

#endif