00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef __CSIBCMatrix_H__
00016 #define __CSIBCMatrix_H__
00017
00018
00019
00020
00021 #include <SIBCVector.h>
00022
00023 #ifdef _PSX2
00024 #include <libvu0.h>
00025 #endif
00026
00027
00028
00029
00030
00031
00032
00033
00034
00036
00047 class XSICOREEXPORT CSIBCMatrix4x4
00048 {
00049 public:
00050
00054 CSIBCMatrix4x4();
00055
00060 CSIBCMatrix4x4( const CSIBCMatrix4x4 & i_Matrix);
00061
00069 CSIBCMatrix4x4( SI_Float * i_pMatrix);
00070
00071 ~CSIBCMatrix4x4();
00072
00073
00074
00083 SI_Error Set( const CSIBCMatrix4x4 & i_Matrix);
00084
00115 SI_Error Set( const SI_Float * i_pMatrix);
00116
00129 SI_Error Set( const SI_Byte i_bIndex, SI_Float i_fValue);
00130
00144 SI_Error Set( const SI_Byte i_Column,
00145 const SI_Byte i_Row,
00146 const SI_Float i_fValue);
00147
00157 void SetToScale( const CSIBCVector3D & i_vScale);
00158
00168 void SetToRotation( const CSIBCVector3D & i_vEuler);
00169
00175 void SetToRotation( const SI_Float angl, const CSIBCVector3D &axis );
00176
00181 void SetToTranslation( const CSIBCVector3D & i_vTrans);
00182
00219 void SetTransforms( const CSIBCVector3D &scale,
00220 const CSIBCVector3D &rot,
00221 const CSIBCVector3D &trans );
00222
00223
00249 void SetScaling( const CSIBCVector3D & i_vScaling);
00250
00285 void SetRotation( const CSIBCVector3D & i_vRot);
00286
00298 void SetRotation( const CSIBCMatrix4x4 & i_mMatrix);
00299
00314 void SetOrientation( const CSIBCVector3D &x_axis,
00315 const CSIBCVector3D &y_axis,
00316 const CSIBCVector3D &z_axis );
00317
00326 void SetTranslation( const CSIBCVector3D & i_vTrans);
00327
00328
00329
00341 SI_Error Get( SI_Float * o_pMatrix) const;
00342
00355 SI_Error Get( CSIBCMatrix4x4 & o_mMatrix) const;
00356
00362 SI_Float Get( const SI_Byte i_bIndex) const;
00363
00364
00371 SI_Float Get( const SI_Byte i_Column, const SI_Byte i_Row) const;
00372
00377 void GetScaling( CSIBCVector3D & o_vScale) const;
00378
00383 void GetRotation( CSIBCVector3D & o_vRot) const ;
00384
00392 void GetOrientation( CSIBCVector3D &x_axis,
00393 CSIBCVector3D &y_axis,
00394 CSIBCVector3D &z_axis ) const ;
00395
00401 void GetTranslation( CSIBCVector3D & o_vTrans) const;
00402
00415 void GetTransforms( CSIBCVector3D &scale,
00416 CSIBCVector3D &rot,
00417 CSIBCVector3D &trans );
00418
00422 SI_Bool IsIdentity();
00423
00424
00425
00433 SI_Bool GetInverse( CSIBCMatrix4x4 & o_mMatrix);
00434
00438 CSIBCMatrix4x4& Normalize();
00439
00444 CSIBCMatrix4x4& SetNull();
00445
00451 CSIBCMatrix4x4& SetIdentity();
00452
00456 CSIBCMatrix4x4& Transpose();
00457
00466 void ColumnMajor( SI_Float * o_pMatrix);
00467
00473 void RowMajor( SI_Float * );
00474
00485 SI_Float *Raw();
00486
00493 SI_Matrix *GetSIMatrix() { return &m_Matrix; }
00494
00505 void LookAt( const CSIBCVector3D &pos,
00506 const CSIBCVector3D &target,
00507 const CSIBCVector3D &up,
00508 const SI_Float roll );
00509
00510
00524 void Ortho( const SI_Float left,
00525 const SI_Float right,
00526 const SI_Float top,
00527 const SI_Float bottom,
00528 const SI_Float nearPlane,
00529 const SI_Float farPlane);
00530
00543 void Perspective( const SI_Float nearPlane,
00544 const SI_Float farPlane,
00545 const SI_Float fov,
00546 const SI_Float aspect );
00547
00560 void PerspectiveAlt( const SI_Float nearPlane,
00561 const SI_Float farPlane,
00562 const SI_Float fov,
00563 const SI_Float aspect );
00564
00576 SI_Bool AlignAxes( CSIBCVector3D *x_vec,
00577 CSIBCVector3D *xy_vec );
00578
00588 SI_Bool AlignRoll( SI_Float in_Roll,
00589 CSIBCVector3D *in_pVector);
00590
00600 CSIBCMatrix4x4 &Multiply( CSIBCMatrix4x4 & i_mMatrix);
00601
00617 SI_Error Multiply( CSIBCMatrix4x4 & i_mMatrix,
00618 CSIBCMatrix4x4 &result);
00619
00630 CSIBCMatrix4x4 &Multiply4x3( const CSIBCMatrix4x4 & i_mMatrix);
00631
00647 SI_Error Multiply4x3( const CSIBCMatrix4x4 & i_mMatrix,
00648 CSIBCMatrix4x4 &result) const;
00649
00662 CSIBCVector4D Multiply( const CSIBCVector2D & i_vVector) const;
00663
00677 CSIBCVector4D Multiply( const CSIBCVector3D & i_vVector);
00678
00689 CSIBCVector4D Multiply( const CSIBCVector4D & i_vVector);
00690
00704 void Multiply( CSIBCVector3D &i_vResult, const CSIBCVector3D &i_vVector );
00705
00719 void MultiplyLeft( CSIBCVector3D & i_vResult, const CSIBCVector3D &i_vVector ) const;
00720
00721 #ifdef _PSX2
00722
00733 void CacheMatrix();
00734
00748 void CacheMultiply( CSIBCVector3D & i_vResult, CSIBCVector3D & i_vVector);
00749
00762 void CacheMultiply( CSIBCVector4D & i_vResult, const CSIBCVector4D & i_vVector);
00763
00777 void CacheMultiplyScale( CSIBCVector3D & i_vResult, CSIBCVector3D & i_vVector, float i_fScale );
00778
00794 void CacheMultiplyScaleAdd( CSIBCVector3D & io_vResult, CSIBCVector3D & i_vVector, float i_fScale );
00795 #endif
00796
00797
00798
00809 CSIBCMatrix4x4 operator*(CSIBCMatrix4x4 & i_mMatrix);
00810
00811
00824 CSIBCVector4D operator*(CSIBCVector2D & i_vVector);
00825
00839 CSIBCVector4D operator*(CSIBCVector3D & i_vVector);
00840
00852 CSIBCVector4D operator*(CSIBCVector4D & i_vVector);
00853
00860 CSIBCMatrix4x4& operator = (const CSIBCMatrix4x4 & i_mMatrix);
00861
00869 CSIBCMatrix4x4& operator +=( const CSIBCMatrix4x4 & i_mMatrix);
00870
00874 SI_Error Dump();
00875
00879 SI_Error SelfTest();
00880
00881 private:
00882
00883 #ifdef _PSX2
00884 sceVu0FMATRIX m_Matrix;
00885 float *row1;
00886 float *row2;
00887 float *row3;
00888 float *row4;
00889 #else
00890 SI_Matrix m_Matrix;
00891 #endif
00892
00893 };
00894
00895 #endif
00896