Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MorsGames
GitHub Repository: MorsGames/sm64plus
Path: blob/master/lib/src/guPerspectiveF.c
7857 views
1
#include "libultra_internal.h"
2
3
void guPerspectiveF(float mf[4][4], u16 *perspNorm, float fovy, float aspect, float near, float far,
4
float scale) {
5
float yscale;
6
int row;
7
int col;
8
guMtxIdentF(mf);
9
fovy *= GU_PI / 180.0;
10
yscale = cosf(fovy / 2) / sinf(fovy / 2);
11
mf[0][0] = yscale / aspect;
12
mf[1][1] = yscale;
13
mf[2][2] = (near + far) / (near - far);
14
mf[2][3] = -1;
15
mf[3][2] = 2 * near * far / (near - far);
16
mf[3][3] = 0.0f;
17
for (row = 0; row < 4; row++) {
18
for (col = 0; col < 4; col++) {
19
mf[row][col] *= scale;
20
}
21
}
22
if (perspNorm != NULL) {
23
if (near + far <= 2.0) {
24
*perspNorm = 65535;
25
} else {
26
*perspNorm = (double) (1 << 17) / (near + far);
27
if (*perspNorm <= 0) {
28
*perspNorm = 1;
29
}
30
}
31
}
32
}
33
34
void guPerspective(Mtx *m, u16 *perspNorm, float fovy, float aspect, float near, float far,
35
float scale) {
36
float mat[4][4];
37
guPerspectiveF(mat, perspNorm, fovy, aspect, near, far, scale);
38
guMtxF2L(mat, m);
39
}
40
41