perfect_dark/src/lib/mtx.c

709 lines
16 KiB
C

#include <ultra64.h>
#include "constants.h"
#include "game/atan2f.h"
#include "game/padhalllv.h"
#include "bss.h"
#include "lib/mtx.h"
#include "data.h"
#include "types.h"
void mtx00016110(f32 mtx1[3][3], f32 mtx2[3][3])
{
f32 mtx3[3][3];
mtx00016140(mtx1, mtx2, mtx3);
mtx3Copy(mtx3, mtx2);
}
void mtx00016140(f32 mtx1[3][3], f32 mtx2[3][3], f32 dst[3][3])
{
s32 i;
s32 j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
dst[j][i] = mtx1[0][i] * mtx2[j][0] + mtx1[1][i] * mtx2[j][1] + mtx1[2][i] * mtx2[j][2];
}
}
}
void mtx000161b0(f32 mtx[3][3], f32 src[3], f32 dest[3])
{
s32 i;
for (i = 0; i < 3; i++) {
dest[i] = mtx[0][i] * src[0] + mtx[1][i] * src[1] + mtx[2][i] * src[2];
}
}
void mtx00016208(f32 mtx[3][3], struct coord *coord)
{
f32 tmp[3];
mtx000161b0(mtx, (f32 *)coord, tmp);
coord->x = tmp[0];
coord->y = tmp[1];
coord->z = tmp[2];
}
void mtx4LoadYRotationWithTranslation(struct coord *coord, f32 angle, Mtxf *mtx)
{
f32 cos = cosf(angle);
f32 sin = sinf(angle);
mtx->m[0][0] = cos;
mtx->m[0][1] = 0;
mtx->m[0][2] = -sin;
mtx->m[0][3] = 0;
mtx->m[1][0] = 0;
mtx->m[1][1] = 1;
mtx->m[1][2] = 0;
mtx->m[1][3] = 0;
mtx->m[2][0] = sin;
mtx->m[2][1] = 0;
mtx->m[2][2] = cos;
mtx->m[2][3] = 0;
mtx->m[3][0] = coord->x;
mtx->m[3][1] = coord->y;
mtx->m[3][2] = coord->z;
mtx->m[3][3] = 1;
}
#if VERSION < VERSION_NTSC_1_0
void mtx4LoadXRotationWithTranslation(struct coord *coord, f32 angle, Mtxf *mtx)
{
f32 cos = cosf(angle);
f32 sin = sinf(angle);
mtx->m[0][0] = 1;
mtx->m[0][1] = 0;
mtx->m[0][2] = 0;
mtx->m[0][3] = 0;
mtx->m[1][0] = 0;
mtx->m[1][1] = cos;
mtx->m[1][2] = sin;
mtx->m[1][3] = 0;
mtx->m[2][0] = 0;
mtx->m[2][1] = -sin;
mtx->m[2][2] = cos;
mtx->m[2][3] = 0;
mtx->m[3][0] = coord->x;
mtx->m[3][1] = coord->y;
mtx->m[3][2] = coord->z;
mtx->m[3][3] = 1;
}
#endif
void mtx4LoadXRotation(f32 angle, Mtxf *mtx)
{
f32 cos = cosf(angle);
f32 sin = sinf(angle);
mtx->m[0][0] = 1;
mtx->m[0][1] = 0;
mtx->m[0][2] = 0;
mtx->m[0][3] = 0;
mtx->m[1][0] = 0;
mtx->m[1][1] = cos;
mtx->m[1][2] = sin;
mtx->m[1][3] = 0;
mtx->m[2][0] = 0;
mtx->m[2][1] = -sin;
mtx->m[2][2] = cos;
mtx->m[2][3] = 0;
mtx->m[3][0] = 0;
mtx->m[3][1] = 0;
mtx->m[3][2] = 0;
mtx->m[3][3] = 1;
}
void mtx4LoadYRotation(f32 angle, Mtxf *mtx)
{
f32 cos = cosf(angle);
f32 sin = sinf(angle);
mtx->m[0][0] = cos;
mtx->m[0][1] = 0;
mtx->m[0][2] = -sin;
mtx->m[0][3] = 0;
mtx->m[1][0] = 0;
mtx->m[1][1] = 1;
mtx->m[1][2] = 0;
mtx->m[1][3] = 0;
mtx->m[2][0] = sin;
mtx->m[2][1] = 0;
mtx->m[2][2] = cos;
mtx->m[2][3] = 0;
mtx->m[3][0] = 0;
mtx->m[3][1] = 0;
mtx->m[3][2] = 0;
mtx->m[3][3] = 1;
}
void mtx4LoadZRotation(f32 angle, Mtxf *mtx)
{
f32 cos = cosf(angle);
f32 sin = sinf(angle);
mtx->m[0][0] = cos;
mtx->m[0][1] = sin;
mtx->m[0][2] = 0;
mtx->m[0][3] = 0;
mtx->m[1][0] = -sin;
mtx->m[1][1] = cos;
mtx->m[1][2] = 0;
mtx->m[1][3] = 0;
mtx->m[2][0] = 0;
mtx->m[2][1] = 0;
mtx->m[2][2] = 1;
mtx->m[2][3] = 0;
mtx->m[3][0] = 0;
mtx->m[3][1] = 0;
mtx->m[3][2] = 0;
mtx->m[3][3] = 1;
}
void mtx4LoadRotation(struct coord *src, Mtxf *dest)
{
f32 xcos = cosf(src->x);
f32 xsin = sinf(src->x);
f32 ycos = cosf(src->y);
f32 ysin = sinf(src->y);
f32 zcos = cosf(src->z);
f32 zsin = sinf(src->z);
f32 a = xsin * zsin;
f32 b = xcos * zsin;
f32 c = xsin * zcos;
f32 d = xcos * zcos;
dest->m[0][0] = ycos * zcos;
dest->m[0][1] = ycos * zsin;
dest->m[0][2] = -ysin;
dest->m[0][3] = 0;
dest->m[1][0] = c * ysin - xcos * zsin;
dest->m[1][1] = a * ysin + xcos * zcos;
dest->m[1][2] = xsin * ycos;
dest->m[1][3] = 0;
dest->m[2][0] = d * ysin + xsin * zsin;
dest->m[2][1] = b * ysin - xsin * zcos;
dest->m[2][2] = xcos * ycos;
dest->m[2][3] = 0;
dest->m[3][0] = 0;
dest->m[3][1] = 0;
dest->m[3][2] = 0;
dest->m[3][3] = 1;
}
#define EPSILON 0.0000019073486f
void mtx4GetRotation(f32 mtx[4][4], struct coord *dst)
{
f32 norm;
f32 sin_x_cos_y = mtx[1][2];
f32 cos_x_cos_y = mtx[2][2];
norm = sqrtf(sin_x_cos_y * sin_x_cos_y + cos_x_cos_y * cos_x_cos_y);
if (EPSILON < norm) {
dst->x = atan2f(mtx[1][2], mtx[2][2]);
dst->y = atan2f(-mtx[0][2], norm);
dst->z = atan2f(mtx[0][1], mtx[0][0]);
} else {
dst->x = 0;
dst->y = atan2f(-mtx[0][2], norm);
dst->z = atan2f(-mtx[1][0], mtx[1][1]);
}
}
void mtx4LoadRotationAndTranslation(struct coord *pos, struct coord *rot, Mtxf *mtx)
{
mtx4LoadRotation(rot, mtx);
mtx4SetTranslation(pos, mtx);
}
void mtx4LoadTranslation(struct coord *pos, Mtxf *mtx)
{
mtx4LoadIdentity(mtx);
mtx4SetTranslation(pos, mtx);
}
void mtx00016710(f32 mult, f32 mtx[4][4])
{
mtx[0][2] *= mult;
mtx[1][2] *= mult;
mtx[2][2] *= mult;
mtx[3][2] *= mult;
}
void mtx00016748(f32 arg0)
{
var8005ef10[0] = 65536 * arg0;
}
void mtx00016760(void)
{
g_Vars.unk000510 = var8005ef10[0];
var8005ef10[0] = 65536;
}
void mtx00016784(void)
{
var8005ef10[0] = g_Vars.unk000510;
}
/**
* src is passed as an Mtxf but it's read as words rather than floats.
* It might be an Mtx rather than Mtxf.
*
* @TODO: Investigate
*/
void mtx00016798(Mtxf *src, Mtxf *dst)
{
u32 *srcwords = (u32 *) src;
f32 *dstfloats = (f32 *) dst;
s32 i;
for (i = 0; i < 8; i++) {
u32 word1 = srcwords[i + 0];
u32 word2 = srcwords[i + 8];
dstfloats[(i << 1) + 0] = (s32) ((word1 & 0xffff0000) | (word2 >> 16)) / var8005ef10[0];
dstfloats[(i << 1) + 1] = (s32) ((word1 << 16) | (word2 & 0xffff)) / var8005ef10[i & 1];
}
}
void mtx00016820(Mtx *src, Mtx *dst)
{
u32 *srcwords = (u32 *) src;
u32 *dstwords = (u32 *) dst;
s32 i;
for (i = 0; i < 8; i++) {
u32 word1 = srcwords[i + 0];
u32 word2 = srcwords[i + 8];
dstwords[(i << 1) + 0] = (word1 & 0xffff0000) | (word2 >> 16);
dstwords[(i << 1) + 1] = (word1 << 16) | (word2 & 0xffff);
}
}
void mtx00016874(Mtxf *mtx, f32 posx, f32 posy, f32 posz, f32 lookx, f32 looky, f32 lookz, f32 upx, f32 upy, f32 upz)
{
f32 a;
f32 b;
f32 c;
f32 tmp;
tmp = -1 / sqrtf(lookx * lookx + looky * looky + lookz * lookz);
lookx *= tmp;
looky *= tmp;
lookz *= tmp;
a = upy * lookz - upz * looky;
b = upz * lookx - upx * lookz;
c = upx * looky - upy * lookx;
tmp = 1 / sqrtf(a * a + b * b + c * c);
a *= tmp;
b *= tmp;
c *= tmp;
upx = looky * c - lookz * b;
upy = lookz * a - lookx * c;
upz = lookx * b - looky * a;
tmp = 1 / sqrtf(upx * upx + upy * upy + upz * upz);
upx *= tmp;
upy *= tmp;
upz *= tmp;
mtx->m[0][0] = a;
mtx->m[1][0] = b;
mtx->m[2][0] = c;
mtx->m[3][0] = -(posx * a + posy * b + posz * c);
mtx->m[0][1] = upx;
mtx->m[1][1] = upy;
mtx->m[2][1] = upz;
mtx->m[3][1] = -(posx * upx + posy * upy + posz * upz);
mtx->m[0][2] = lookx;
mtx->m[1][2] = looky;
mtx->m[2][2] = lookz;
mtx->m[3][2] = -(posx * lookx + posy * looky + posz * lookz);
mtx->m[0][3] = 0;
mtx->m[1][3] = 0;
mtx->m[2][3] = 0;
mtx->m[3][3] = 1;
}
void mtx00016ae4(Mtxf *mtx, f32 posx, f32 posy, f32 posz, f32 lookx, f32 looky, f32 lookz, f32 upx, f32 upy, f32 upz)
{
mtx00016874(mtx, posx, posy, posz, lookx - posx, looky - posy, lookz - posz, upx, upy, upz);
}
void mtx00016b58(Mtxf *mtx, f32 posx, f32 posy, f32 posz, f32 lookx, f32 looky, f32 lookz, f32 upx, f32 upy, f32 upz)
{
f32 a;
f32 b;
f32 c;
f32 tmp;
tmp = -1 / sqrtf(lookx * lookx + looky * looky + lookz * lookz);
lookx *= tmp;
looky *= tmp;
lookz *= tmp;
a = upy * lookz - upz * looky;
b = upz * lookx - upx * lookz;
c = upx * looky - upy * lookx;
tmp = 1 / sqrtf(a * a + b * b + c * c);
a *= tmp;
b *= tmp;
c *= tmp;
upx = looky * c - lookz * b;
upy = lookz * a - lookx * c;
upz = lookx * b - looky * a;
tmp = 1 / sqrtf(upx * upx + upy * upy + upz * upz);
upx *= tmp;
upy *= tmp;
upz *= tmp;
mtx->m[0][0] = a;
mtx->m[1][0] = upx;
mtx->m[2][0] = lookx;
mtx->m[3][0] = posx;
mtx->m[0][1] = b;
mtx->m[1][1] = upy;
mtx->m[2][1] = looky;
mtx->m[3][1] = posy;
mtx->m[0][2] = c;
mtx->m[1][2] = upz;
mtx->m[2][2] = lookz;
mtx->m[3][2] = posz;
mtx->m[0][3] = 0;
mtx->m[1][3] = 0;
mtx->m[2][3] = 0;
mtx->m[3][3] = 1;
}
void mtx00016d58(Mtxf *mtx, f32 posx, f32 posy, f32 posz, f32 lookx, f32 looky, f32 lookz, f32 upx, f32 upy, f32 upz)
{
mtx00016b58(mtx, posx, posy, posz, lookx - posx, looky - posy, lookz - posz, upx, upy, upz);
}
u32 mtx00016dcc(f32 arg0, f32 arg1)
{
f32 sum = arg0 + arg1;
u16 result;
if (sum <= 2) {
result = 0xffff;
} else {
result = 0x20000 / sum;
if (result <= 0) {
result = 1;
}
}
return result;
}
void mtx00016e98(f32 mtx[4][4], f32 angle, f32 x, f32 y, f32 z)
{
f32 sine;
f32 cosine;
f32 norm;
f32 invnorm;
f32 cos_x;
f32 sin_x;
f32 cos_z;
f32 sin_z;
guNormalize(&x, &y, &z);
sine = sinf(angle);
cosine = cosf(angle);
norm = sqrtf(x * x + z * z);
if (norm != 0) {
cos_x = x * cosine;
sin_x = x * sine;
cos_z = z * cosine;
sin_z = z * sine;
invnorm = 1 / norm;
mtx[0][0] = (-cos_z - y * sin_x) * invnorm;
mtx[1][0] = (sine * norm);
mtx[2][0] = (cos_x - y * sin_z) * invnorm;
mtx[3][0] = 0;
mtx[0][1] = (sin_z - y * cos_x) * invnorm;
mtx[1][1] = (cosine * norm);
mtx[2][1] = (-sin_x - y * cos_z) * invnorm;
mtx[3][1] = 0;
mtx[0][2] = -x;
mtx[1][2] = -y;
mtx[2][2] = -z;
mtx[3][2] = 0;
mtx[0][3] = 0;
mtx[1][3] = 0;
mtx[2][3] = 0;
mtx[3][3] = 1;
return;
}
mtx4LoadIdentity((Mtxf *)mtx);
}
void mtx4Align(f32 mtx[4][4], f32 angle, f32 x, f32 y, f32 z)
{
angle = RAD2DEG(angle);
guAlignF(mtx, angle, x, y, z);
}
#if VERSION < VERSION_NTSC_1_0
void mtx4Print(f32 mtx[4][4])
{
s32 i;
s32 j;
for (i = 0; i < 4; i++) {
rmonPrintf("(");
for (j = 0; j < 4; j++) {
rmonPrintf("%s%s %9f", "", "", mtx[i][j]);
}
rmonPrintf(" )\n");
}
}
#endif
void mtx4LoadRotationFrom(f32 src[4][4], f32 dst[4][4])
{
dst[0][0] = src[0][0];
dst[0][1] = src[1][0];
dst[0][2] = src[2][0];
dst[1][0] = src[0][1];
dst[1][1] = src[1][1];
dst[1][2] = src[2][1];
dst[2][0] = src[0][2];
dst[2][1] = src[1][2];
dst[2][2] = src[2][2];
dst[3][0] = 0;
dst[3][1] = 0;
dst[3][2] = 0;
dst[0][3] = 0;
dst[1][3] = 0;
dst[2][3] = 0;
dst[3][3] = 1;
}
void mtx000170e4(f32 src[4][4], f32 dst[4][4])
{
f32 tmp = (src[0][0] * src[0][0] + src[1][0] * src[1][0] + src[2][0] * src[2][0]);
tmp = 1 / tmp;
dst[0][0] = src[0][0] * tmp;
dst[0][1] = src[1][0] * tmp;
dst[0][2] = src[2][0] * tmp;
dst[1][0] = src[0][1] * tmp;
dst[1][1] = src[1][1] * tmp;
dst[1][2] = src[2][1] * tmp;
dst[2][0] = src[0][2] * tmp;
dst[2][1] = src[1][2] * tmp;
dst[2][2] = src[2][2] * tmp;
dst[3][0] = 0;
dst[3][1] = 0;
dst[3][2] = 0;
dst[0][3] = 0;
dst[1][3] = 0;
dst[2][3] = 0;
dst[3][3] = 1;
}
void mtx0001719c(f32 arg0[4][4], f32 arg1[4][4])
{
f32 tmp = arg0[0][0] * arg0[0][0] + arg0[1][0] * arg0[1][0] + arg0[2][0] * arg0[2][0];
tmp = 1 / tmp;
arg1[0][0] = arg0[0][0] * tmp;
arg1[0][1] = arg0[1][0] * tmp;
arg1[0][2] = arg0[2][0] * tmp;
arg1[1][0] = arg0[0][1] * tmp;
arg1[1][1] = arg0[1][1] * tmp;
arg1[1][2] = arg0[2][1] * tmp;
arg1[2][0] = arg0[0][2] * tmp;
arg1[2][1] = arg0[1][2] * tmp;
arg1[2][2] = arg0[2][2] * tmp;
arg1[3][0] = -(arg1[0][0] * arg0[3][0] + arg1[1][0] * arg0[3][1] + arg1[2][0] * arg0[3][2]);
arg1[3][1] = -(arg1[0][1] * arg0[3][0] + arg1[1][1] * arg0[3][1] + arg1[2][1] * arg0[3][2]);
arg1[3][2] = -(arg1[0][2] * arg0[3][0] + arg1[1][2] * arg0[3][1] + arg1[2][2] * arg0[3][2]);
arg1[0][3] = 0;
arg1[1][3] = 0;
arg1[2][3] = 0;
arg1[3][3] = 1;
}
void mtx000172f0(f32 arg0[4][4], f32 arg1[4][4])
{
f32 f0 = 0.0f;
f0 += arg0[0][0] * arg0[1][1] * arg0[2][2];
f0 += arg0[0][1] * arg0[1][2] * arg0[2][0];
f0 += arg0[0][2] * arg0[1][0] * arg0[2][1];
f0 -= arg0[0][2] * arg0[1][1] * arg0[2][0];
f0 -= arg0[0][1] * arg0[1][0] * arg0[2][2];
f0 -= arg0[0][0] * arg0[1][2] * arg0[2][1];
f0 = 1.0f / f0;
arg1[0][0] = (arg0[1][1] * arg0[2][2] - arg0[1][2] * arg0[2][1]) * f0;
arg1[1][0] = (arg0[1][2] * arg0[2][0] - arg0[1][0] * arg0[2][2]) * f0;
arg1[2][0] = (arg0[1][0] * arg0[2][1] - arg0[1][1] * arg0[2][0]) * f0;
arg1[0][1] = (arg0[0][2] * arg0[2][1] - arg0[0][1] * arg0[2][2]) * f0;
arg1[1][1] = (arg0[0][0] * arg0[2][2] - arg0[0][2] * arg0[2][0]) * f0;
arg1[2][1] = (arg0[0][1] * arg0[2][0] - arg0[0][0] * arg0[2][1]) * f0;
arg1[0][2] = (arg0[0][1] * arg0[1][2] - arg0[0][2] * arg0[1][1]) * f0;
arg1[1][2] = (arg0[0][2] * arg0[1][0] - arg0[0][0] * arg0[1][2]) * f0;
arg1[2][2] = (arg0[0][0] * arg0[1][1] - arg0[0][1] * arg0[1][0]) * f0;
arg1[3][0] = -(arg0[3][0] * arg1[0][0] + arg0[3][1] * arg1[1][0] + arg0[3][2] * arg1[2][0]);
arg1[3][1] = -(arg0[3][0] * arg1[0][1] + arg0[3][1] * arg1[1][1] + arg0[3][2] * arg1[2][1]);
arg1[3][2] = -(arg0[3][0] * arg1[0][2] + arg0[3][1] * arg1[1][2] + arg0[3][2] * arg1[2][2]);
arg1[0][3] = 0.0f;
arg1[1][3] = 0.0f;
arg1[2][3] = 0.0f;
arg1[3][3] = 1.0f;
}
void mtx00017588(f32 arg0[4][4], f32 arg1[4][4])
{
s32 i;
s32 j;
f32 tmp;
mtx00017614(arg0, arg1);
tmp = 1.0f / mtx00017a78(arg0);
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
arg1[i][j] *= tmp;
}
}
}
void mtx00017614(f32 arg0[4][4], f32 arg1[4][4])
{
f32 mtx00, mtx10, mtx20, mtx30;
f32 mtx04, mtx14, mtx24, mtx34;
f32 mtx08, mtx18, mtx28, mtx38;
f32 mtx0c, mtx1c, mtx2c, mtx3c;
mtx00 = arg0[0][0]; mtx04 = arg0[0][1];
mtx08 = arg0[0][2]; mtx0c = arg0[0][3];
mtx10 = arg0[1][0]; mtx14 = arg0[1][1];
mtx18 = arg0[1][2]; mtx1c = arg0[1][3];
mtx20 = arg0[2][0]; mtx24 = arg0[2][1];
mtx28 = arg0[2][2]; mtx2c = arg0[2][3];
mtx30 = arg0[3][0]; mtx34 = arg0[3][1];
mtx38 = arg0[3][2]; mtx3c = arg0[3][3];
arg1[0][0] = mtx00017c2c(mtx14, mtx24, mtx34, mtx18, mtx28, mtx38, mtx1c, mtx2c, mtx3c);
arg1[1][0] = -mtx00017c2c(mtx10, mtx20, mtx30, mtx18, mtx28, mtx38, mtx1c, mtx2c, mtx3c);
arg1[2][0] = mtx00017c2c(mtx10, mtx20, mtx30, mtx14, mtx24, mtx34, mtx1c, mtx2c, mtx3c);
arg1[3][0] = -mtx00017c2c(mtx10, mtx20, mtx30, mtx14, mtx24, mtx34, mtx18, mtx28, mtx38);
arg1[0][1] = -mtx00017c2c(mtx04, mtx24, mtx34, mtx08, mtx28, mtx38, mtx0c, mtx2c, mtx3c);
arg1[1][1] = mtx00017c2c(mtx00, mtx20, mtx30, mtx08, mtx28, mtx38, mtx0c, mtx2c, mtx3c);
arg1[2][1] = -mtx00017c2c(mtx00, mtx20, mtx30, mtx04, mtx24, mtx34, mtx0c, mtx2c, mtx3c);
arg1[3][1] = mtx00017c2c(mtx00, mtx20, mtx30, mtx04, mtx24, mtx34, mtx08, mtx28, mtx38);
arg1[0][2] = mtx00017c2c(mtx04, mtx14, mtx34, mtx08, mtx18, mtx38, mtx0c, mtx1c, mtx3c);
arg1[1][2] = -mtx00017c2c(mtx00, mtx10, mtx30, mtx08, mtx18, mtx38, mtx0c, mtx1c, mtx3c);
arg1[2][2] = mtx00017c2c(mtx00, mtx10, mtx30, mtx04, mtx14, mtx34, mtx0c, mtx1c, mtx3c);
arg1[3][2] = -mtx00017c2c(mtx00, mtx10, mtx30, mtx04, mtx14, mtx34, mtx08, mtx18, mtx38);
arg1[0][3] = -mtx00017c2c(mtx04, mtx14, mtx24, mtx08, mtx18, mtx28, mtx0c, mtx1c, mtx2c);
arg1[1][3] = mtx00017c2c(mtx00, mtx10, mtx20, mtx08, mtx18, mtx28, mtx0c, mtx1c, mtx2c);
arg1[2][3] = -mtx00017c2c(mtx00, mtx10, mtx20, mtx04, mtx14, mtx24, mtx0c, mtx1c, mtx2c);
arg1[3][3] = mtx00017c2c(mtx00, mtx10, mtx20, mtx04, mtx14, mtx24, mtx08, mtx18, mtx28);
}
f32 mtx00017a78(f32 arg0[4][4])
{
f32 tmp;
f32 sp78, sp74, sp70, sp6c;
f32 sp68, sp64, sp60, sp5c;
f32 sp58, sp54, sp50, sp4c;
f32 sp48, sp44, sp40, sp3c;
f32 sp38;
f32 sp34;
f32 sp30;
sp78 = arg0[0][0]; sp68 = arg0[0][1];
sp58 = arg0[0][2]; sp48 = arg0[0][3];
sp74 = arg0[1][0]; sp64 = arg0[1][1];
sp54 = arg0[1][2]; sp44 = arg0[1][3];
sp70 = arg0[2][0]; sp60 = arg0[2][1];
sp50 = arg0[2][2]; sp40 = arg0[2][3];
sp6c = arg0[3][0]; sp5c = arg0[3][1];
sp4c = arg0[3][2]; sp3c = arg0[3][3];
sp30 = mtx00017c2c(sp74, sp70, sp6c, sp64, sp60, sp5c, sp44, sp40, sp3c);
sp34 = mtx00017c2c(sp74, sp70, sp6c, sp54, sp50, sp4c, sp44, sp40, sp3c);
sp38 = mtx00017c2c(sp64, sp60, sp5c, sp54, sp50, sp4c, sp44, sp40, sp3c);
tmp = mtx00017c2c(sp74, sp70, sp6c, sp64, sp60, sp5c, sp54, sp50, sp4c);
return (sp78 * sp38 - sp68 * sp34 + sp58 * sp30) - tmp * sp48;
}
f32 mtx00017c2c(f32 arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4, f32 arg5, f32 arg6, f32 arg7, f32 arg8)
{
f32 sp24;
f32 sp20;
f32 sp1c;
sp1c = mtx00017cbc(arg1, arg2, arg7, arg8);
sp20 = mtx00017cbc(arg4, arg5, arg7, arg8);
sp24 = mtx00017cbc(arg1, arg2, arg4, arg5);
return sp24 * arg6 + (arg0 * sp20 - arg3 * sp1c);
}
f32 mtx00017cbc(f32 arg0, f32 arg1, f32 arg2, f32 arg3)
{
return arg0 * arg3 - arg1 * arg2;
}