Add CMatrix4f, nearly matches

Former-commit-id: dcb2ebb2fd
This commit is contained in:
Phillip Stephens 2023-01-10 15:03:38 -08:00
parent 9488e643e5
commit 94dec52cae
3 changed files with 62 additions and 2 deletions

View File

@ -563,7 +563,7 @@ LIBS = [
["Kyoto/Graphics/DolphinCTexture", False], ["Kyoto/Graphics/DolphinCTexture", False],
["Kyoto/Math/CloseEnough", True], ["Kyoto/Math/CloseEnough", True],
"Kyoto/Math/CMatrix3f", "Kyoto/Math/CMatrix3f",
"Kyoto/Math/CMatrix4f", ["Kyoto/Math/CMatrix4f", False],
"Kyoto/Math/CQuaternion", "Kyoto/Math/CQuaternion",
["Kyoto/CRandom16", True], ["Kyoto/CRandom16", True],
"Kyoto/Math/CTransform4f", "Kyoto/Math/CTransform4f",

View File

@ -3,14 +3,22 @@
#include "types.h" #include "types.h"
#include "Kyoto/Math/CVector3f.hpp"
class CMatrix4f { class CMatrix4f {
public: public:
CMatrix4f(float, float, float, float, float, float, float, float, float, float, float, float, CMatrix4f(float, float, float, float, float, float, float, float, float, float, float, float,
float, float, float, float); float, float, float, float);
CVector3f MultiplyOneOverW(const CVector3f& vec) const; CVector3f operator*(const CVector3f& vec) const;
CVector3f MultiplyOneOverW(const CVector3f& vec) const;
float MultiplyGetW(const CVector3f& vec) const;
static const CMatrix4f& Identity() { return sIdentity; }
private: private:
static const CMatrix4f sIdentity;
float m00; float m00;
float m01; float m01;
float m02; float m02;

View File

@ -0,0 +1,52 @@
#include "Kyoto/Math/CMatrix4f.hpp"
const CMatrix4f CMatrix4f::sIdentity =
CMatrix4f(1.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.f);
CMatrix4f::CMatrix4f(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)
: m00(m00)
, m01(m01)
, m02(m02)
, m03(m03)
, m10(m10)
, m11(m11)
, m12(m12)
, m13(m13)
, m20(m20)
, m21(m21)
, m22(m22)
, m23(m23)
, m30(m30)
, m31(m31)
, m32(m32)
, m33(m33) {}
CVector3f CMatrix4f::operator*(const CVector3f& vec) const {
const float vecX = vec.GetX();
const float vecY = vec.GetY();
const float vecZ = vec.GetZ();
const float x = (vecX * m00) + (vecY * m01) + (vecZ * m02) + m03;
const float y = (vecX * m10) + (vecY * m11) + (vecZ * m12) + m13;
const float z = (vecX * m20) + (vecY * m21) + (vecZ * m22) + m23;
return CVector3f(x, y, z);
}
CVector3f CMatrix4f::MultiplyOneOverW(const CVector3f& vec) const {
const float vecX = vec.GetX();
const float vecY = vec.GetY();
const float vecZ = vec.GetZ();
const float w = 1.f / ((vecX * m30) + (vecY * m31) + (vecZ * m32) + m33);
const float x = (vecX * m00) + (vecY * m01) + (vecZ * m02) + m03;
const float y = (vecX * m10) + (vecY * m11) + (vecZ * m12) + m13;
const float z = (vecX * m20) + (vecY * m21) + (vecZ * m22) + m23;
return CVector3f(x * w, y * w, z * w);
}
float CMatrix4f::MultiplyGetW(const CVector3f& vec) const {
const float vecX = vec.GetX();
const float vecY = vec.GetY();
const float vecZ = vec.GetZ();
return ((vecX * m30) + (vecY * m31) + (vecZ * m32) + m33);
}