mirror of
https://github.com/hrydgard/ppsspp.git
synced 2024-12-03 11:11:25 +00:00
9e41fafd0d
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
121 lines
2.6 KiB
C++
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
|
|
|