00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __MATRIX4_H
00023 #define __MATRIX4_H
00024
00025 #include<yafray_config.h>
00026
00027 #include<iostream>
00028
00029 #include "vector3d.h"
00030
00031 __BEGIN_YAFRAY
00032
00033 class YAFRAYCORE_EXPORT matrix4x4_t
00034 {
00035 public:
00036 matrix4x4_t() {};
00037 matrix4x4_t(const PFLOAT init);
00038 matrix4x4_t(const matrix4x4_t & source);
00039 matrix4x4_t(const float source[4][4]);
00040 matrix4x4_t(const double source[4][4]);
00041 ~matrix4x4_t() {};
00044 matrix4x4_t & inverse();
00045 matrix4x4_t & transpose();
00046 void identity();
00047 void translate(PFLOAT dx,PFLOAT dy,PFLOAT dz);
00048 void rotateX(PFLOAT degrees);
00049 void rotateY(PFLOAT degrees);
00050 void rotateZ(PFLOAT degrees);
00051 void scale(PFLOAT sx, PFLOAT sy, PFLOAT sz);
00052 int invalid() const { return _invalid; }
00053 const PFLOAT * operator [] (int i) const { return matrix[i]; }
00054 PFLOAT * operator [] (int i) { return matrix[i]; }
00055
00056
00057
00058 void setRow(int i, const vector3d_t &v, PFLOAT e3) { matrix[i][0]=v.x; matrix[i][1]=v.y; matrix[i][2]=v.z; matrix[i][3]=e3; }
00059 void setColumn(int i, const vector3d_t &v, PFLOAT e3) { matrix[0][i]=v.x; matrix[1][i]=v.y; matrix[2][i]=v.z; matrix[3][i]=e3; }
00060
00061 protected:
00062
00063 PFLOAT matrix[4][4];
00064 int _invalid;
00065 };
00066
00067 inline matrix4x4_t operator * (const matrix4x4_t &a,const matrix4x4_t &b)
00068 {
00069 matrix4x4_t aux;
00070
00071 for(int i=0;i<4;i++)
00072 for(int k=0;k<4;k++)
00073 {
00074 aux[i][k]=0;
00075 for(int j=0;j<4;j++)
00076 aux[i][k]+=a[i][j]*b[j][k];
00077 }
00078 return aux;
00079 }
00080
00081 inline vector3d_t operator * (const matrix4x4_t &a, const vector3d_t &b)
00082 {
00083 return vector3d_t(a[0][0]*b.x+a[0][1]*b.y+a[0][2]*b.z,
00084 a[1][0]*b.x+a[1][1]*b.y+a[1][2]*b.z,
00085 a[2][0]*b.x+a[2][1]*b.y+a[2][2]*b.z);
00086 }
00087
00088 inline point3d_t operator * (const matrix4x4_t &a, const point3d_t &b)
00089 {
00090 return point3d_t(a[0][0]*b.x+a[0][1]*b.y+a[0][2]*b.z+a[0][3],
00091 a[1][0]*b.x+a[1][1]*b.y+a[1][2]*b.z+a[1][3],
00092 a[2][0]*b.x+a[2][1]*b.y+a[2][2]*b.z+a[2][3]);
00093 }
00094
00095 YAFRAYCORE_EXPORT std::ostream & operator << (std::ostream &out,matrix4x4_t &m);
00096
00097 __END_YAFRAY
00098
00099 #endif