Optimise ultra/gu functions
This commit is contained in:
parent
c911ee9b2d
commit
87af76dc3d
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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); \
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -1,32 +0,0 @@
|
|||
#include <ultra64.h>
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,15 +1,5 @@
|
|||
#include <ultra64.h>
|
||||
|
||||
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];
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue