/*
Copyright (C) 1997, 1998, 1999, 2000 by Alex Pfaffe
(Digital Dawn Graphics Inc)
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef _ddgMatrix_Class_
#define _ddgMatrix_Class_
#ifdef WIN32
#include <string.h>
#endif
#include "math/ddgvec.h"
class WEXP ddgMatrix3 {
public:
ddgVector3 m[3];
ddgVector3 operator[](int n) { return m[n]; }
ddgMatrix3( ddgVector3 *v1, ddgVector3 *v2, ddgVector3 *v3 )
{ m[0].set(v1); m[1].set(v2); m[2].set(v3); }
};
class WEXP ddgMatrix4 {
public:
ddgVector4 m[4];
ddgMatrix4(void) { }
float& operator[](int i)
{ return m[i/4].v[i%4]; }
float& operator()(int i, int j)
{ return m[i].v[j]; }
float& operator()(int i)
{ return m[i/4].v[i%4]; }
ddgMatrix4& operator += ( const ddgMatrix4& m1 )
{ m[0] += m1.m[0]; m[1] += m1.m[1]; m[2] += m1.m[2]; m[3] += m1.m[3]; return *this;}
ddgMatrix4& operator -= ( const ddgMatrix4& m1 )
{ m[0] -= m1.m[0]; m[1] -= m1.m[1]; m[2] -= m1.m[2]; m[3] -= m1.m[3]; return *this;}
ddgMatrix4& operator *= ( const ddgMatrix4& m1 );
friend ddgMatrix4 operator *( const ddgMatrix4& m1, const ddgMatrix4& m2 )
{
ddgMatrix4 out(m1);
out *= m2;
return out;
}
// Scale.
ddgMatrix4& operator *= ( const float d )
{ m[0] *= d; m[1] *= d; m[2] *= d; m[3] *= d; return *this;}
// Division
ddgMatrix4& operator /= ( const float d )
{ m[0] /= d; m[1] /= d; m[2] /= d; m[3] /= d; return *this;}
ddgMatrix4& operator=(const ddgMatrix4& s)
{ m[0] = s.m[0]; m[1] = s.m[1]; m[2] = s.m[2]; m[3] = s.m[3]; return *this; }
void identity(void)
{
m[0].set(1,0,0,0);
m[1].set(0,1,0,0);
m[2].set(0,0,1,0);
m[3].set(0,0,0,1);
}
inline friend ddgVector4 operator* (const ddgMatrix4& a, const ddgVector4& v)
{
return ddgVector4(a.m[0][0]*v[0] + a.m[0][1]*v[1] + a.m[0][2]*v[2] + a.m[0][3]*v[3],
a.m[1][0]*v[0] + a.m[1][1]*v[1] + a.m[1][2]*v[2] + a.m[1][3]*v[3],
a.m[2][0]*v[0] + a.m[2][1]*v[1] + a.m[2][2]*v[2] + a.m[2][3]*v[3],
a.m[3][0]*v[0] + a.m[3][1]*v[1] + a.m[3][2]*v[2] + a.m[3][3]*v[3]);
}
friend ddgMatrix4 operator - (const ddgMatrix4& a) // -m1
{
ddgMatrix4 m1;
m1 = a;
m1.m[0] *= -1; m1.m[1] *= -1; m1.m[2] *= -1; m1.m[3] *= -1;
return m1;
}
friend ddgMatrix4 operator + (const ddgMatrix4& a, const ddgMatrix4& b) // m1 + m2
{
ddgMatrix4 m1;
m1.m[0] = a.m[0] + b.m[0]; m1.m[1] = a.m[1] + b.m[1]; m1.m[2] = a.m[2] + b.m[2]; m1.m[3] = a.m[3] + b.m[3];
return m1;
}
friend ddgMatrix4 operator - (const ddgMatrix4& a, const ddgMatrix4& b) // m1 - m2
{
ddgMatrix4 m1;
m1.m[0] = a.m[0] - b.m[0]; m1.m[1] = a.m[1] - b.m[1]; m1.m[2] = a.m[2] - b.m[2]; m1.m[3] = a.m[3] - b.m[3];
return m1;
}
friend ddgMatrix4 operator / (const ddgMatrix4& a, const float d) // m1 / d
{
ddgMatrix4 m1;
m1 = a;
m1.m[0] /=d; m1.m[1] /=d; m1.m[2] /=d; m1.m[3] /=d;
return m1;
}
// Check equality
friend bool operator == (const ddgMatrix4& a, const ddgMatrix4& b) // m1 == m2 ?
{
return a.m[0] == b.m[0] && a.m[1] == b.m[1] && a.m[2] == b.m[2] && a.m[3] == b.m[3];
}
// Check inequality
friend bool operator != (const ddgMatrix4& a, const ddgMatrix4& b) // m1 != m2 ?
{
return (a.m[0] != b.m[0]) || (a.m[1] != b.m[1]) || (a.m[2] != b.m[2]) || (a.m[3] != b.m[3]);
}
ddgMatrix4( ddgVector4 *v1, ddgVector4 *v2, ddgVector4 *v3, ddgVector4 *v4)
{ m[0].set(v1); m[1].set(v2); m[2].set(v3); m[3].set(v4); }
ddgMatrix4( float u[16] )
{ m[0].set(&u[0]); m[1].set(&u[4]); m[2].set(&u[8]); m[3].set(&u[12]);}
void assignto( float u[16] )
{ int i = 0; do { u[i] = m[i/4].v[i%4]; } while (++i < 16 ); }
operator float*() { return &m[0].v[0]; };
void invert(void);
void transpose(void);
};
void WEXP ddgMatrixMultiply( float product[], const float a[], const float b[] );
void WEXP ddgRotationMatrix( float angle, float x, float y, float z, float m[] );
#endif