diff --git a/include/PR/gu.h b/include/PR/gu.h index e005382df..30be352cf 100644 --- a/include/PR/gu.h +++ b/include/PR/gu.h @@ -185,8 +185,8 @@ extern int guRandom(void); */ extern float sinf(float angle); extern float cosf(float angle); -extern signed short sins (unsigned short angle); -extern signed short coss (unsigned short angle); +extern signed int sins (unsigned int angle); +extern signed int coss (unsigned int angle); /* * Dump routines for low-level display lists diff --git a/ld/libfiles.ntsc-final.inc b/ld/libfiles.ntsc-final.inc index 398326538..4aa65e67a 100644 --- a/ld/libfiles.ntsc-final.inc +++ b/ld/libfiles.ntsc-final.inc @@ -157,7 +157,6 @@ build/ROMID/lib/ultra/io/devmgr.o (section); \ build/ROMID/lib/ultra/os/thread.o (section); \ build/ROMID/lib/ultra/os/destroythread.o (section); \ - build/ROMID/lib/ultra/gu/mtxutil.o (section); \ build/ROMID/lib/ultra/libc/string.o (section); \ build/ROMID/lib/ultra/libc/ldiv.o (section); \ build/ROMID/lib/ultra/io/siacs.o (section); \ diff --git a/src/include/constants.h b/src/include/constants.h index 8ef4a2be0..18911f814 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -13,8 +13,6 @@ #define false 0 #define true 1 -#define osSyncPrintf - #define S32_MAX 2147483647 #define U32_MAX 4294967295 #define MINFLOAT ((float)-3.40282346638528860e+38) diff --git a/src/lib/mtx.c b/src/lib/mtx.c index 4f14d9501..f2977f65e 100644 --- a/src/lib/mtx.c +++ b/src/lib/mtx.c @@ -456,30 +456,6 @@ void mtx4Align(f32 mtx[4][4], f32 angle, f32 x, f32 y, f32 z) guAlignF(mtx, angle, x, y, z); } -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]); diff --git a/src/lib/mtxasm.s b/src/lib/mtxasm.s index ea239dc4f..6539e48bb 100644 --- a/src/lib/mtxasm.s +++ b/src/lib/mtxasm.s @@ -450,13 +450,21 @@ glabel mtx00015f88 jr $ra nop +glabel guMtxF2L + lui $at, 0x4780 + mtc1 $at, $f0 + j _mtxF2L + mtc1 $at, $f2 + glabel mtx00016054 lui $t2, %hi(var8005ef10) addiu $t2, $t2, %lo(var8005ef10) - addiu $t0, $a0, 0x40 - lui $t1, 0xffff lwc1 $f0, 0x0($t2) lwc1 $f2, 0x4($t2) + +glabel _mtxF2L + lui $t1, 0xffff + addiu $t0, $a0, 0x40 .L0001606c: lwc1 $f4, 0x0($a0) lwc1 $f6, 0x4($a0) @@ -495,3 +503,53 @@ glabel mtx00016054 addiu $a1, $a1, 0x8 jr $ra nop + +glabel mtx4LoadRotationFrom + lw $t0, 0x00($a0) + lw $t1, 0x10($a0) + lw $t2, 0x20($a0) + lw $t3, 0x04($a0) + lw $t4, 0x14($a0) + lw $t5, 0x24($a0) + lw $t6, 0x08($a0) + lw $t7, 0x18($a0) + lw $t8, 0x28($a0) + sw $t0, 0x00($a1) + sw $t1, 0x04($a1) + sw $t2, 0x08($a1) + sw $t3, 0x10($a1) + sw $t4, 0x14($a1) + sw $t5, 0x18($a1) + sw $t6, 0x20($a1) + sw $t7, 0x24($a1) + sw $t8, 0x28($a1) + sw $zero, 0x30($a1) + sw $zero, 0x34($a1) + sw $zero, 0x38($a1) + sw $zero, 0x0c($a1) + sw $zero, 0x1c($a1) + sw $zero, 0x2c($a1) + lui $at, 0x3f80 + jr $ra + sw $at, 0x3c($a1) + +glabel guScaleF + lui $at, 0x3f80 + sw $zero, 0x4($a0) + sw $zero, 0x8($a0) + sw $zero, 0xc($a0) + sw $zero, 0x10($a0) + sw $zero, 0x18($a0) + sw $zero, 0x1c($a0) + sw $zero, 0x20($a0) + sw $zero, 0x24($a0) + sw $zero, 0x2c($a0) + sw $zero, 0x30($a0) + sw $zero, 0x34($a0) + sw $zero, 0x38($a0) + sw $a1, 0x0($a0) + sw $a2, 0x14($a0) + sw $a3, 0x28($a0) + jr $ra + sw $at, 0x3c($a0) + diff --git a/src/lib/ultra/gu/align.c b/src/lib/ultra/gu/align.c index 1dde87db4..c0d758a09 100644 --- a/src/lib/ultra/gu/align.c +++ b/src/lib/ultra/gu/align.c @@ -1,5 +1,6 @@ #include "guint.h" #include "constants.h" +#include "lib/mtx.h" void guAlignF(float mf[4][4], float a, float x, float y, float z) { @@ -13,8 +14,6 @@ void guAlignF(float mf[4][4], float a, float x, float y, float z) c = cosf(a); h = sqrtf(x * x + z * z); - guMtxIdentF(mf); - if (h != 0) { hinv = 1 / h; @@ -37,5 +36,7 @@ void guAlignF(float mf[4][4], float a, float x, float y, float z) mf[1][3] = 0; mf[2][3] = 0; mf[3][3] = 1; + } else { + mtx4LoadIdentity((Mtxf *) mf); } } diff --git a/src/lib/ultra/gu/coss.c b/src/lib/ultra/gu/coss.c index f6c805f1c..f58b8b214 100644 --- a/src/lib/ultra/gu/coss.c +++ b/src/lib/ultra/gu/coss.c @@ -1,6 +1,6 @@ #include "guint.h" -signed short coss(unsigned short x) +signed int coss(unsigned int x) { - return sins((unsigned short) (x + 0x4000)); + return sins((unsigned int) (x + 0x4000)); } diff --git a/src/lib/ultra/gu/frustum.c b/src/lib/ultra/gu/frustum.c index 6857939f3..74b4d3083 100644 --- a/src/lib/ultra/gu/frustum.c +++ b/src/lib/ultra/gu/frustum.c @@ -4,20 +4,23 @@ void guFrustumF(float mf[4][4], float l, float r, float b, float t, float n, flo { int i, j; - guMtxIdentF(mf); + mf[0][0] = 2 * n / (r - l) * scale; + mf[0][1] = 0; + mf[0][2] = 0; + mf[0][3] = 0; - mf[0][0] = 2 * n / (r - l); - mf[1][1] = 2 * n / (t - b); - mf[2][0] = (r + l) / (r - l); - mf[2][1] = (t + b) / (t - b); - mf[2][2] = -(f + n) / (f - n); - mf[2][3] = -1; - mf[3][2] = -2 * f * n / (f - n); + mf[1][0] = 0; + mf[1][1] = 2 * n / (t - b) * scale; + mf[1][2] = 0; + mf[1][3] = 0; + + mf[2][0] = (r + l) / (r - l) * scale; + mf[2][1] = (t + b) / (t - b) * scale; + mf[2][2] = -(f + n) / (f - n) * scale; + mf[2][3] = -scale; + + mf[3][0] = 0; + mf[3][1] = 0; + mf[3][2] = -2 * f * n / (f - n) * scale; mf[3][3] = 0; - - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - mf[i][j] *= scale; - } - } } diff --git a/src/lib/ultra/gu/lookatref.c b/src/lib/ultra/gu/lookatref.c index 82125181d..80a6b047b 100644 --- a/src/lib/ultra/gu/lookatref.c +++ b/src/lib/ultra/gu/lookatref.c @@ -8,8 +8,6 @@ static void guLookAtReflectF(float mf[4][4], LookAt *l, { float len, xLook, yLook, zLook, xRight, yRight, zRight; - guMtxIdentF(mf); - xLook = xAt - xEye; yLook = yAt - yEye; zLook = zAt - zEye; diff --git a/src/lib/ultra/gu/mtxutil.c b/src/lib/ultra/gu/mtxutil.c deleted file mode 100644 index 131e7ada5..000000000 --- a/src/lib/ultra/gu/mtxutil.c +++ /dev/null @@ -1,32 +0,0 @@ -#include - -void guMtxF2L(f32 mf[4][4], Mtx *m) -{ - int i, j; - int e1, e2; - int *ai, *af; - - ai = (int *) &m->m[0][0]; - af = (int *) &m->m[2][0]; - - for (i = 0; i < 4; i++) { - for (j = 0; j < 2; j++) { - e1 = FTOFIX32(mf[i][j * 2]); - e2 = FTOFIX32(mf[i][j * 2 + 1]); - - *(ai++) = (e1 & 0xffff0000) | ((e2 >> 16) & 0xffff); - *(af++) = ((e1 << 16) & 0xffff0000) | (e2 & 0xffff); - } - } -} - -void guMtxIdentF(float mf[4][4]) -{ - int i, j; - - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - mf[i][j] = i == j ? 1 : 0; - } - } -} diff --git a/src/lib/ultra/gu/perspective.c b/src/lib/ultra/gu/perspective.c index 9b4035fca..9ad495176 100644 --- a/src/lib/ultra/gu/perspective.c +++ b/src/lib/ultra/gu/perspective.c @@ -5,23 +5,28 @@ void guPerspectiveF(float mf[4][4], u16 *perspNorm, float fovy, float aspect, fl float cot; int i, j; - guMtxIdentF(mf); - fovy *= 3.1415926f / 180.0f; cot = cosf(fovy * 0.5f) / sinf(fovy * 0.5f); - mf[0][0] = cot / aspect; - mf[1][1] = cot; - mf[2][2] = (near + far) / (near - far); - mf[2][3] = -1; - mf[3][2] = (2.0f * near * far) / (near - far); - mf[3][3] = 0; + mf[0][0] = cot / aspect * scale; + mf[0][1] = 0; + mf[0][2] = 0; + mf[0][3] = 0; - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - mf[i][j] *= scale; - } - } + mf[1][0] = 0; + mf[1][1] = cot * scale; + mf[1][2] = 0; + mf[1][3] = 0; + + mf[2][0] = 0; + mf[2][1] = 0; + mf[2][2] = (near + far) / (near - far) * scale; + mf[2][3] = -scale; + + mf[3][0] = 0; + mf[3][1] = 0; + mf[3][2] = (2.0f * near * far) / (near - far) * scale; + mf[3][3] = 0; if (perspNorm != (u16 *) NULL) { if (near + far <= 2.0f) { diff --git a/src/lib/ultra/gu/rotate.c b/src/lib/ultra/gu/rotate.c index 46d48a16b..68cccdbfd 100644 --- a/src/lib/ultra/gu/rotate.c +++ b/src/lib/ultra/gu/rotate.c @@ -16,8 +16,6 @@ void guRotateF(float mf[4][4], float a, float x, float y, float z) bc = y * z * t; ca = z * x * t; - guMtxIdentF(mf); - t = x * x; mf[0][0] = t + cosine * (1 - t); mf[2][1] = bc - x * sine; @@ -32,4 +30,13 @@ void guRotateF(float mf[4][4], float a, float x, float y, float z) mf[2][2] = t + cosine * (1 - t); mf[1][0] = ab - z * sine; mf[0][1] = ab + z * sine; + + mf[0][3] = 0; + mf[1][3] = 0; + mf[2][3] = 0; + + mf[3][0] = 0; + mf[3][1] = 0; + mf[3][2] = 0; + mf[3][3] = 1; } diff --git a/src/lib/ultra/gu/scale.c b/src/lib/ultra/gu/scale.c index fdb838d97..5ac3fcb26 100644 --- a/src/lib/ultra/gu/scale.c +++ b/src/lib/ultra/gu/scale.c @@ -1,15 +1,5 @@ #include -void guScaleF(float mf[4][4], float x, float y, float z) -{ - guMtxIdentF(mf); - - mf[0][0] = x; - mf[1][1] = y; - mf[2][2] = z; - mf[3][3] = 1; -} - void guScale(Mtx *m, float x, float y, float z) { f32 mf[4][4]; diff --git a/src/lib/ultra/gu/sins.c b/src/lib/ultra/gu/sins.c index be1c8e229..8e00a4e7e 100644 --- a/src/lib/ultra/gu/sins.c +++ b/src/lib/ultra/gu/sins.c @@ -106,19 +106,19 @@ s16 sintable[] = { 0x7ffe, 0x7ffe, 0x7ffe, 0x7fff, }; -signed short sins(unsigned short x) +signed int sins(unsigned int x) { - signed short val; + signed int val; - x >>= 4; - - if (x & 0x400) { - val = sintable[0x3ff - (x & 0x3ff)]; - } else { - val = sintable[x & 0x3ff]; - } + x >>= 3; if (x & 0x800) { + val = sintable[(0x7ff - (x & 0x7ff)) >> 1]; + } else { + val = sintable[(x & 0x7fe) >> 1]; + } + + if (x & 0x1000) { return -val; } else { return val;