ppsspp/Common/Math/lin/matrix4x4.h
Henrik Rydgård 9e41fafd0d Move math and some file and data conversion files out from native to Common.
Buildfixing

Move some file util files

Buildfix

Move KeyMap.cpp/h to Core where they belong better.

libretro buildfix attempt

Move ini_file

More buildfixes
2020-10-04 09:12:46 +02:00

121 lines
2.6 KiB
C++

#ifndef _MATH_LIN_MATRIX4X4_H
#define _MATH_LIN_MATRIX4X4_H
#include "Common/Math/lin/vec3.h"
namespace Lin {
class Quaternion;
class Matrix4x4 {
public:
union {
struct {
float xx, xy, xz, xw;
float yx, yy, yz, yw;
float zx, zy, zz, zw;
float wx, wy, wz, ww;
};
float m[16];
};
const Vec3 right() const {return Vec3(xx, xy, xz);}
const Vec3 up() const {return Vec3(yx, yy, yz);}
const Vec3 front() const {return Vec3(zx, zy, zz);}
const Vec3 move() const {return Vec3(wx, wy, wz);}
const float &operator[](int i) const {
return *(((const float *)this) + i);
}
float &operator[](int i) {
return *(((float *)this) + i);
}
Matrix4x4 operator * (const Matrix4x4 &other) const ;
void operator *= (const Matrix4x4 &other) {
*this = *this * other;
}
const float *getReadPtr() const {
return (const float *)this;
}
void empty() {
memset(this, 0, 16 * sizeof(float));
}
static Matrix4x4 identity() {
Matrix4x4 id;
id.setIdentity();
return id;
}
void setIdentity() {
empty();
xx = yy = zz = ww = 1.0f;
}
void setTranslation(const Vec3 &trans) {
setIdentity();
wx = trans.x;
wy = trans.y;
wz = trans.z;
}
Matrix4x4 transpose() const;
// Exact angles to avoid any artifacts.
void setRotationZ90() {
empty();
float c = 0.0f;
float s = 1.0f;
xx = c; xy = s;
yx = -s; yy = c;
zz = 1.0f;
ww = 1.0f;
}
void setRotationZ180() {
empty();
float c = -1.0f;
float s = 0.0f;
xx = c; xy = s;
yx = -s; yy = c;
zz = 1.0f;
ww = 1.0f;
}
void setRotationZ270() {
empty();
float c = 0.0f;
float s = -1.0f;
xx = c; xy = s;
yx = -s; yy = c;
zz = 1.0f;
ww = 1.0f;
}
void setOrtho(float left, float right, float bottom, float top, float near, float far);
void setOrthoD3D(float left, float right, float bottom, float top, float near, float far);
void setOrthoVulkan(float left, float right, float top, float bottom, float near, float far);
void setViewFrame(const Vec3 &pos, const Vec3 &right, const Vec3 &forward, const Vec3 &up);
void toText(char *buffer, int len) const;
void print() const;
void translateAndScale(const Vec3 &trans, const Vec3 &scale) {
xx = xx * scale.x + xw * trans.x;
xy = xy * scale.y + xw * trans.y;
xz = xz * scale.z + xw * trans.z;
yx = yx * scale.x + yw * trans.x;
yy = yy * scale.y + yw * trans.y;
yz = yz * scale.z + yw * trans.z;
zx = zx * scale.x + zw * trans.x;
zy = zy * scale.y + zw * trans.y;
zz = zz * scale.z + zw * trans.z;
wx = wx * scale.x + ww * trans.x;
wy = wy * scale.y + ww * trans.y;
wz = wz * scale.z + ww * trans.z;
}
};
} // namespace Lin
#endif // _MATH_LIN_MATRIX4X4_H