daedalus/Source/Math/Matrix4x4.h
2022-06-19 13:55:08 +10:00

71 lines
1.7 KiB
C++

#ifndef MATH_MATRIX4X4_H_
#define MATH_MATRIX4X4_H_
#include "Vector3.h"
class v4;
class alignas(DATA_ALIGN) Matrix4x4
{
public:
Matrix4x4()
{
}
Matrix4x4( float _11, float _12, float _13, float _14,
float _21, float _22, float _23, float _24,
float _31, float _32, float _33, float _34,
float _41, float _42, float _43, float _44 )
: m11( _11 ), m12( _12 ), m13( _13 ), m14( _14 ),
m21( _21 ), m22( _22 ), m23( _23 ), m24( _24 ),
m31( _31 ), m32( _32 ), m33( _33 ), m34( _34 ),
m41( _41 ), m42( _42 ), m43( _43 ), m44( _44 )
{
}
Matrix4x4 operator*( const Matrix4x4 & rhs ) const;
Matrix4x4 & SetIdentity();
Matrix4x4 & SetScaling( float scale );
Matrix4x4 & SetRotateX( float angle );
Matrix4x4 & SetRotateY( float angle );
Matrix4x4 & SetRotateZ( float angle );
Matrix4x4 & SetTranslate( const v3 & vec );
//Matrix4x4 Transpose() const;
//Matrix4x4 Inverse() const;
v3 TransformCoord( const v3 & vec ) const;
v3 TransformNormal( const v3 & vec ) const;
v3 Transform( const v3 & vec ) const;
v4 Transform( const v4 & vec ) const;
// void print() const;
public:
union
{
struct
{
float m11, m12, m13, m14;
float m21, m22, m23, m24;
float m31, m32, m33, m34;
float m41, m42, m43, m44;
};
// std::array<float, std::array< float, 4> 4> m;
float m[ 4 ][ 4 ];
float mRaw[ 16 ];
};
};
DAEDALUS_STATIC_ASSERT( sizeof( Matrix4x4 ) == 16*4 );
extern const Matrix4x4 gMatrixIdentity;
void MatrixMultiplyUnaligned(Matrix4x4 * m_out, const Matrix4x4 *mat_a, const Matrix4x4 *mat_b);
void MatrixMultiplyAligned(Matrix4x4 * m_out, const Matrix4x4 *mat_a, const Matrix4x4 *mat_b);
#endif // MATH_MATRIX4X4_H_