CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
hrydgard

CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!

GitHub Repository: hrydgard/ppsspp
Path: blob/master/Common/Math/lin/matrix4x4.cpp
Views: 1401
1
#include "Common/Math/lin/matrix4x4.h"
2
3
#include <cstdio>
4
5
#include "Common/Math/lin/vec3.h"
6
#include "Common/Math/fast/fast_matrix.h"
7
8
#ifdef _WIN32
9
#undef far
10
#undef near
11
#endif
12
13
// See http://code.google.com/p/oolongengine/source/browse/trunk/Oolong+Engine2/Math/neonmath/neon_matrix_impl.cpp?spec=svn143&r=143 when we need speed
14
// no wait. http://code.google.com/p/math-neon/
15
16
namespace Lin {
17
18
Matrix4x4 Matrix4x4::transpose() const
19
{
20
Matrix4x4 out;
21
out.xx = xx;out.xy = yx;out.xz = zx;out.xw = wx;
22
out.yx = xy;out.yy = yy;out.yz = zy;out.yw = wy;
23
out.zx = xz;out.zy = yz;out.zz = zz;out.zw = wz;
24
out.wx = xw;out.wy = yw;out.wz = zw;out.ww = ww;
25
return out;
26
}
27
28
Matrix4x4 Matrix4x4::operator * (const Matrix4x4 &other) const
29
{
30
Matrix4x4 temp;
31
fast_matrix_mul_4x4(temp.m, other.m, this->m);
32
return temp;
33
}
34
35
void Matrix4x4::setViewFrame(const Vec3 &pos, const Vec3 &vRight, const Vec3 &vView, const Vec3 &vUp) {
36
xx = vRight.x; xy = vUp.x; xz=vView.x; xw = 0.0f;
37
yx = vRight.y; yy = vUp.y; yz=vView.y; yw = 0.0f;
38
zx = vRight.z; zy = vUp.z; zz=vView.z; zw = 0.0f;
39
40
wx = -pos * vRight;
41
wy = -pos * vUp;
42
wz = -pos * vView;
43
ww = 1.0f;
44
}
45
46
void Matrix4x4::setOrtho(float left, float right, float bottom, float top, float near, float far) {
47
empty();
48
xx = 2.0f / (right - left);
49
yy = 2.0f / (top - bottom);
50
zz = 2.0f / (far - near);
51
wx = -(right + left) / (right - left);
52
wy = -(top + bottom) / (top - bottom);
53
wz = -(far + near) / (far - near);
54
ww = 1.0f;
55
}
56
57
void Matrix4x4::setOrthoD3D(float left, float right, float bottom, float top, float near, float far) {
58
empty();
59
xx = 2.0f / (right - left);
60
yy = 2.0f / (top - bottom);
61
zz = 1.0f / (far - near);
62
wx = -(right + left) / (right - left);
63
wy = -(top + bottom) / (top - bottom);
64
wz = -near / (far - near);
65
ww = 1.0f;
66
}
67
68
void Matrix4x4::setOrthoVulkan(float left, float right, float top, float bottom, float near, float far) {
69
empty();
70
xx = 2.0f / (right - left);
71
yy = 2.0f / (bottom - top);
72
zz = 1.0f / (far - near);
73
wx = -(right + left) / (right - left);
74
wy = -(top + bottom) / (bottom - top);
75
wz = -near / (far - near);
76
ww = 1.0f;
77
}
78
79
void Matrix4x4::toText(char *buffer, int len) const {
80
snprintf(buffer, len, "%f %f %f %f\n%f %f %f %f\n%f %f %f %f\n%f %f %f %f\n",
81
xx,xy,xz,xw,
82
yx,yy,yz,yw,
83
zx,zy,zz,zw,
84
wx,wy,wz,ww);
85
buffer[len - 1] = '\0';
86
}
87
88
void Matrix4x4::print() const {
89
char buffer[256];
90
toText(buffer, 256);
91
puts(buffer);
92
}
93
94
}
95
96