Files
perfect-dark/src/lib/mtx_c.c
T
2023-08-15 22:28:11 +10:00

364 lines
8.8 KiB
C

#include <ultra64.h>
#include "constants.h"
#include "bss.h"
#include "data.h"
#include "lib/mtx.h"
#include "types.h"
f32 var8005ef10[] = {65536, 65536};
void mtx4LoadIdentity(Mtxf *mtx)
{
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] = 1;
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 mtx4MultMtx4InPlace(Mtxf *multmtx, Mtxf *subject)
{
mtx4MultMtx4(multmtx, subject, subject);
}
void mtx4MultMtx4(Mtxf *mtx1, Mtxf *mtx2, Mtxf *dst)
{
s32 i;
f32 m00 = mtx2->m[0][0];
f32 m01 = mtx2->m[0][1];
f32 m02 = mtx2->m[0][2];
f32 m03 = mtx2->m[0][3];
f32 m10 = mtx2->m[1][0];
f32 m11 = mtx2->m[1][1];
f32 m12 = mtx2->m[1][2];
f32 m13 = mtx2->m[1][3];
f32 m20 = mtx2->m[2][0];
f32 m21 = mtx2->m[2][1];
f32 m22 = mtx2->m[2][2];
f32 m23 = mtx2->m[2][3];
f32 m30 = mtx2->m[3][0];
f32 m31 = mtx2->m[3][1];
f32 m32 = mtx2->m[3][2];
f32 m33 = mtx2->m[3][3];
for (i = 0; i < 4; i++) {
dst->m[0][i] = mtx1->m[0][i] * m00 + mtx1->m[1][i] * m01 + mtx1->m[2][i] * m02 + mtx1->m[3][i] * m03;
dst->m[1][i] = mtx1->m[0][i] * m10 + mtx1->m[1][i] * m11 + mtx1->m[2][i] * m12 + mtx1->m[3][i] * m13;
dst->m[2][i] = mtx1->m[0][i] * m20 + mtx1->m[1][i] * m21 + mtx1->m[2][i] * m22 + mtx1->m[3][i] * m23;
dst->m[3][i] = mtx1->m[0][i] * m30 + mtx1->m[1][i] * m31 + mtx1->m[2][i] * m32 + mtx1->m[3][i] * m33;
}
}
void mtx4RotateVecInPlace(Mtxf *mtx, struct coord *vec)
{
mtx4RotateVec(mtx, vec, vec);
}
void mtx4RotateVec(Mtxf *mtx, struct coord *vec, struct coord *dst)
{
f32 x = vec->x;
f32 y = vec->y;
f32 z = vec->z;
dst->x = mtx->m[0][0] * x + mtx->m[1][0] * y + mtx->m[2][0] * z;
dst->y = mtx->m[0][1] * x + mtx->m[1][1] * y + mtx->m[2][1] * z;
dst->z = mtx->m[0][2] * x + mtx->m[1][2] * y + mtx->m[2][2] * z;
}
void mtx4TransformVecInPlace(Mtxf *mtx, struct coord *vec)
{
mtx4TransformVec(mtx, vec, vec);
}
void mtx4TransformVec(Mtxf *mtx, struct coord *vec, struct coord *dst)
{
f32 x = vec->x;
f32 y = vec->y;
f32 z = vec->z;
dst->x = mtx->m[0][0] * x + mtx->m[1][0] * y + mtx->m[2][0] * z;
dst->y = mtx->m[0][1] * x + mtx->m[1][1] * y + mtx->m[2][1] * z;
dst->z = mtx->m[0][2] * x + mtx->m[1][2] * y + mtx->m[2][2] * z;
dst->x += mtx->m[3][0];
dst->y += mtx->m[3][1];
dst->z += mtx->m[3][2];
}
void mtx00015be0(Mtxf *matrix1, Mtxf *matrix2)
{
mtx00015be4(matrix1, matrix2, matrix2);
}
void mtx00015be4(Mtxf *arg0, Mtxf *arg1, Mtxf *dst)
{
f32 m00 = arg1->m[0][0];
f32 m01 = arg1->m[0][1];
f32 m02 = arg1->m[0][2];
f32 m03 = arg1->m[0][3];
f32 m10 = arg1->m[1][0];
f32 m11 = arg1->m[1][1];
f32 m12 = arg1->m[1][2];
f32 m13 = arg1->m[1][3];
f32 m20 = arg1->m[2][0];
f32 m21 = arg1->m[2][1];
f32 m22 = arg1->m[2][2];
f32 m23 = arg1->m[2][3];
f32 m30 = arg1->m[3][0];
f32 m31 = arg1->m[3][1];
f32 m32 = arg1->m[3][2];
f32 m33 = arg1->m[3][3];
dst->m[0][0] = arg0->m[0][0] * m00 + arg0->m[1][0] * m01 + arg0->m[2][0] * m02;
dst->m[0][1] = arg0->m[0][1] * m00 + arg0->m[1][1] * m01 + arg0->m[2][1] * m02;
dst->m[0][2] = arg0->m[0][2] * m00 + arg0->m[1][2] * m01 + arg0->m[2][2] * m02;
dst->m[0][3] = 0;
dst->m[1][0] = arg0->m[0][0] * m10 + arg0->m[1][0] * m11 + arg0->m[2][0] * m12;
dst->m[1][1] = arg0->m[0][1] * m10 + arg0->m[1][1] * m11 + arg0->m[2][1] * m12;
dst->m[1][2] = arg0->m[0][2] * m10 + arg0->m[1][2] * m11 + arg0->m[2][2] * m12;
dst->m[1][3] = 0;
dst->m[2][0] = arg0->m[0][0] * m20 + arg0->m[1][0] * m21 + arg0->m[2][0] * m22;
dst->m[2][1] = arg0->m[0][1] * m20 + arg0->m[1][1] * m21 + arg0->m[2][1] * m22;
dst->m[2][2] = arg0->m[0][2] * m20 + arg0->m[1][2] * m21 + arg0->m[2][2] * m22;
dst->m[2][3] = 0;
dst->m[3][0] = arg0->m[0][0] * m30 + arg0->m[1][0] * m31 + arg0->m[2][0] * m32 + arg0->m[3][0];
dst->m[3][1] = arg0->m[0][1] * m30 + arg0->m[1][1] * m31 + arg0->m[2][1] * m32 + arg0->m[3][1];
dst->m[3][2] = arg0->m[0][2] * m30 + arg0->m[1][2] * m31 + arg0->m[2][2] * m32 + arg0->m[3][2];
dst->m[3][3] = 1;
}
void mtx3Copy(f32 src[3][3], f32 dst[3][3])
{
dst[0][0] = src[0][0];
dst[0][1] = src[0][1];
dst[0][2] = src[0][2];
dst[1][0] = src[1][0];
dst[1][1] = src[1][1];
dst[1][2] = src[1][2];
dst[2][0] = src[2][0];
dst[2][1] = src[2][1];
dst[2][2] = src[2][2];
}
void mtx4Copy(Mtxf *src, Mtxf *dst)
{
*dst = *src;
}
void mtx3ToMtx4(f32 src[3][3], Mtxf *dst)
{
dst->m[0][0] = src[0][0];
dst->m[0][1] = src[0][1];
dst->m[0][2] = src[0][2];
dst->m[0][3] = 0;
dst->m[1][0] = src[1][0];
dst->m[1][1] = src[1][1];
dst->m[1][2] = src[1][2];
dst->m[1][3] = 0;
dst->m[2][0] = src[2][0];
dst->m[2][1] = src[2][1];
dst->m[2][2] = src[2][2];
dst->m[2][3] = 0;
dst->m[3][0] = 0;
dst->m[3][1] = 0;
dst->m[3][2] = 0;
dst->m[3][3] = 1;
}
void mtx4ToMtx3(Mtxf *src, f32 dst[3][3])
{
dst[0][0] = src->m[0][0];
dst[0][1] = src->m[0][1];
dst[0][2] = src->m[0][2];
dst[1][0] = src->m[1][0];
dst[1][1] = src->m[1][1];
dst[1][2] = src->m[1][2];
dst[2][0] = src->m[2][0];
dst[2][1] = src->m[2][1];
dst[2][2] = src->m[2][2];
}
void mtx4SetTranslation(struct coord *pos, Mtxf *mtx)
{
mtx->m[3][0] = pos->x;
mtx->m[3][1] = pos->y;
mtx->m[3][2] = pos->z;
}
void mtx00015df0(f32 mult, Mtxf *mtx)
{
mtx->m[0][0] *= mult;
mtx->m[0][1] *= mult;
mtx->m[0][2] *= mult;
mtx->m[0][3] *= mult;
}
void mtx00015e24(f32 mult, Mtxf *mtx)
{
mtx->m[0][0] *= mult;
mtx->m[0][1] *= mult;
mtx->m[0][2] *= mult;
}
void mtx00015e4c(f32 mult, Mtxf *mtx)
{
mtx->m[1][0] *= mult;
mtx->m[1][1] *= mult;
mtx->m[1][2] *= mult;
mtx->m[1][3] *= mult;
}
void mtx00015e80(f32 mult, Mtxf *mtx)
{
mtx->m[1][0] *= mult;
mtx->m[1][1] *= mult;
mtx->m[1][2] *= mult;
}
void mtx00015ea8(f32 mult, Mtxf *mtx)
{
mtx->m[2][0] *= mult;
mtx->m[2][1] *= mult;
mtx->m[2][2] *= mult;
mtx->m[2][3] *= mult;
}
void mtx00015edc(f32 mult, Mtxf *mtx)
{
mtx->m[2][0] *= mult;
mtx->m[2][1] *= mult;
mtx->m[2][2] *= mult;
}
void mtx00015f04(f32 mult, Mtxf *mtx)
{
mtx->m[0][0] *= mult;
mtx->m[0][1] *= mult;
mtx->m[0][2] *= mult;
mtx->m[0][3] *= mult;
mtx->m[1][0] *= mult;
mtx->m[1][1] *= mult;
mtx->m[1][2] *= mult;
mtx->m[1][3] *= mult;
mtx->m[2][0] *= mult;
mtx->m[2][1] *= mult;
mtx->m[2][2] *= mult;
mtx->m[2][3] *= mult;
}
void mtx00015f4c(f32 mult, Mtxf *mtx)
{
mtx->m[0][0] *= mult;
mtx->m[0][1] *= mult;
mtx->m[0][2] *= mult;
mtx->m[1][0] *= mult;
mtx->m[1][1] *= mult;
mtx->m[1][2] *= mult;
mtx->m[2][0] *= mult;
mtx->m[2][1] *= mult;
mtx->m[2][2] *= mult;
}
void mtx00015f88(f32 mult, Mtxf *mtx)
{
mtx->m[0][0] *= mult;
mtx->m[0][1] *= mult;
mtx->m[0][2] *= mult;
mtx->m[1][0] *= mult;
mtx->m[1][1] *= mult;
mtx->m[1][2] *= mult;
mtx->m[2][0] *= mult;
mtx->m[2][1] *= mult;
mtx->m[2][2] *= mult;
mtx->m[3][0] *= mult;
mtx->m[3][1] *= mult;
mtx->m[3][2] *= mult;
}
u32 mtxGetObfuscatedRomBase(void)
{
u32 value;
osRecvMesg(&__osPiAccessQueue, NULL, OS_MESG_BLOCK * 0x10000);
while (IO_READ(PI_STATUS_REG) & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY));
// osRomBase is 0xb0000000
// load address is 0xb0000a5c
// value is 0x1740fff9
value = *(u32 *) (((uintptr_t) osRomBase | 0xb764b4fd) ^ 0x0764bea1);
osSendMesg(&__osPiAccessQueue, 0, 0);
return value;
}
void mtxF2L(Mtxf *src, Mtxf *dst)
{
u32 src00 = (s32) (src->m[0][0] * var8005ef10[0]);
u32 src01 = (s32) (src->m[0][1] * var8005ef10[0]);
u32 src02 = (s32) (src->m[0][2] * var8005ef10[0]);
u32 src03 = (s32) (src->m[0][3] * var8005ef10[1]);
u32 src10 = (s32) (src->m[1][0] * var8005ef10[0]);
u32 src11 = (s32) (src->m[1][1] * var8005ef10[0]);
u32 src12 = (s32) (src->m[1][2] * var8005ef10[0]);
u32 src13 = (s32) (src->m[1][3] * var8005ef10[1]);
u32 src20 = (s32) (src->m[2][0] * var8005ef10[0]);
u32 src21 = (s32) (src->m[2][1] * var8005ef10[0]);
u32 src22 = (s32) (src->m[2][2] * var8005ef10[0]);
u32 src23 = (s32) (src->m[2][3] * var8005ef10[1]);
u32 src30 = (s32) (src->m[3][0] * var8005ef10[0]);
u32 src31 = (s32) (src->m[3][1] * var8005ef10[0]);
u32 src32 = (s32) (src->m[3][2] * var8005ef10[0]);
u32 src33 = (s32) (src->m[3][3] * var8005ef10[1]);
dst->l[0][0] = (src00 & 0xffff0000) | src01 >> 16;
dst->l[0][1] = (src02 & 0xffff0000) | src03 >> 16;
dst->l[0][2] = (src10 & 0xffff0000) | src11 >> 16;
dst->l[0][3] = (src12 & 0xffff0000) | src13 >> 16;
dst->l[1][0] = (src20 & 0xffff0000) | src21 >> 16;
dst->l[1][1] = (src22 & 0xffff0000) | src23 >> 16;
dst->l[1][2] = (src30 & 0xffff0000) | src31 >> 16;
dst->l[1][3] = (src32 & 0xffff0000) | src33 >> 16;
dst->l[2][0] = src00 << 16 | (src01 & 0xffff);
dst->l[2][1] = src02 << 16 | (src03 & 0xffff);
dst->l[2][2] = src10 << 16 | (src11 & 0xffff);
dst->l[2][3] = src12 << 16 | (src13 & 0xffff);
dst->l[3][0] = src20 << 16 | (src21 & 0xffff);
dst->l[3][1] = src22 << 16 | (src23 & 0xffff);
dst->l[3][2] = src30 << 16 | (src31 & 0xffff);
dst->l[3][3] = src32 << 16 | (src33 & 0xffff);
}