2019-08-23 11:56:54 -07:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "Vector.h"
|
|
|
|
|
|
|
|
NS_BF_BEGIN;
|
|
|
|
|
|
|
|
class Matrix4
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
union
|
|
|
|
{
|
|
|
|
float mMat[4][4];
|
|
|
|
float mMatFlat[16];
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
float m00;
|
|
|
|
float m01;
|
|
|
|
float m02;
|
|
|
|
float m03;
|
|
|
|
float m10;
|
|
|
|
float m11;
|
|
|
|
float m12;
|
|
|
|
float m13;
|
|
|
|
float m20;
|
|
|
|
float m21;
|
|
|
|
float m22;
|
|
|
|
float m23;
|
|
|
|
float m30;
|
|
|
|
float m31;
|
|
|
|
float m32;
|
|
|
|
float m33;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
public:
|
|
|
|
static Matrix4 sIdentity;
|
|
|
|
|
|
|
|
public:
|
|
|
|
inline Matrix4()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
inline Matrix4(
|
|
|
|
float m00, float m01, float m02, float m03,
|
|
|
|
float m10, float m11, float m12, float m13,
|
|
|
|
float m20, float m21, float m22, float m23,
|
|
|
|
float m30, float m31, float m32, float m33)
|
|
|
|
{
|
|
|
|
this->m00 = m00;
|
|
|
|
this->m01 = m01;
|
|
|
|
this->m02 = m02;
|
|
|
|
this->m03 = m03;
|
|
|
|
this->m10 = m10;
|
|
|
|
this->m11 = m11;
|
|
|
|
this->m12 = m12;
|
|
|
|
this->m13 = m13;
|
|
|
|
this->m20 = m20;
|
|
|
|
this->m21 = m21;
|
|
|
|
this->m22 = m22;
|
|
|
|
this->m23 = m23;
|
|
|
|
this->m30 = m30;
|
|
|
|
this->m31 = m31;
|
|
|
|
this->m32 = m32;
|
|
|
|
this->m33 = m33;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Matrix4 Multiply(const Matrix4 &m1, const Matrix4 &m2)
|
|
|
|
{
|
|
|
|
Matrix4 r;
|
|
|
|
r.m00 = m1.m00 * m2.m00 + m1.m01 * m2.m10 + m1.m02 * m2.m20 + m1.m03 * m2.m30;
|
|
|
|
r.m01 = m1.m00 * m2.m01 + m1.m01 * m2.m11 + m1.m02 * m2.m21 + m1.m03 * m2.m31;
|
|
|
|
r.m02 = m1.m00 * m2.m02 + m1.m01 * m2.m12 + m1.m02 * m2.m22 + m1.m03 * m2.m32;
|
|
|
|
r.m03 = m1.m00 * m2.m03 + m1.m01 * m2.m13 + m1.m02 * m2.m23 + m1.m03 * m2.m33;
|
|
|
|
|
|
|
|
r.m10 = m1.m10 * m2.m00 + m1.m11 * m2.m10 + m1.m12 * m2.m20 + m1.m13 * m2.m30;
|
|
|
|
r.m11 = m1.m10 * m2.m01 + m1.m11 * m2.m11 + m1.m12 * m2.m21 + m1.m13 * m2.m31;
|
|
|
|
r.m12 = m1.m10 * m2.m02 + m1.m11 * m2.m12 + m1.m12 * m2.m22 + m1.m13 * m2.m32;
|
|
|
|
r.m13 = m1.m10 * m2.m03 + m1.m11 * m2.m13 + m1.m12 * m2.m23 + m1.m13 * m2.m33;
|
|
|
|
|
|
|
|
r.m20 = m1.m20 * m2.m00 + m1.m21 * m2.m10 + m1.m22 * m2.m20 + m1.m23 * m2.m30;
|
|
|
|
r.m21 = m1.m20 * m2.m01 + m1.m21 * m2.m11 + m1.m22 * m2.m21 + m1.m23 * m2.m31;
|
|
|
|
r.m22 = m1.m20 * m2.m02 + m1.m21 * m2.m12 + m1.m22 * m2.m22 + m1.m23 * m2.m32;
|
|
|
|
r.m23 = m1.m20 * m2.m03 + m1.m21 * m2.m13 + m1.m22 * m2.m23 + m1.m23 * m2.m33;
|
|
|
|
|
|
|
|
r.m30 = m1.m30 * m2.m00 + m1.m31 * m2.m10 + m1.m32 * m2.m20 + m1.m33 * m2.m30;
|
|
|
|
r.m31 = m1.m30 * m2.m01 + m1.m31 * m2.m11 + m1.m32 * m2.m21 + m1.m33 * m2.m31;
|
|
|
|
r.m32 = m1.m30 * m2.m02 + m1.m31 * m2.m12 + m1.m32 * m2.m22 + m1.m33 * m2.m32;
|
|
|
|
r.m33 = m1.m30 * m2.m03 + m1.m31 * m2.m13 + m1.m32 * m2.m23 + m1.m33 * m2.m33;
|
|
|
|
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Matrix4 Transpose(const Matrix4 &m)
|
|
|
|
{
|
|
|
|
return Matrix4(
|
|
|
|
m.m00, m.m10, m.m20, m.m30,
|
|
|
|
m.m01, m.m11, m.m21, m.m31,
|
|
|
|
m.m02, m.m12, m.m22, m.m32,
|
|
|
|
m.m03, m.m13, m.m23, m.m33);
|
|
|
|
}
|
|
|
|
|
|
|
|
static Matrix4 CreateTranslation(float x, float y, float z)
|
|
|
|
{
|
|
|
|
return Matrix4(
|
|
|
|
1, 0, 0, x,
|
|
|
|
0, 1, 0, y,
|
|
|
|
0, 0, 1, z,
|
|
|
|
0, 0, 0, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
static Matrix4 CreateTransform(const Vector3& position, const Vector3& scale, const Quaternion& orientation);
|
2021-05-25 10:57:22 -04:00
|
|
|
|
|
|
|
static float Determinant(float m11, float m12, float m13,
|
|
|
|
float m21, float m22, float m23,
|
|
|
|
float m31, float m32, float m33)
|
|
|
|
{
|
|
|
|
return m11 * (m22 * m33 - m32 * m23) -
|
|
|
|
m21 * (m12 * m33 - m32 * m13) +
|
|
|
|
m31 * (m12 * m23 - m22 * m13);
|
|
|
|
}
|
2019-08-23 11:56:54 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
NS_BF_END;
|