Files
2025-05-13 02:46:21 +03:00

274 lines
5.8 KiB
C++

#ifndef __MATRIX4X4__
#define __MATRIX4X4__
#include "Math.h"
namespace LifeMath
{
#undef INLINE
#ifdef _WIN32
#ifdef _MSC_VER
#define INLINE __forceinline
#define ALIGN_MATRIX __declspec(align(16))
#endif
#else
#define ALIGN_MATRIX
#ifdef __GNUC__
#define INLINE __attribute__((always_inline))
#endif
#endif
#ifndef INLINE
#define INLINE inline
#endif
typedef ALIGN_MATRIX struct Matrix4x4
{
public:
float M11;
float M12;
float M13;
float M14;
float M21;
float M22;
float M23;
float M24;
float M31;
float M32;
float M33;
float M34;
float M41;
float M42;
float M43;
float M44;
void setup(
float _m11, float _m12, float _m13, float _m14,
float _m21, float _m22, float _m23, float _m24,
float _m31, float _m32, float _m33, float _m34,
float _m41, float _m42, float _m43, float _m44)
{
M11 = _m11;
M12 = _m12;
M13 = _m13;
M14 = _m14;
M21 = _m21;
M22 = _m22;
M23 = _m23;
M24 = _m24;
M31 = _m31;
M32 = _m32;
M33 = _m33;
M34 = _m34;
M41 = _m41;
M42 = _m42;
M43 = _m43;
M44 = _m44;
}
INLINE Matrix4x4 operator *(const Matrix4x4& matrix2) const
{
Matrix4x4 matrix;
matrix.M11 = (((this->M11 * matrix2.M11) + (this->M12 * matrix2.M21)) + (this->M13 * matrix2.M31)) + (this->M14 * matrix2.M41);
matrix.M12 = (((this->M11 * matrix2.M12) + (this->M12 * matrix2.M22)) + (this->M13 * matrix2.M32)) + (this->M14 * matrix2.M42);
matrix.M13 = (((this->M11 * matrix2.M13) + (this->M12 * matrix2.M23)) + (this->M13 * matrix2.M33)) + (this->M14 * matrix2.M43);
matrix.M14 = (((this->M11 * matrix2.M14) + (this->M12 * matrix2.M24)) + (this->M13 * matrix2.M34)) + (this->M14 * matrix2.M44);
matrix.M21 = (((this->M21 * matrix2.M11) + (this->M22 * matrix2.M21)) + (this->M23 * matrix2.M31)) + (this->M24 * matrix2.M41);
matrix.M22 = (((this->M21 * matrix2.M12) + (this->M22 * matrix2.M22)) + (this->M23 * matrix2.M32)) + (this->M24 * matrix2.M42);
matrix.M23 = (((this->M21 * matrix2.M13) + (this->M22 * matrix2.M23)) + (this->M23 * matrix2.M33)) + (this->M24 * matrix2.M43);
matrix.M24 = (((this->M21 * matrix2.M14) + (this->M22 * matrix2.M24)) + (this->M23 * matrix2.M34)) + (this->M24 * matrix2.M44);
matrix.M31 = (((this->M31 * matrix2.M11) + (this->M32 * matrix2.M21)) + (this->M33 * matrix2.M31)) + (this->M34 * matrix2.M41);
matrix.M32 = (((this->M31 * matrix2.M12) + (this->M32 * matrix2.M22)) + (this->M33 * matrix2.M32)) + (this->M34 * matrix2.M42);
matrix.M33 = (((this->M31 * matrix2.M13) + (this->M32 * matrix2.M23)) + (this->M33 * matrix2.M33)) + (this->M34 * matrix2.M43);
matrix.M34 = (((this->M31 * matrix2.M14) + (this->M32 * matrix2.M24)) + (this->M33 * matrix2.M34)) + (this->M34 * matrix2.M44);
matrix.M41 = (((this->M41 * matrix2.M11) + (this->M42 * matrix2.M21)) + (this->M43 * matrix2.M31)) + (this->M44 * matrix2.M41);
matrix.M42 = (((this->M41 * matrix2.M12) + (this->M42 * matrix2.M22)) + (this->M43 * matrix2.M32)) + (this->M44 * matrix2.M42);
matrix.M43 = (((this->M41 * matrix2.M13) + (this->M42 * matrix2.M23)) + (this->M43 * matrix2.M33)) + (this->M44 * matrix2.M43);
matrix.M44 = (((this->M41 * matrix2.M14) + (this->M42 * matrix2.M24)) + (this->M43 * matrix2.M34)) + (this->M44 * matrix2.M44);
return matrix;
}
/* public MatrixBasis Basis
{
get
{
MatrixBasis basis = new MatrixBasis();
basis.M11 = this.M11;
basis.M12 = this.M12;
basis.M13 = this.M13;
basis.M21 = this.M21;
basis.M22 = this.M22;
basis.M23 = this.M23;
basis.M31 = this.M31;
basis.M32 = this.M32;
basis.M33 = this.M33;
return basis;
}
set
{
this.M11 = value.M11;
this.M12 = value.M12;
this.M13 = value.M13;
this.M21 = value.M21;
this.M22 = value.M22;
this.M23 = value.M23;
this.M31 = value.M31;
this.M32 = value.M32;
this.M33 = value.M33;
}
}*/
/*
#region Decomposition
public Vec3f Up
{
get
{
Vec3f vector;
vector.X = this.M21;
vector.Y = this.M22;
vector.Z = this.M23;
return vector;
}
set
{
this.M21 = value.X;
this.M22 = value.Y;
this.M23 = value.Z;
}
}
public Vec3f Down
{
get
{
Vec3f vector;
vector.X = -this.M21;
vector.Y = -this.M22;
vector.Z = -this.M23;
return vector;
}
set
{
this.M21 = -value.X;
this.M22 = -value.Y;
this.M23 = -value.Z;
}
}
public Vec3f Right
{
get
{
Vec3f vector;
vector.X = this.M11;
vector.Y = this.M12;
vector.Z = this.M13;
return vector;
}
set
{
this.M11 = value.X;
this.M12 = value.Y;
this.M13 = value.Z;
}
}
public Vec3f Left
{
get
{
Vec3f vector;
vector.X = -this.M11;
vector.Y = -this.M12;
vector.Z = -this.M13;
return vector;
}
set
{
this.M11 = -value.X;
this.M12 = -value.Y;
this.M13 = -value.Z;
}
}
public Vec3f Forward
{
get
{
Vec3f vector;
vector.X = -this.M31;
vector.Y = -this.M32;
vector.Z = -this.M33;
return vector;
}
set
{
this.M31 = -value.X;
this.M32 = -value.Y;
this.M33 = -value.Z;
}
}
public Vec3f Backward
{
get
{
Vec3f vector;
vector.X = this.M31;
vector.Y = this.M32;
vector.Z = this.M33;
return vector;
}
set
{
this.M31 = value.X;
this.M32 = value.Y;
this.M33 = value.Z;
}
}
public Vec3f Position
{
get
{
Vec3f vector;
vector.X = this.M41;
vector.Y = this.M42;
vector.Z = this.M43;
return vector;
}
set
{
this.M41 = value.X;
this.M42 = value.Y;
this.M43 = value.Z;
}
}
public void Decompose(out Vec3f scale, out CQuaternion rotation, out Vec3f translation)
{
MatrixBasis b = this.Basis;
scale = b.Scaling;
translation.X = this.M41;
translation.Y = this.M42;
translation.Z = this.M43;
b.Scaling = new Vec3f(1, 1, 1);
rotation = CQuaternion.RotationBasis(b);
}
#endregion*/
} Matrix4x4, *PMatrix4x4, **LPMatrix4x4;
typedef Matrix4x4 float4x4;
}
#endif