/***************************************************************************
* Copyright (C) 2005 by Raphael Langerhorst *
* raphael-langerhorst@gmx.at *
* *
* Permission is hereby granted, free of charge, to any person obtaining *
* a copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, sublicense, and/or sell copies of the Software, and to *
* permit persons to whom the Software is furnished to do so, subject to *
* the following conditions: *
* *
* The above copyright notice and this permission notice shall be *
* included in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, *
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR *
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR *
* OTHER DEALINGS IN THE SOFTWARE. *
***************************************************************************/
#include "GMatrix44.h"
#include "GVector3.h"
#include <cmath> //sin,cos
using namespace std;
namespace GCS
{
// if you change the behaviour of the standard constructor, please update createIdentityMatrix()
GMatrix44::GMatrix44()
:
m11(1), m12(0), m13(0), m14(0),
m21(0), m22(1), m23(0), m24(0),
m31(0), m32(0), m33(1), m34(0),
m41(0), m42(0), m43(0), m44(1)
{
}
GMatrix44::GMatrix44(
double _m11, double _m12, double _m13, double _m14,
double _m21, double _m22, double _m23, double _m24,
double _m31, double _m32, double _m33, double _m34,
double _m41, double _m42, double _m43, double _m44)
:
m11(_m11), m12(_m12), m13(_m13), m14(_m14),
m21(_m21), m22(_m22), m23(_m23), m24(_m24),
m31(_m31), m32(_m32), m33(_m33), m34(_m34),
m41(_m41), m42(_m42), m43(_m43), m44(_m44)
{
}
GMatrix44::GMatrix44(const GMatrix44& original)
:
m11(original.m11), m12(original.m12), m13(original.m13), m14(original.m14),
m21(original.m21), m22(original.m22), m23(original.m23), m24(original.m24),
m31(original.m31), m32(original.m32), m33(original.m33), m34(original.m34),
m41(original.m41), m42(original.m42), m43(original.m43), m44(original.m44)
{
}
GMatrix44::operator double* ()
{
return (double*)(n);
}
GMatrix44& GMatrix44::loadIdentity()
{
m11 = 1; m12 = 0; m13 = 0; m14 = 0;
m21 = 0; m22 = 1; m23 = 0; m24 = 0;
m31 = 0; m32 = 0; m33 = 1; m34 = 0;
m41 = 0; m42 = 0; m43 = 0; m44 = 1;
return *this;
}
GMatrix44 GMatrix44::multiply(double scalar) const
{
return GMatrix44(m11 * scalar, m12 * scalar, m13 * scalar, m14 * scalar,
m21 * scalar, m22 * scalar, m23 * scalar, m24 * scalar,
m31 * scalar, m32 * scalar, m33 * scalar, m34 * scalar,
m41 * scalar, m42 * scalar, m43 * scalar, m44 * scalar);
}
GMatrix44 GMatrix44::multiply(const GMatrix44& m) const
{
return GMatrix44(m.m11 * m11 + m.m21 * m12 + m.m31 * m13 + m.m41 * m14,
m.m12 * m11 + m.m22 * m12 + m.m32 * m13 + m.m42 * m14,
m.m13 * m11 + m.m23 * m12 + m.m33 * m13 + m.m43 * m14,
m.m14 * m11 + m.m24 * m12 + m.m34 * m13 + m.m44 * m14,
m.m11 * m21 + m.m21 * m22 + m.m31 * m23 + m.m41 * m24,
m.m12 * m21 + m.m22 * m22 + m.m32 * m23 + m.m42 * m24,
m.m13 * m21 + m.m23 * m22 + m.m33 * m23 + m.m43 * m24,
m.m14 * m21 + m.m24 * m22 + m.m34 * m23 + m.m44 * m24,
m.m11 * m31 + m.m21 * m32 + m.m31 * m33 + m.m41 * m34,
m.m12 * m31 + m.m22 * m32 + m.m32 * m33 + m.m42 * m34,
m.m13 * m31 + m.m23 * m32 + m.m33 * m33 + m.m43 * m34,
m.m14 * m31 + m.m24 * m32 + m.m34 * m33 + m.m44 * m34,
m.m11 * m41 + m.m21 * m42 + m.m31 * m43 + m.m41 * m44,
m.m12 * m41 + m.m22 * m42 + m.m32 * m43 + m.m42 * m44,
m.m13 * m41 + m.m23 * m42 + m.m33 * m43 + m.m43 * m44,
m.m14 * m41 + m.m24 * m42 + m.m34 * m43 + m.m44 * m44);
}
GVector3 GMatrix44::transform(const GVector3& v) const
{
return GVector3(m[0][0]*v.x + m[0][1]*v.y + m[0][2]*v.z,
m[1][0]*v.x + m[1][1]*v.y + m[1][2]*v.z,
m[2][0]*v.x + m[2][1]*v.y + m[2][2]*v.z);
}
GMatrix44 GMatrix44::operator + (const GMatrix44& m) const
{
return GMatrix44(m11 + m.m11, m12 + m.m12, m13 + m.m13, m14 + m.m14,
m21 + m.m21, m22 + m.m22, m23 + m.m23, m24 + m.m24,
m31 + m.m31, m32 + m.m32, m33 + m.m33, m34 + m.m34,
m41 + m.m41, m42 + m.m42, m43 + m.m43, m44 + m.m44);
}
GMatrix44 GMatrix44::operator - (const GMatrix44& m) const
{
return GMatrix44(m11 - m.m11, m12 - m.m12, m13 - m.m13, m14 - m.m14,
m21 - m.m21, m22 - m.m22, m23 - m.m23, m24 - m.m24,
m31 - m.m31, m32 - m.m32, m33 - m.m33, m34 - m.m34,
m41 - m.m41, m42 - m.m42, m43 - m.m43, m44 - m.m44);
}
GMatrix44 GMatrix44::operator * (const GMatrix44& m) const
{
return GMatrix44(m.m11 * m11 + m.m21 * m12 + m.m31 * m13 + m.m41 * m14,
m.m12 * m11 + m.m22 * m12 + m.m32 * m13 + m.m42 * m14,
m.m13 * m11 + m.m23 * m12 + m.m33 * m13 + m.m43 * m14,
m.m14 * m11 + m.m24 * m12 + m.m34 * m13 + m.m44 * m14,
m.m11 * m21 + m.m21 * m22 + m.m31 * m23 + m.m41 * m24,
m.m12 * m21 + m.m22 * m22 + m.m32 * m23 + m.m42 * m24,
m.m13 * m21 + m.m23 * m22 + m.m33 * m23 + m.m43 * m24,
m.m14 * m21 + m.m24 * m22 + m.m34 * m23 + m.m44 * m24,
m.m11 * m31 + m.m21 * m32 + m.m31 * m33 + m.m41 * m34,
m.m12 * m31 + m.m22 * m32 + m.m32 * m33 + m.m42 * m34,
m.m13 * m31 + m.m23 * m32 + m.m33 * m33 + m.m43 * m34,
m.m14 * m31 + m.m24 * m32 + m.m34 * m33 + m.m44 * m34,
m.m11 * m41 + m.m21 * m42 + m.m31 * m43 + m.m41 * m44,
m.m12 * m41 + m.m22 * m42 + m.m32 * m43 + m.m42 * m44,
m.m13 * m41 + m.m23 * m42 + m.m33 * m43 + m.m43 * m44,
m.m14 * m41 + m.m24 * m42 + m.m34 * m43 + m.m44 * m44);
}
GMatrix44 GMatrix44::operator * (const double scalar) const
{
return GMatrix44(m11 * scalar, m12 * scalar, m13 * scalar, m14 * scalar,
m21 * scalar, m22 * scalar, m23 * scalar, m24 * scalar,
m31 * scalar, m32 * scalar, m33 * scalar, m34 * scalar,
m41 * scalar, m42 * scalar, m43 * scalar, m44 * scalar);
}
bool GMatrix44::operator == (const GMatrix44& m) const
{
if(m11 != m.m11) return false;
if(m12 != m.m12) return false;
if(m13 != m.m13) return false;
if(m14 != m.m14) return false;
if(m21 != m.m21) return false;
if(m22 != m.m22) return false;
if(m23 != m.m23) return false;
if(m24 != m.m24) return false;
if(m31 != m.m31) return false;
if(m32 != m.m32) return false;
if(m33 != m.m33) return false;
if(m34 != m.m34) return false;
if(m41 != m.m41) return false;
if(m42 != m.m42) return false;
if(m43 != m.m43) return false;
return m44 == m.m44;
}
bool GMatrix44::operator != (const GMatrix44& m) const
{
if(m11 != m.m11) return true;
if(m12 != m.m12) return true;
if(m13 != m.m13) return true;
if(m14 != m.m14) return true;
if(m21 != m.m21) return true;
if(m22 != m.m22) return true;
if(m23 != m.m23) return true;
if(m24 != m.m24) return true;
if(m31 != m.m31) return true;
if(m32 != m.m32) return true;
if(m33 != m.m33) return true;
if(m34 != m.m34) return true;
if(m41 != m.m41) return true;
if(m42 != m.m42) return true;
if(m43 != m.m43) return true;
return m44 != m.m44;
}
//BEGIN static matrix creation methods
GMatrix44 GMatrix44::createIdentityMatrix()
{
return GMatrix44();
}
GMatrix44 GMatrix44::createScaleMatrix(double scalar)
{
return GMatrix44(scalar,0,0,0,
0,scalar,0,0,
0,0,scalar,0,
0,0,0,1);
}
GMatrix44 GMatrix44::createScaleMatrix(const GVector3& v)
{
return GMatrix44(v.x,0,0,0,
0,v.y,0,0,
0,0,v.z,0,
0,0,0,1);
}
GMatrix44 GMatrix44::createTranslationMatrix(const GVector3& v)
{
return GMatrix44(1,0,0,v.x,
0,1,0,v.y,
0,0,1,v.z,
0,0,0,1);
}
GMatrix44 GMatrix44::createRotationAroundX(double angle)
{
return GMatrix44(1,0,0,0,
0,cos(angle),-sin(angle),0,
0,sin(angle),cos(angle),0,
0,0,0,1);
}
GMatrix44 GMatrix44::createRotationAroundY(double angle)
{
return GMatrix44(cos(angle),0,sin(angle),0,
0,1,0,0,
-sin(angle),0,cos(angle),0,
0,0,0,1);
}
GMatrix44 GMatrix44::createRotationAroundZ(double angle)
{
return GMatrix44(cos(angle),-sin(angle),0,0,
sin(angle),cos(angle),0,0,
0,0,1,0,
0,0,0,1);
}
GMatrix44 GMatrix44::createRotationAroundAxis(const GVector3& v, double angle)
{
double sin_a = sin(angle);
double cos_a = cos(angle);
double one_minus_cos_a = 1-cos_a;
return GMatrix44(v.x*v.x+cos_a*(1-v.x*v.x), v.x*v.y*one_minus_cos_a-v.z*sin_a, v.z*v.x*one_minus_cos_a+v.y*sin_a, 0,
v.x*v.y*one_minus_cos_a+v.z*sin_a, v.y*v.y+cos_a*(1-v.y*v.y), v.y*v.z*one_minus_cos_a-v.x*sin_a, 0,
v.z*v.x*one_minus_cos_a-v.y*sin_a, v.y*v.z*one_minus_cos_a+v.x*sin_a, v.z*v.z+cos_a*(1-v.z*v.z), 0,
0, 0, 0, 1);
}
//END static matrix creation methods
}
syntax highlighted by Code2HTML, v. 0.9.1