mirror of
https://gitlab.com/kholdfuzion/goldeneye_src
synced 2026-09-03 09:49:32 -04:00
2278 lines
94 KiB
C
2278 lines
94 KiB
C
#include "matrixmath.h"
|
|
|
|
// bss
|
|
//CODE.bss:80075DA0
|
|
f32 flt_CODE_bss_80075DA0;
|
|
|
|
|
|
// data
|
|
//D:80032310
|
|
f32 D_80032310[2] = {65536.0f, 65536.0f};
|
|
|
|
// f32 D_80032310 = 65536.0;
|
|
// //D:80032314
|
|
// f32 D_80032314 = 65536.0;
|
|
|
|
|
|
// rodata
|
|
//D:800536F0
|
|
|
|
void matrix_4x4_set_identity(Mtxf *matrix) {
|
|
matrix->m[0][0] = 1.0f;
|
|
matrix->m[0][1] = 0.0f;
|
|
matrix->m[0][2] = 0.0f;
|
|
matrix->m[0][3] = 0.0f;
|
|
matrix->m[1][0] = 0.0f;
|
|
matrix->m[1][1] = 1.0f;
|
|
matrix->m[1][2] = 0.0f;
|
|
matrix->m[1][3] = 0.0f;
|
|
matrix->m[2][0] = 0.0f;
|
|
matrix->m[2][1] = 0.0f;
|
|
matrix->m[2][2] = 1.0f;
|
|
matrix->m[2][3] = 0.0f;
|
|
matrix->m[3][0] = 0.0f;
|
|
matrix->m[3][1] = 0.0f;
|
|
matrix->m[3][2] = 0.0f;
|
|
matrix->m[3][3] = 1.0f;
|
|
}
|
|
|
|
void matrix_4x4_copy(Mtxf *src, Mtxf *dst) {
|
|
s32 i, j;
|
|
for (i = 0; i < 4; i++) {
|
|
for (j = 0; j < 4; j++) {
|
|
dst->m[i][j] = src->m[i][j];
|
|
}
|
|
}
|
|
}
|
|
|
|
void matrix_4x4_multiply(Mtxf *lhs, Mtxf *rhs, Mtxf *result);
|
|
|
|
void matrix_4x4_multiply_in_place(Mtxf *lhs, Mtxf *rhs) {
|
|
Mtxf result;
|
|
matrix_4x4_multiply(lhs, rhs, &result);
|
|
matrix_4x4_copy(&result, rhs);
|
|
}
|
|
|
|
void matrix_4x4_multiply_homogeneous_in_place(Mtxf *lhs, Mtxf *rhs) {
|
|
Mtxf result;
|
|
matrix_4x4_multiply_homogeneous(lhs, rhs, &result);
|
|
matrix_4x4_copy(&result, rhs);
|
|
}
|
|
|
|
void matrix_4x4_multiply(Mtxf *lhs, Mtxf *rhs, Mtxf *result) {
|
|
s32 i, j;
|
|
for (i = 0; i < 4; i++) {
|
|
for (j = 0; j < 4; j++) {
|
|
result->m[j][i] = lhs->m[0][i] * rhs->m[j][0] + lhs->m[1][i] * rhs->m[j][1] + lhs->m[2][i] * rhs->m[j][2] + lhs->m[3][i] * rhs->m[j][3];
|
|
}
|
|
}
|
|
}
|
|
|
|
s32 matrix_4x4_multiply_homogeneous(Mtxf *lhs, Mtxf *rhs, Mtxf *result) {
|
|
s32 i, j;
|
|
for (i = 0; i < 3; i++) {
|
|
for (j = 0; j < 4; j++) {
|
|
result->m[j][i] = (lhs->m[0][i] * rhs->m[j][0]) + (lhs->m[1][i] * rhs->m[j][1]) + (lhs->m[2][i] * rhs->m[j][2]);
|
|
if (j == 3) {
|
|
result->m[j][i] += lhs->m[3][i];
|
|
}
|
|
}
|
|
}
|
|
|
|
result->m[0][3] = 0.0f;
|
|
result->m[1][3] = 0.0f;
|
|
result->m[2][3] = 0.0f;
|
|
result->m[3][3] = 1.0f;
|
|
}
|
|
|
|
void matrix_4x4_7F058274(Mtxf *arg0, Mtxf *arg1, Mtxf *arg2) {
|
|
arg2->m[0][0] = (arg0->m[0][0] * arg1->m[0][0]);
|
|
arg2->m[1][0] = (arg0->m[0][0] * arg1->m[1][0]);
|
|
arg2->m[2][0] = (arg0->m[0][0] * arg1->m[2][0]);
|
|
arg2->m[3][0] = (arg0->m[0][0] * arg1->m[3][0]);
|
|
arg2->m[0][1] = (arg0->m[1][1] * arg1->m[0][1]);
|
|
arg2->m[1][1] = (arg0->m[1][1] * arg1->m[1][1]);
|
|
arg2->m[2][1] = (arg0->m[1][1] * arg1->m[2][1]);
|
|
arg2->m[3][1] = (arg0->m[1][1] * arg1->m[3][1]);
|
|
arg2->m[0][2] = (arg0->m[2][2] * arg1->m[0][2]);
|
|
arg2->m[1][2] = (arg0->m[2][2] * arg1->m[1][2]);
|
|
arg2->m[2][2] = (arg0->m[2][2] * arg1->m[2][2]);
|
|
arg2->m[3][2] = (arg0->m[2][2] * arg1->m[3][2]) + arg0->m[3][2];
|
|
arg2->m[0][3] = (arg0->m[2][3] * arg1->m[0][2]);
|
|
arg2->m[1][3] = (arg0->m[2][3] * arg1->m[1][2]);
|
|
arg2->m[2][3] = (arg0->m[2][3] * arg1->m[2][2]);
|
|
arg2->m[3][3] = (arg0->m[2][3] * arg1->m[3][2]);
|
|
}
|
|
|
|
void matrix_4x4_rotate_vector(Mtxf *matrix, vec3 vector, vec3 result) {
|
|
s32 i;
|
|
for (i = 0; i < 3; i++) {
|
|
result[i] = matrix->m[0][i] * vector[0] + matrix->m[1][i] * vector[1] + matrix->m[2][i] * vector[2];
|
|
}
|
|
}
|
|
|
|
void matrix_4x4_rotate_vector_in_place(Mtxf *matrix, vec3 vector) {
|
|
vec3 result;
|
|
matrix_4x4_rotate_vector(matrix, vector, result);
|
|
vector[0] = result[0];
|
|
vector[1] = result[1];
|
|
vector[2] = result[2];
|
|
}
|
|
|
|
void matrix_4x4_transform_vector(Mtxf *matrix, vec3 vector, vec3 result) {
|
|
matrix_4x4_rotate_vector(matrix, vector, result);
|
|
result[0] += matrix->m[3][0];
|
|
result[1] += matrix->m[3][1];
|
|
result[2] += matrix->m[3][2];
|
|
}
|
|
|
|
void matrix_4x4_transform_vector_in_place(Mtxf *matrix, vec3 vector) {
|
|
matrix_4x4_rotate_vector_in_place(matrix, vector);
|
|
vector[0] += matrix->m[3][0];
|
|
vector[1] += matrix->m[3][1];
|
|
vector[2] += matrix->m[3][2];
|
|
}
|
|
|
|
void matrix_4x4_set_position_and_rotation_around_y(f32* position, f32 angle, Mtxf *matrix) {
|
|
f32 cosine = cosf(angle);
|
|
f32 sine = sinf(angle);
|
|
matrix->m[0][0] = cosine;
|
|
matrix->m[0][1] = 0.0f;
|
|
matrix->m[0][2] = -sine;
|
|
matrix->m[0][3] = 0.0f;
|
|
matrix->m[1][0] = 0.0f;
|
|
matrix->m[1][1] = 1.0f;
|
|
matrix->m[1][2] = 0.0f;
|
|
matrix->m[1][3] = 0.0f;
|
|
matrix->m[2][0] = sine;
|
|
matrix->m[2][1] = 0.0f;
|
|
matrix->m[2][2] = cosine;
|
|
matrix->m[2][3] = 0.0f;
|
|
matrix->m[3][0] = position[0];
|
|
matrix->m[3][1] = position[1];
|
|
matrix->m[3][2] = position[2];
|
|
matrix->m[3][3] = 1.0f;
|
|
}
|
|
|
|
void matrix_4x4_set_rotation_around_x(f32 angle, Mtxf *matrix) {
|
|
f32 cosine = cosf(angle);
|
|
f32 sine = sinf(angle);
|
|
matrix->m[0][0] = 1.0f;
|
|
matrix->m[0][1] = 0.0f;
|
|
matrix->m[0][2] = 0.0f;
|
|
matrix->m[0][3] = 0.0f;
|
|
matrix->m[1][0] = 0.0f;
|
|
matrix->m[1][1] = cosine;
|
|
matrix->m[1][2] = sine;
|
|
matrix->m[1][3] = 0.0f;
|
|
matrix->m[2][0] = 0.0f;
|
|
matrix->m[2][1] = -sine;
|
|
matrix->m[2][2] = cosine;
|
|
matrix->m[2][3] = 0.0f;
|
|
matrix->m[3][0] = 0.0f;
|
|
matrix->m[3][1] = 0.0f;
|
|
matrix->m[3][2] = 0.0f;
|
|
matrix->m[3][3] = 1.0f;
|
|
}
|
|
|
|
void matrix_4x4_set_rotation_around_y(f32 angle, Mtxf *matrix) {
|
|
f32 cosine = cosf(angle);
|
|
f32 sine = sinf(angle);
|
|
matrix->m[0][0] = cosine;
|
|
matrix->m[0][1] = 0.0f;
|
|
matrix->m[0][2] = -sine;
|
|
matrix->m[0][3] = 0.0f;
|
|
matrix->m[1][0] = 0.0f;
|
|
matrix->m[1][1] = 1.0f;
|
|
matrix->m[1][2] = 0.0f;
|
|
matrix->m[1][3] = 0.0f;
|
|
matrix->m[2][0] = sine;
|
|
matrix->m[2][1] = 0.0f;
|
|
matrix->m[2][2] = cosine;
|
|
matrix->m[2][3] = 0.0f;
|
|
matrix->m[3][0] = 0.0f;
|
|
matrix->m[3][1] = 0.0f;
|
|
matrix->m[3][2] = 0.0f;
|
|
matrix->m[3][3] = 1.0f;
|
|
}
|
|
|
|
void matrix_4x4_set_rotation_around_z(f32 angle, Mtxf *matrix) {
|
|
f32 cosine = cosf(angle);
|
|
f32 sine = sinf(angle);
|
|
matrix->m[0][0] = cosine;
|
|
matrix->m[0][1] = sine;
|
|
matrix->m[0][2] = 0.0f;
|
|
matrix->m[0][3] = 0.0f;
|
|
matrix->m[1][0] = -sine;
|
|
matrix->m[1][1] = cosine;
|
|
matrix->m[1][2] = 0.0f;
|
|
matrix->m[1][3] = 0.0f;
|
|
matrix->m[2][0] = 0.0f;
|
|
matrix->m[2][1] = 0.0f;
|
|
matrix->m[2][2] = 1.0f;
|
|
matrix->m[2][3] = 0.0f;
|
|
matrix->m[3][0] = 0.0f;
|
|
matrix->m[3][1] = 0.0f;
|
|
matrix->m[3][2] = 0.0f;
|
|
matrix->m[3][3] = 1.0f;
|
|
}
|
|
|
|
void matrix_4x4_set_rotation_around_xyz(vec3 angles, Mtxf *matrix) {
|
|
f32 cos_x = cosf(angles[0]);
|
|
f32 sin_x = sinf(angles[0]);
|
|
f32 cos_y = cosf(angles[1]);
|
|
f32 sin_y = sinf(angles[1]);
|
|
f32 cos_z = cosf(angles[2]);
|
|
f32 sin_z = sinf(angles[2]);
|
|
f32 sin_x_sin_z = sin_x * sin_z;
|
|
f32 cos_x_sin_z = cos_x * sin_z;
|
|
f32 sin_x_cos_z = sin_x * cos_z;
|
|
f32 cos_x_cos_z = cos_x * cos_z;
|
|
matrix->m[0][0] = (cos_y * cos_z);
|
|
matrix->m[0][1] = (cos_y * sin_z);
|
|
matrix->m[0][2] = -sin_y;
|
|
matrix->m[0][3] = 0.0f;
|
|
matrix->m[1][0] = ((sin_x_cos_z * sin_y) - cos_x_sin_z);
|
|
matrix->m[1][1] = ((sin_x_sin_z * sin_y) + cos_x_cos_z);
|
|
matrix->m[1][2] = sin_x * cos_y;
|
|
matrix->m[1][3] = 0.0f;
|
|
matrix->m[2][0] = ((cos_x_cos_z * sin_y) + sin_x_sin_z);
|
|
matrix->m[2][1] = ((cos_x_sin_z * sin_y) - sin_x_cos_z);
|
|
matrix->m[2][2] = cos_x * cos_y;
|
|
matrix->m[2][3] = 0.0f;
|
|
matrix->m[3][0] = 0.0f;
|
|
matrix->m[3][1] = 0.0f;
|
|
matrix->m[3][2] = 0.0f;
|
|
matrix->m[3][3] = 1.0f;
|
|
}
|
|
|
|
f32 atan2f(f32, f32);
|
|
|
|
#define EPSILON 0.0000019073486f
|
|
|
|
// https://stackoverflow.com/a/15029416
|
|
void matrix_4x4_get_rotation_around_xyz(Mtxf *matrix, vec3 angles) {
|
|
f32 norm;
|
|
f32 sin_x_cos_y = matrix->m[1][2];
|
|
f32 cos_x_cos_y = matrix->m[2][2];
|
|
norm = sqrtf((sin_x_cos_y * sin_x_cos_y) + (cos_x_cos_y * cos_x_cos_y));
|
|
if (EPSILON < norm) {
|
|
angles[0] = atan2f(matrix->m[1][2], matrix->m[2][2]);
|
|
angles[1] = atan2f(-matrix->m[0][2], norm);
|
|
angles[2] = atan2f(matrix->m[0][1], matrix->m[0][0]);
|
|
} else {
|
|
angles[0] = 0.0f;
|
|
angles[1] = atan2f(-matrix->m[0][2], norm);
|
|
angles[2] = atan2f(-matrix->m[1][0], matrix->m[1][1]);
|
|
}
|
|
}
|
|
|
|
void matrix_4x4_set_position(vec3 position, Mtxf *matrix);
|
|
|
|
void matrix_4x4_set_position_and_rotation_around_xyz(vec3 position, vec3 rotation, Mtxf *matrix) {
|
|
matrix_4x4_set_rotation_around_xyz(rotation, matrix);
|
|
matrix_4x4_set_position(position, matrix);
|
|
}
|
|
|
|
void matrix_4x4_set_identity_and_position(vec3 position, Mtxf *matrix) {
|
|
matrix_4x4_set_identity(matrix);
|
|
matrix_4x4_set_position(position, matrix);
|
|
}
|
|
|
|
void matrix_4x4_set_position(vec3 position, Mtxf *matrix) {
|
|
matrix->m[3][0] = position[0];
|
|
matrix->m[3][1] = position[1];
|
|
matrix->m[3][2] = position[2];
|
|
}
|
|
|
|
void matrix_column_1_scalar_multiply(f32 scalar, f32* matrix) {
|
|
matrix[0] *= scalar;
|
|
matrix[1] *= scalar;
|
|
matrix[2] *= scalar;
|
|
}
|
|
|
|
void matrix_column_2_scalar_multiply(f32 scalar, f32* matrix) {
|
|
matrix[4] *= scalar;
|
|
matrix[5] *= scalar;
|
|
matrix[6] *= scalar;
|
|
}
|
|
|
|
void matrix_column_3_scalar_multiply(f32 scalar, f32* matrix) {
|
|
matrix[8] *= scalar;
|
|
matrix[9] *= scalar;
|
|
matrix[10] *= scalar;
|
|
matrix[11] *= scalar;
|
|
}
|
|
|
|
void matrix_column_3_scalar_multiply_2(f32 scalar, f32* matrix) {
|
|
matrix[8] *= scalar;
|
|
matrix[9] *= scalar;
|
|
matrix[10] *= scalar;
|
|
}
|
|
|
|
void matrix_scalar_multiply(f32 scalar, f32* matrix) {
|
|
matrix[0] *= scalar;
|
|
matrix[1] *= scalar;
|
|
matrix[2] *= scalar;
|
|
matrix[3] *= scalar;
|
|
matrix[4] *= scalar;
|
|
matrix[5] *= scalar;
|
|
matrix[6] *= scalar;
|
|
matrix[7] *= scalar;
|
|
matrix[8] *= scalar;
|
|
matrix[9] *= scalar;
|
|
matrix[10] *= scalar;
|
|
matrix[11] *= scalar;
|
|
}
|
|
|
|
void matrix_scalar_multiply_2(f32 scalar, f32* matrix) {
|
|
matrix[0] *= scalar;
|
|
matrix[1] *= scalar;
|
|
matrix[2] *= scalar;
|
|
matrix[4] *= scalar;
|
|
matrix[5] *= scalar;
|
|
matrix[6] *= scalar;
|
|
matrix[8] *= scalar;
|
|
matrix[9] *= scalar;
|
|
matrix[10] *= scalar;
|
|
}
|
|
|
|
void matrix_row_3_scalar_multiply(f32 scalar, f32* matrix) {
|
|
matrix[2] *= scalar;
|
|
matrix[6] *= scalar;
|
|
matrix[10] *= scalar;
|
|
matrix[14] *= scalar;
|
|
}
|
|
|
|
void matrix_scalar_multiply_3(f32 scalar, f32* matrix) {
|
|
matrix[0] *= scalar;
|
|
matrix[4] *= scalar;
|
|
matrix[8] *= scalar;
|
|
matrix[12] *= scalar;
|
|
matrix[1] *= scalar;
|
|
matrix[5] *= scalar;
|
|
matrix[9] *= scalar;
|
|
matrix[13] *= scalar;
|
|
matrix[2] *= scalar;
|
|
matrix[6] *= scalar;
|
|
matrix[10] *= scalar;
|
|
matrix[14] *= scalar;
|
|
}
|
|
|
|
void matrix_4x4_7F058C4C(f32 arg0) {
|
|
D_80032310[0] = (65536.0f * arg0);
|
|
}
|
|
|
|
void matrix_4x4_7F058C64(void) {
|
|
flt_CODE_bss_80075DA0 = D_80032310[0];
|
|
D_80032310[0] = 65536.0f;
|
|
}
|
|
|
|
void matrix_4x4_7F058C88(void) {
|
|
D_80032310[0] = flt_CODE_bss_80075DA0;
|
|
}
|
|
|
|
#ifdef NONMATCHING
|
|
// #define GET_HIGH_S16(x, y) (x & 0xFFFF0000) | (y >> 16);
|
|
// #define GET_LOW_S16(x, y) (x << 16) | (y & 0xFFFF);
|
|
|
|
// #define STORE_HIGH_AND_LOW_16(index) \
|
|
// var1 = (s32)(matrix[(index) * 2 + 0] * D_80032310[(index) & 0]); \
|
|
// var2 = (s32)(matrix[(index) * 2 + 1] * D_80032310[(index) & 1]); \
|
|
// result[index + 0] = GET_HIGH_S16(var1, var2); \
|
|
// result[index + 8] = GET_LOW_S16(var1, var2);
|
|
#define FTOFIX32(x) (long)((x) * D_80032310[0])
|
|
|
|
void sub_GAME_7F058C9C(f32 mf[4][4], s32 ms[4][4]) {
|
|
int i, j;
|
|
int e1,e2;
|
|
int *ai,*af;
|
|
|
|
ai=(int*)&ms[0][0];
|
|
af=(int*)&ms[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);
|
|
}
|
|
}
|
|
|
|
|
|
// // s32 i;
|
|
// // s32 x;
|
|
// // s32 y;
|
|
// // for (i = 0; i < 8; i++) {
|
|
// // result[i] =
|
|
// // //x = D_80032310[(i + 0) & 0] * matrix[i][0];
|
|
// // //y = D_80032310[(i + 0) & 0] * matrix[0][i];
|
|
// // //y = D_80032310[(i + 0) & 1]
|
|
// // }
|
|
|
|
// s32 i;
|
|
// u32 var1;
|
|
// u32 var2;
|
|
// // u32 var3;
|
|
// // u32 var4;
|
|
// // u32 var5;
|
|
// // u32 var6;
|
|
// // u32 var7;
|
|
// // u32 var8;
|
|
// for (i = 0; i < 8; i += 4) {
|
|
// STORE_HIGH_AND_LOW_16(i + 0)
|
|
// STORE_HIGH_AND_LOW_16(i + 1)
|
|
// STORE_HIGH_AND_LOW_16(i + 2)
|
|
// STORE_HIGH_AND_LOW_16(i + 3)
|
|
|
|
|
|
|
|
// // var1 = (s32)(D_80032310[0] * matrix[(i + 0) * 2 + 0]);
|
|
// // var2 = (s32)(D_80032310[0] * matrix[(i + 0) * 2 + 1]);
|
|
// // result[i + 0] = GET_HIGH_S16(var1, var2);
|
|
// // result[i + 8] = GET_LOW_S16(var1, var2);
|
|
// // var3 = (s32)(D_80032310[0] * matrix[(i + 1) * 2 + 0]);
|
|
// // var4 = (s32)(D_80032310[1] * matrix[(i + 1) * 2 + 1]);
|
|
// // result[i + 1]= GET_HIGH_S16(var3, var4);
|
|
// // result[i + 9] = GET_LOW_S16(var3, var4);
|
|
// // var5 = (s32)(D_80032310[0] * matrix[(i + 2) * 2 + 0]);
|
|
// // var6 = (s32)(D_80032310[0] * matrix[(i + 2) * 2 + 1]);
|
|
// // result[i + 2] = GET_HIGH_S16(var5, var6);
|
|
// // result[i + 10] = GET_LOW_S16(var5, var6);
|
|
// // var7 = (s32)(D_80032310[0] * matrix[(i + 3) * 2 + 0]);
|
|
// // var8 = (s32)(D_80032310[1] * matrix[(i + 3) * 2 + 1]);
|
|
// // result[i + 3] = GET_HIGH_S16(var7, var8);
|
|
// // result[i + 11] = GET_LOW_S16(var7, var8);
|
|
// }
|
|
// }
|
|
#else
|
|
GLOBAL_ASM(
|
|
.text
|
|
glabel sub_GAME_7F058C9C
|
|
/* 08D7CC 7F058C9C 27BDFFE8 */ addiu $sp, $sp, -0x18
|
|
/* 08D7D0 7F058CA0 AFB1000C */ sw $s1, 0xc($sp)
|
|
/* 08D7D4 7F058CA4 AFB30014 */ sw $s3, 0x14($sp)
|
|
/* 08D7D8 7F058CA8 AFB20010 */ sw $s2, 0x10($sp)
|
|
/* 08D7DC 7F058CAC 3C118003 */ lui $s1, %hi(D_80032310)
|
|
/* 08D7E0 7F058CB0 AFB00008 */ sw $s0, 8($sp)
|
|
/* 08D7E4 7F058CB4 26312310 */ addiu $s1, %lo(D_80032310) # addiu $s1, $s1, 0x2310
|
|
/* 08D7E8 7F058CB8 3C12FFFF */ lui $s2, 0xffff
|
|
/* 08D7EC 7F058CBC 24130008 */ li $s3, 8
|
|
/* 08D7F0 7F058CC0 00001025 */ move $v0, $zero
|
|
/* 08D7F4 7F058CC4 00A05825 */ move $t3, $a1
|
|
.L7F058CC8:
|
|
/* 08D7F8 7F058CC8 C6320000 */ lwc1 $f18, ($s1)
|
|
/* 08D7FC 7F058CCC 000278C0 */ sll $t7, $v0, 3
|
|
/* 08D800 7F058CD0 008F5021 */ addu $t2, $a0, $t7
|
|
/* 08D804 7F058CD4 C5500000 */ lwc1 $f16, ($t2)
|
|
/* 08D808 7F058CD8 C54E0004 */ lwc1 $f14, 4($t2)
|
|
/* 08D80C 7F058CDC 30590001 */ andi $t9, $v0, 1
|
|
/* 08D810 7F058CE0 46109402 */ mul.s $f16, $f18, $f16
|
|
/* 08D814 7F058CE4 00197080 */ sll $t6, $t9, 2
|
|
/* 08D818 7F058CE8 022E7821 */ addu $t7, $s1, $t6
|
|
/* 08D81C 7F058CEC C5F20000 */ lwc1 $f18, ($t7)
|
|
/* 08D820 7F058CF0 24470001 */ addiu $a3, $v0, 1
|
|
/* 08D824 7F058CF4 24480002 */ addiu $t0, $v0, 2
|
|
/* 08D828 7F058CF8 460E9382 */ mul.s $f14, $f18, $f14
|
|
/* 08D82C 7F058CFC 4600840D */ trunc.w.s $f16, $f16
|
|
/* 08D830 7F058D00 24490003 */ addiu $t1, $v0, 3
|
|
/* 08D834 7F058D04 24420004 */ addiu $v0, $v0, 4
|
|
/* 08D838 7F058D08 256B0010 */ addiu $t3, $t3, 0x10
|
|
/* 08D83C 7F058D0C 44038000 */ mfc1 $v1, $f16
|
|
/* 08D840 7F058D10 4600738D */ trunc.w.s $f14, $f14
|
|
/* 08D844 7F058D14 0072C824 */ and $t9, $v1, $s2
|
|
/* 08D848 7F058D18 0003C400 */ sll $t8, $v1, 0x10
|
|
/* 08D84C 7F058D1C 44067000 */ mfc1 $a2, $f14
|
|
/* 08D850 7F058D20 00000000 */ nop
|
|
/* 08D854 7F058D24 00067402 */ srl $t6, $a2, 0x10
|
|
/* 08D858 7F058D28 032E7825 */ or $t7, $t9, $t6
|
|
/* 08D85C 7F058D2C AD6FFFF0 */ sw $t7, -0x10($t3)
|
|
/* 08D860 7F058D30 30D9FFFF */ andi $t9, $a2, 0xffff
|
|
/* 08D864 7F058D34 03197025 */ or $t6, $t8, $t9
|
|
/* 08D868 7F058D38 AD6E0010 */ sw $t6, 0x10($t3)
|
|
/* 08D86C 7F058D3C C62E0000 */ lwc1 $f14, ($s1)
|
|
/* 08D870 7F058D40 0007C0C0 */ sll $t8, $a3, 3
|
|
/* 08D874 7F058D44 00986021 */ addu $t4, $a0, $t8
|
|
/* 08D878 7F058D48 C5900000 */ lwc1 $f16, ($t4)
|
|
/* 08D87C 7F058D4C C5920004 */ lwc1 $f18, 4($t4)
|
|
/* 08D880 7F058D50 30EE0001 */ andi $t6, $a3, 1
|
|
/* 08D884 7F058D54 46107402 */ mul.s $f16, $f14, $f16
|
|
/* 08D888 7F058D58 000E7880 */ sll $t7, $t6, 2
|
|
/* 08D88C 7F058D5C 022FC021 */ addu $t8, $s1, $t7
|
|
/* 08D890 7F058D60 C70E0000 */ lwc1 $f14, ($t8)
|
|
/* 08D894 7F058D64 46127482 */ mul.s $f18, $f14, $f18
|
|
/* 08D898 7F058D68 4600840D */ trunc.w.s $f16, $f16
|
|
/* 08D89C 7F058D6C 44038000 */ mfc1 $v1, $f16
|
|
/* 08D8A0 7F058D70 4600948D */ trunc.w.s $f18, $f18
|
|
/* 08D8A4 7F058D74 00727024 */ and $t6, $v1, $s2
|
|
/* 08D8A8 7F058D78 0003CC00 */ sll $t9, $v1, 0x10
|
|
/* 08D8AC 7F058D7C 44069000 */ mfc1 $a2, $f18
|
|
/* 08D8B0 7F058D80 00000000 */ nop
|
|
/* 08D8B4 7F058D84 00067C02 */ srl $t7, $a2, 0x10
|
|
/* 08D8B8 7F058D88 01CFC025 */ or $t8, $t6, $t7
|
|
/* 08D8BC 7F058D8C AD78FFF4 */ sw $t8, -0xc($t3)
|
|
/* 08D8C0 7F058D90 30CEFFFF */ andi $t6, $a2, 0xffff
|
|
/* 08D8C4 7F058D94 032E7825 */ or $t7, $t9, $t6
|
|
/* 08D8C8 7F058D98 AD6F0014 */ sw $t7, 0x14($t3)
|
|
/* 08D8CC 7F058D9C C6320000 */ lwc1 $f18, ($s1)
|
|
/* 08D8D0 7F058DA0 0008C8C0 */ sll $t9, $t0, 3
|
|
/* 08D8D4 7F058DA4 00996821 */ addu $t5, $a0, $t9
|
|
/* 08D8D8 7F058DA8 C5B00000 */ lwc1 $f16, ($t5)
|
|
/* 08D8DC 7F058DAC C5AE0004 */ lwc1 $f14, 4($t5)
|
|
/* 08D8E0 7F058DB0 310F0001 */ andi $t7, $t0, 1
|
|
/* 08D8E4 7F058DB4 46109402 */ mul.s $f16, $f18, $f16
|
|
/* 08D8E8 7F058DB8 000FC080 */ sll $t8, $t7, 2
|
|
/* 08D8EC 7F058DBC 0238C821 */ addu $t9, $s1, $t8
|
|
/* 08D8F0 7F058DC0 C7320000 */ lwc1 $f18, ($t9)
|
|
/* 08D8F4 7F058DC4 460E9382 */ mul.s $f14, $f18, $f14
|
|
/* 08D8F8 7F058DC8 4600840D */ trunc.w.s $f16, $f16
|
|
/* 08D8FC 7F058DCC 44038000 */ mfc1 $v1, $f16
|
|
/* 08D900 7F058DD0 4600738D */ trunc.w.s $f14, $f14
|
|
/* 08D904 7F058DD4 00727824 */ and $t7, $v1, $s2
|
|
/* 08D908 7F058DD8 00037400 */ sll $t6, $v1, 0x10
|
|
/* 08D90C 7F058DDC 44067000 */ mfc1 $a2, $f14
|
|
/* 08D910 7F058DE0 00000000 */ nop
|
|
/* 08D914 7F058DE4 0006C402 */ srl $t8, $a2, 0x10
|
|
/* 08D918 7F058DE8 01F8C825 */ or $t9, $t7, $t8
|
|
/* 08D91C 7F058DEC 30CFFFFF */ andi $t7, $a2, 0xffff
|
|
/* 08D920 7F058DF0 AD79FFF8 */ sw $t9, -8($t3)
|
|
/* 08D924 7F058DF4 01CFC025 */ or $t8, $t6, $t7
|
|
/* 08D928 7F058DF8 AD780018 */ sw $t8, 0x18($t3)
|
|
/* 08D92C 7F058DFC C62E0000 */ lwc1 $f14, ($s1)
|
|
/* 08D930 7F058E00 000970C0 */ sll $t6, $t1, 3
|
|
/* 08D934 7F058E04 008E8021 */ addu $s0, $a0, $t6
|
|
/* 08D938 7F058E08 C6100000 */ lwc1 $f16, ($s0)
|
|
/* 08D93C 7F058E0C C6120004 */ lwc1 $f18, 4($s0)
|
|
/* 08D940 7F058E10 31380001 */ andi $t8, $t1, 1
|
|
/* 08D944 7F058E14 46107402 */ mul.s $f16, $f14, $f16
|
|
/* 08D948 7F058E18 0018C880 */ sll $t9, $t8, 2
|
|
/* 08D94C 7F058E1C 02397021 */ addu $t6, $s1, $t9
|
|
/* 08D950 7F058E20 C5CE0000 */ lwc1 $f14, ($t6)
|
|
/* 08D954 7F058E24 46127482 */ mul.s $f18, $f14, $f18
|
|
/* 08D958 7F058E28 4600840D */ trunc.w.s $f16, $f16
|
|
/* 08D95C 7F058E2C 44038000 */ mfc1 $v1, $f16
|
|
/* 08D960 7F058E30 4600948D */ trunc.w.s $f18, $f18
|
|
/* 08D964 7F058E34 0072C024 */ and $t8, $v1, $s2
|
|
/* 08D968 7F058E38 00037C00 */ sll $t7, $v1, 0x10
|
|
/* 08D96C 7F058E3C 44069000 */ mfc1 $a2, $f18
|
|
/* 08D970 7F058E40 00000000 */ nop
|
|
/* 08D974 7F058E44 0006CC02 */ srl $t9, $a2, 0x10
|
|
/* 08D978 7F058E48 03197025 */ or $t6, $t8, $t9
|
|
/* 08D97C 7F058E4C 30D8FFFF */ andi $t8, $a2, 0xffff
|
|
/* 08D980 7F058E50 01F8C825 */ or $t9, $t7, $t8
|
|
/* 08D984 7F058E54 AD6EFFFC */ sw $t6, -4($t3)
|
|
/* 08D988 7F058E58 1453FF9B */ bne $v0, $s3, .L7F058CC8
|
|
/* 08D98C 7F058E5C AD79001C */ sw $t9, 0x1c($t3)
|
|
/* 08D990 7F058E60 8FB00008 */ lw $s0, 8($sp)
|
|
/* 08D994 7F058E64 8FB1000C */ lw $s1, 0xc($sp)
|
|
/* 08D998 7F058E68 8FB20010 */ lw $s2, 0x10($sp)
|
|
/* 08D99C 7F058E6C 8FB30014 */ lw $s3, 0x14($sp)
|
|
/* 08D9A0 7F058E70 03E00008 */ jr $ra
|
|
/* 08D9A4 7F058E74 27BD0018 */ addiu $sp, $sp, 0x18
|
|
)
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef NONMATCHING
|
|
void sub_GAME_7F058E78(void) {
|
|
|
|
}
|
|
#else
|
|
GLOBAL_ASM(
|
|
.text
|
|
glabel sub_GAME_7F058E78
|
|
/* 08D9A8 7F058E78 27BDFFE8 */ addiu $sp, $sp, -0x18
|
|
/* 08D9AC 7F058E7C AFB20010 */ sw $s2, 0x10($sp)
|
|
/* 08D9B0 7F058E80 AFB30014 */ sw $s3, 0x14($sp)
|
|
/* 08D9B4 7F058E84 AFB1000C */ sw $s1, 0xc($sp)
|
|
/* 08D9B8 7F058E88 3C128003 */ lui $s2, %hi(D_80032310)
|
|
/* 08D9BC 7F058E8C AFB00008 */ sw $s0, 8($sp)
|
|
/* 08D9C0 7F058E90 26522310 */ addiu $s2, %lo(D_80032310) # addiu $s2, $s2, 0x2310
|
|
/* 08D9C4 7F058E94 3C11FFFF */ lui $s1, 0xffff
|
|
/* 08D9C8 7F058E98 24130008 */ li $s3, 8
|
|
/* 08D9CC 7F058E9C 00001025 */ move $v0, $zero
|
|
/* 08D9D0 7F058EA0 00805025 */ move $t2, $a0
|
|
.L7F058EA4:
|
|
/* 08D9D4 7F058EA4 8D430000 */ lw $v1, ($t2)
|
|
/* 08D9D8 7F058EA8 8D460020 */ lw $a2, 0x20($t2)
|
|
/* 08D9DC 7F058EAC C6480000 */ lwc1 $f8, ($s2)
|
|
/* 08D9E0 7F058EB0 0071C024 */ and $t8, $v1, $s1
|
|
/* 08D9E4 7F058EB4 0006CC02 */ srl $t9, $a2, 0x10
|
|
/* 08D9E8 7F058EB8 03197025 */ or $t6, $t8, $t9
|
|
/* 08D9EC 7F058EBC 448E2000 */ mtc1 $t6, $f4
|
|
/* 08D9F0 7F058EC0 000278C0 */ sll $t7, $v0, 3
|
|
/* 08D9F4 7F058EC4 00AF5821 */ addu $t3, $a1, $t7
|
|
/* 08D9F8 7F058EC8 468021A0 */ cvt.s.w $f6, $f4
|
|
/* 08D9FC 7F058ECC 00037C00 */ sll $t7, $v1, 0x10
|
|
/* 08DA00 7F058ED0 30D8FFFF */ andi $t8, $a2, 0xffff
|
|
/* 08DA04 7F058ED4 01F8C825 */ or $t9, $t7, $t8
|
|
/* 08DA08 7F058ED8 44998000 */ mtc1 $t9, $f16
|
|
/* 08DA0C 7F058EDC 304E0001 */ andi $t6, $v0, 1
|
|
/* 08DA10 7F058EE0 46083283 */ div.s $f10, $f6, $f8
|
|
/* 08DA14 7F058EE4 000E7880 */ sll $t7, $t6, 2
|
|
/* 08DA18 7F058EE8 024FC021 */ addu $t8, $s2, $t7
|
|
/* 08DA1C 7F058EEC 24470001 */ addiu $a3, $v0, 1
|
|
/* 08DA20 7F058EF0 468084A0 */ cvt.s.w $f18, $f16
|
|
/* 08DA24 7F058EF4 000770C0 */ sll $t6, $a3, 3
|
|
/* 08DA28 7F058EF8 00AE6021 */ addu $t4, $a1, $t6
|
|
/* 08DA2C 7F058EFC 24480002 */ addiu $t0, $v0, 2
|
|
/* 08DA30 7F058F00 24490003 */ addiu $t1, $v0, 3
|
|
/* 08DA34 7F058F04 24420004 */ addiu $v0, $v0, 4
|
|
/* 08DA38 7F058F08 254A0010 */ addiu $t2, $t2, 0x10
|
|
/* 08DA3C 7F058F0C E56A0000 */ swc1 $f10, ($t3)
|
|
/* 08DA40 7F058F10 C7040000 */ lwc1 $f4, ($t8)
|
|
/* 08DA44 7F058F14 46049183 */ div.s $f6, $f18, $f4
|
|
/* 08DA48 7F058F18 E5660004 */ swc1 $f6, 4($t3)
|
|
/* 08DA4C 7F058F1C 8D460014 */ lw $a2, 0x14($t2)
|
|
/* 08DA50 7F058F20 8D43FFF4 */ lw $v1, -0xc($t2)
|
|
/* 08DA54 7F058F24 C6500000 */ lwc1 $f16, ($s2)
|
|
/* 08DA58 7F058F28 0006C402 */ srl $t8, $a2, 0x10
|
|
/* 08DA5C 7F058F2C 00717824 */ and $t7, $v1, $s1
|
|
/* 08DA60 7F058F30 01F8C825 */ or $t9, $t7, $t8
|
|
/* 08DA64 7F058F34 44994000 */ mtc1 $t9, $f8
|
|
/* 08DA68 7F058F38 30CFFFFF */ andi $t7, $a2, 0xffff
|
|
/* 08DA6C 7F058F3C 00037400 */ sll $t6, $v1, 0x10
|
|
/* 08DA70 7F058F40 468042A0 */ cvt.s.w $f10, $f8
|
|
/* 08DA74 7F058F44 01CFC025 */ or $t8, $t6, $t7
|
|
/* 08DA78 7F058F48 44982000 */ mtc1 $t8, $f4
|
|
/* 08DA7C 7F058F4C 30F90001 */ andi $t9, $a3, 1
|
|
/* 08DA80 7F058F50 00197080 */ sll $t6, $t9, 2
|
|
/* 08DA84 7F058F54 468021A0 */ cvt.s.w $f6, $f4
|
|
/* 08DA88 7F058F58 024E7821 */ addu $t7, $s2, $t6
|
|
/* 08DA8C 7F058F5C 0008C8C0 */ sll $t9, $t0, 3
|
|
/* 08DA90 7F058F60 00B96821 */ addu $t5, $a1, $t9
|
|
/* 08DA94 7F058F64 46105483 */ div.s $f18, $f10, $f16
|
|
/* 08DA98 7F058F68 E5920000 */ swc1 $f18, ($t4)
|
|
/* 08DA9C 7F058F6C C5E80000 */ lwc1 $f8, ($t7)
|
|
/* 08DAA0 7F058F70 46083283 */ div.s $f10, $f6, $f8
|
|
/* 08DAA4 7F058F74 E58A0004 */ swc1 $f10, 4($t4)
|
|
/* 08DAA8 7F058F78 8D460018 */ lw $a2, 0x18($t2)
|
|
/* 08DAAC 7F058F7C 8D43FFF8 */ lw $v1, -8($t2)
|
|
/* 08DAB0 7F058F80 C6440000 */ lwc1 $f4, ($s2)
|
|
/* 08DAB4 7F058F84 00067C02 */ srl $t7, $a2, 0x10
|
|
/* 08DAB8 7F058F88 00717024 */ and $t6, $v1, $s1
|
|
/* 08DABC 7F058F8C 01CFC025 */ or $t8, $t6, $t7
|
|
/* 08DAC0 7F058F90 44988000 */ mtc1 $t8, $f16
|
|
/* 08DAC4 7F058F94 30CEFFFF */ andi $t6, $a2, 0xffff
|
|
/* 08DAC8 7F058F98 0003CC00 */ sll $t9, $v1, 0x10
|
|
/* 08DACC 7F058F9C 468084A0 */ cvt.s.w $f18, $f16
|
|
/* 08DAD0 7F058FA0 032E7825 */ or $t7, $t9, $t6
|
|
/* 08DAD4 7F058FA4 448F4000 */ mtc1 $t7, $f8
|
|
/* 08DAD8 7F058FA8 31180001 */ andi $t8, $t0, 1
|
|
/* 08DADC 7F058FAC 0018C880 */ sll $t9, $t8, 2
|
|
/* 08DAE0 7F058FB0 468042A0 */ cvt.s.w $f10, $f8
|
|
/* 08DAE4 7F058FB4 02597021 */ addu $t6, $s2, $t9
|
|
/* 08DAE8 7F058FB8 0009C0C0 */ sll $t8, $t1, 3
|
|
/* 08DAEC 7F058FBC 00B88021 */ addu $s0, $a1, $t8
|
|
/* 08DAF0 7F058FC0 46049183 */ div.s $f6, $f18, $f4
|
|
/* 08DAF4 7F058FC4 E5A60000 */ swc1 $f6, ($t5)
|
|
/* 08DAF8 7F058FC8 C5D00000 */ lwc1 $f16, ($t6)
|
|
/* 08DAFC 7F058FCC 46105483 */ div.s $f18, $f10, $f16
|
|
/* 08DB00 7F058FD0 E5B20004 */ swc1 $f18, 4($t5)
|
|
/* 08DB04 7F058FD4 8D46001C */ lw $a2, 0x1c($t2)
|
|
/* 08DB08 7F058FD8 8D43FFFC */ lw $v1, -4($t2)
|
|
/* 08DB0C 7F058FDC C6480000 */ lwc1 $f8, ($s2)
|
|
/* 08DB10 7F058FE0 00067402 */ srl $t6, $a2, 0x10
|
|
/* 08DB14 7F058FE4 0071C824 */ and $t9, $v1, $s1
|
|
/* 08DB18 7F058FE8 032E7825 */ or $t7, $t9, $t6
|
|
/* 08DB1C 7F058FEC 448F2000 */ mtc1 $t7, $f4
|
|
/* 08DB20 7F058FF0 30D9FFFF */ andi $t9, $a2, 0xffff
|
|
/* 08DB24 7F058FF4 0003C400 */ sll $t8, $v1, 0x10
|
|
/* 08DB28 7F058FF8 468021A0 */ cvt.s.w $f6, $f4
|
|
/* 08DB2C 7F058FFC 03197025 */ or $t6, $t8, $t9
|
|
/* 08DB30 7F059000 448E8000 */ mtc1 $t6, $f16
|
|
/* 08DB34 7F059004 312F0001 */ andi $t7, $t1, 1
|
|
/* 08DB38 7F059008 000FC080 */ sll $t8, $t7, 2
|
|
/* 08DB3C 7F05900C 468084A0 */ cvt.s.w $f18, $f16
|
|
/* 08DB40 7F059010 0258C821 */ addu $t9, $s2, $t8
|
|
/* 08DB44 7F059014 46083283 */ div.s $f10, $f6, $f8
|
|
/* 08DB48 7F059018 E60A0000 */ swc1 $f10, ($s0)
|
|
/* 08DB4C 7F05901C C7240000 */ lwc1 $f4, ($t9)
|
|
/* 08DB50 7F059020 46049183 */ div.s $f6, $f18, $f4
|
|
/* 08DB54 7F059024 1453FF9F */ bne $v0, $s3, .L7F058EA4
|
|
/* 08DB58 7F059028 E6060004 */ swc1 $f6, 4($s0)
|
|
/* 08DB5C 7F05902C 8FB00008 */ lw $s0, 8($sp)
|
|
/* 08DB60 7F059030 8FB1000C */ lw $s1, 0xc($sp)
|
|
/* 08DB64 7F059034 8FB20010 */ lw $s2, 0x10($sp)
|
|
/* 08DB68 7F059038 8FB30014 */ lw $s3, 0x14($sp)
|
|
/* 08DB6C 7F05903C 03E00008 */ jr $ra
|
|
/* 08DB70 7F059040 27BD0018 */ addiu $sp, $sp, 0x18
|
|
)
|
|
#endif
|
|
|
|
void matrix_4x4_7F059044(Mtxf *arg0, Mtx* arg1) {
|
|
s32 i, j;
|
|
for (i = 0; i < 4; i++) {
|
|
for (j = 0; j < 4; j++) {
|
|
arg1->m[i][j] = arg0->m[i][j] * 65536.0f;
|
|
}
|
|
}
|
|
}
|
|
|
|
void matrix_4x4_7F05914C(Mtx* arg0, Mtxf *arg1) {
|
|
s32 i, j;
|
|
for (i = 0; i < 4; i++) {
|
|
for (j = 0; j < 4; j++) {
|
|
arg1->m[i][j] = arg0->m[i][j] / 65536.0f;
|
|
}
|
|
}
|
|
}
|
|
|
|
//#ifdef NONMATCHING
|
|
#if 0
|
|
#define MTX_INTPART_PACK(w1, w2) (((w1) & 0xFFFF0000) | ((w2) >> 16))
|
|
#define MTX_FRACPART_PACK(w1, w2) (((w1) << 16) | ((w2) & 0xFFFF))
|
|
|
|
void sub_GAME_7F059244(Mtx* a0, Mtx* a1) {
|
|
// s32 i;
|
|
// s32 j;
|
|
// u32 w1;
|
|
// u32 w2;
|
|
// for (i = 0; i < 2; i++) {
|
|
// for (j = 0; j < 4; j++) {
|
|
// w1 = a0->m[i * 2 + j / 2][((j * 2) % 4) + 0];
|
|
// w2 = a0->m[i * 2 + j / 2][((j * 2) % 4) + 1];
|
|
// a1->m[i + 0][j] = MTX_INTPART_PACK(w1, w2);
|
|
// a1->m[i + 2][j] = MTX_FRACPART_PACK(w1, w2);
|
|
// }
|
|
// }
|
|
|
|
// Reg alloc and iteration mostly!
|
|
// s32 i;
|
|
// s32 j;
|
|
// for (i = 0; i < 2; i++) {
|
|
// for (j = 0; j < 4; j++) {
|
|
// u32 w1 = a0[i * 2 + j / 2][(j % 2) * 2 + 0];
|
|
// u32 w2 = a0[i * 2 + j / 2][(j % 2) * 2 + 1];
|
|
// a1[i + 0][j] = MTX_INTPART_PACK(w1, w2);
|
|
// a1[i + 2][j] = MTX_FRACPART_PACK(w1, w2);
|
|
// }
|
|
// }
|
|
|
|
// s32 i;
|
|
// s32 j;
|
|
// s32 *mtxInt = (s32 *)&a1[0][0];
|
|
// s32 *mtxFrc = (s32 *)&a1[2][0];
|
|
// for (i = 0; i < 8; i++) {
|
|
// *mtxInt++ = MTX_INTPART_PACK(a0[i * 2], (u32)a0[i * 2 + 1]);
|
|
// *mtxFrc++ = MTX_FRACPART_PACK(a0[i * 2], a0[i * 2 + 1]);
|
|
// }
|
|
|
|
// s32 i;
|
|
// s32 j;
|
|
// s32 *mtxInt = (s32 *)&a1[0][0];
|
|
// s32 *mtxFrc = (s32 *)&a1[2][0];
|
|
// for (i = 0; i < 8; i++) {
|
|
// *mtxInt++ = MTX_INTPART_PACK(a0[i * 2], (u32)a0[i * 2 + 1]);
|
|
// *mtxFrc++ = MTX_FRACPART_PACK(a0[i * 2], a0[i * 2 + 1]);
|
|
// }
|
|
// s32 i;
|
|
// s32 j;
|
|
// for (i = 0; i < 2; i++) {
|
|
// for (j = 0; j < 4; j++) {
|
|
// a1[i + 0][j] = MTX_INTPART_PACK(a0[i * 8 + j * 2], (u32)a0[i * 8 + j*2 + 1]);
|
|
// a1[i + 2][j] = MTX_FRACPART_PACK(a0[i * 8 + j * 2], a0[i * 8 + j*2 + 1]);
|
|
// }
|
|
// }
|
|
|
|
s32 i;
|
|
s32 j;
|
|
s32* ptr = &a0->m[0][0];
|
|
for (i = 0; i < 2; i++) {
|
|
for (j = 0; j < 4; j++) {
|
|
s32 w1 = *ptr++;
|
|
s32 w2 = *ptr++;
|
|
a1->m[i + 0][j] = MTX_INTPART_PACK(w1, (u32)w2);
|
|
a1->m[i + 2][j] = MTX_FRACPART_PACK(w1, w2);
|
|
}
|
|
}
|
|
|
|
// s32 i;
|
|
// s32 j;
|
|
// s32 w1;
|
|
// s32 w2;
|
|
// for (i = 0; i < 2; i++) {
|
|
// for (j = 0; j < 4; j++) {
|
|
// w1 = a0[i * 8 + j * 2 + 0];
|
|
// w2 = a0[i * 8 + j * 2 + 1];
|
|
// a1[i + 0][j] = MTX_INTPART_PACK(w1, (u32)w2);
|
|
// a1[i + 2][j] = MTX_FRACPART_PACK(w1, w2);
|
|
// }
|
|
// }
|
|
|
|
// s32 i = 0;
|
|
// s32 *w1 = &a0[0][0];
|
|
// s32 *w2 = &a0[0][1];
|
|
// for (i = 0; i < 2; i++) {
|
|
// a1[i + 0][0] = MTX_INTPART_PACK(*w1, (u32)*w2);
|
|
// a1[i + 2][0] = MTX_FRACPART_PACK(*w1, *w2);
|
|
// w1 += 2;
|
|
// w2 += 2;
|
|
// a1[i + 0][1] = MTX_INTPART_PACK(*w1, (u32)*w2);
|
|
// a1[i + 2][1] = MTX_FRACPART_PACK(*w1, *w2);
|
|
// w1 += 2;
|
|
// w2 += 2;
|
|
// a1[i + 0][2] = MTX_INTPART_PACK(*w1, (u32)*w2);
|
|
// a1[i + 2][2] = MTX_FRACPART_PACK(*w1, *w2);
|
|
// w1 += 2;
|
|
// w2 += 2;
|
|
// a1[i + 0][3] = MTX_INTPART_PACK(*w1, (u32)*w2);
|
|
// a1[i + 2][3] = MTX_FRACPART_PACK(*w1, *w2);
|
|
// }
|
|
|
|
// s32 i = 0;
|
|
// s32 w1;
|
|
// s32 w2;
|
|
// for (i = 0; i < 2; i++) {
|
|
// w1 = a0[i * 2 + 0][0];
|
|
// w2 = a0[i * 2 + 0][1];
|
|
// a1[i + 0][0] = MTX_INTPART_PACK(w1, (u32)w2);
|
|
// a1[i + 2][0] = MTX_FRACPART_PACK(w1, w2);
|
|
// w1 = a0[i * 2 + 0][2];
|
|
// w2 = a0[i * 2 + 0][3];
|
|
// a1[i + 0][1] = MTX_INTPART_PACK(w1, (u32)w2);
|
|
// a1[i + 2][1] = MTX_FRACPART_PACK(w1, w2);
|
|
// w1 = a0[i * 2 + 1][0];
|
|
// w2 = a0[i * 2 + 1][1];
|
|
// a1[i + 0][2] = MTX_INTPART_PACK(w1, (u32)w2);
|
|
// a1[i + 2][2] = MTX_FRACPART_PACK(w1, w2);
|
|
// w1 = a0[i * 2 + 1][2];
|
|
// w2 = a0[i * 2 + 1][3];
|
|
// a1[i + 0][3] = MTX_INTPART_PACK(w1, (u32)w2);
|
|
// a1[i + 2][3] = MTX_FRACPART_PACK(w1, w2);
|
|
// }
|
|
|
|
|
|
// s32 i;
|
|
// for (i = 0; i < 2; i++) {
|
|
// a1[i + 0][0] = MTX_INTPART_PACK(a0[i * 2 + 0][0], (u32)a0[i * 2 + 0][1]);
|
|
// a1[i + 2][0] = MTX_FRACPART_PACK(a0[i * 2 + 0][0], a0[i * 2 + 0][1]);
|
|
// a1[i + 0][1] = MTX_INTPART_PACK(a0[i * 2 + 0][2], (u32)a0[i * 2 + 0][3]);
|
|
// a1[i + 2][1] = MTX_FRACPART_PACK(a0[i * 2 + 0][2], a0[i * 2 + 0][3]);
|
|
// a1[i + 0][2] = MTX_INTPART_PACK(a0[i * 2 + 1][0], (u32)a0[i * 2 + 1][1]);
|
|
// a1[i + 2][2] = MTX_FRACPART_PACK(a0[i * 2 + 1][0], a0[i * 2 + 1][1]);
|
|
// a1[i + 0][3] = MTX_INTPART_PACK(a0[i * 2 + 1][2], (u32)a0[i * 2 + 1][3]);
|
|
// a1[i + 2][3] = MTX_FRACPART_PACK(a0[i * 2 + 1][2], a0[i * 2 + 1][3]);
|
|
// }
|
|
|
|
|
|
// a1[0][0] = MTX_INTPART_PACK(a0[0][0], (u32)a0[0][1]);
|
|
// a1[2][0] = MTX_FRACPART_PACK(a0[0][0], a0[0][1]);
|
|
// a1[0][1] = MTX_INTPART_PACK(a0[0][2], (u32)a0[0][3]);
|
|
// a1[2][1] = MTX_FRACPART_PACK(a0[0][2], a0[0][3]);
|
|
// a1[0][2] = MTX_INTPART_PACK(a0[1][0], (u32)a0[1][1]);
|
|
// a1[2][2] = MTX_FRACPART_PACK(a0[1][0], a0[1][1]);
|
|
// a1[0][3] = MTX_INTPART_PACK(a0[1][2], (u32)a0[1][3]);
|
|
// a1[2][3] = MTX_FRACPART_PACK(a0[1][2], a0[1][3]);
|
|
|
|
// a1[1][0] = MTX_INTPART_PACK(a0[2][0], (u32)a0[2][1]);
|
|
// a1[3][0] = MTX_FRACPART_PACK(a0[2][0], a0[2][1]);
|
|
// a1[1][1] = MTX_INTPART_PACK(a0[2][2], (u32)a0[2][3]);
|
|
// a1[3][1] = MTX_FRACPART_PACK(a0[2][2], a0[2][3]);
|
|
// a1[1][2] = MTX_INTPART_PACK(a0[3][0], (u32)a0[3][1]);
|
|
// a1[3][2] = MTX_FRACPART_PACK(a0[3][0], a0[3][1]);
|
|
// a1[1][3] = MTX_INTPART_PACK(a0[3][2], (u32)a0[3][3]);
|
|
// a1[3][3] = MTX_FRACPART_PACK(a0[3][2], a0[3][3]);
|
|
|
|
/* $v0 = 0
|
|
loop:
|
|
$a1 += 0x10
|
|
$v1 = *($a0 + $v0 * 8 + 0x00)
|
|
$a2 = *($a0 + $v0 * 8 + 0x04)
|
|
*($a1 - 0x10) = MTX_INTPART_PACK($v1, (u32)$a2)
|
|
*($a1 + 0x10) = MTX_FRACPART_PACK($v1, $a2)
|
|
$v1 = *($a0 + ($v0 + 1) * 8 + 0x00)
|
|
$a2 = *($a0 + ($v0 + 1) * 8 + 0x04)
|
|
*($a1 - 0x0C) = MTX_INTPART_PACK($v1, (u32)$a2)
|
|
*($a1 + 0x14) = MTX_FRACPART_PACK($v1, $a2)
|
|
$v1 = *($a0 + ($v0 + 2) * 8 + 0x00)
|
|
$a2 = *($a0 + ($v0 + 2) * 8 + 0x04)
|
|
*($a1 - 0x08) = MTX_INTPART_PACK($v1, (u32)$a2)
|
|
*($a1 + 0x18) = MTX_FRACPART_PACK($v1, $a2)
|
|
$v1 = *($a0 + ($v0 + 3) * 8 + 0x00)
|
|
$a2 = *($a0 + ($v0 + 3) * 8 + 0x04)
|
|
*($a1 - 0x04) = MTX_INTPART_PACK($v1, (u32)$a2)
|
|
*($a1 + 0x1C) = MTX_FRACPART_PACK($v1, $a2)
|
|
$v0 += 4
|
|
if ($v0 != 8) {
|
|
goto loop;
|
|
}*/
|
|
}
|
|
#else
|
|
GLOBAL_ASM(
|
|
.text
|
|
glabel sub_GAME_7F059244
|
|
/* 08DD74 7F059244 00001025 */ move $v0, $zero
|
|
/* 08DD78 7F059248 00A04025 */ move $t0, $a1
|
|
/* 08DD7C 7F05924C 240D0008 */ li $t5, 8
|
|
/* 08DD80 7F059250 3C0CFFFF */ lui $t4, 0xffff
|
|
.L7F059254:
|
|
/* 08DD84 7F059254 000278C0 */ sll $t7, $v0, 3
|
|
/* 08DD88 7F059258 008F3821 */ addu $a3, $a0, $t7
|
|
/* 08DD8C 7F05925C 8CE30000 */ lw $v1, ($a3)
|
|
/* 08DD90 7F059260 8CE60004 */ lw $a2, 4($a3)
|
|
/* 08DD94 7F059264 25080010 */ addiu $t0, $t0, 0x10
|
|
/* 08DD98 7F059268 006CC024 */ and $t8, $v1, $t4
|
|
/* 08DD9C 7F05926C 0006CC02 */ srl $t9, $a2, 0x10
|
|
/* 08DDA0 7F059270 03197025 */ or $t6, $t8, $t9
|
|
/* 08DDA4 7F059274 00037C00 */ sll $t7, $v1, 0x10
|
|
/* 08DDA8 7F059278 30D8FFFF */ andi $t8, $a2, 0xffff
|
|
/* 08DDAC 7F05927C 01F8C825 */ or $t9, $t7, $t8
|
|
/* 08DDB0 7F059280 244F0001 */ addiu $t7, $v0, 1
|
|
/* 08DDB4 7F059284 000FC0C0 */ sll $t8, $t7, 3
|
|
/* 08DDB8 7F059288 00984821 */ addu $t1, $a0, $t8
|
|
/* 08DDBC 7F05928C AD0EFFF0 */ sw $t6, -0x10($t0)
|
|
/* 08DDC0 7F059290 AD190010 */ sw $t9, 0x10($t0)
|
|
/* 08DDC4 7F059294 8D260004 */ lw $a2, 4($t1)
|
|
/* 08DDC8 7F059298 8D230000 */ lw $v1, ($t1)
|
|
/* 08DDCC 7F05929C 00067402 */ srl $t6, $a2, 0x10
|
|
/* 08DDD0 7F0592A0 006CC824 */ and $t9, $v1, $t4
|
|
/* 08DDD4 7F0592A4 032E7825 */ or $t7, $t9, $t6
|
|
/* 08DDD8 7F0592A8 30D9FFFF */ andi $t9, $a2, 0xffff
|
|
/* 08DDDC 7F0592AC 0003C400 */ sll $t8, $v1, 0x10
|
|
/* 08DDE0 7F0592B0 03197025 */ or $t6, $t8, $t9
|
|
/* 08DDE4 7F0592B4 24580002 */ addiu $t8, $v0, 2
|
|
/* 08DDE8 7F0592B8 0018C8C0 */ sll $t9, $t8, 3
|
|
/* 08DDEC 7F0592BC 00995021 */ addu $t2, $a0, $t9
|
|
/* 08DDF0 7F0592C0 AD0E0014 */ sw $t6, 0x14($t0)
|
|
/* 08DDF4 7F0592C4 AD0FFFF4 */ sw $t7, -0xc($t0)
|
|
/* 08DDF8 7F0592C8 8D460004 */ lw $a2, 4($t2)
|
|
/* 08DDFC 7F0592CC 8D430000 */ lw $v1, ($t2)
|
|
/* 08DE00 7F0592D0 00067C02 */ srl $t7, $a2, 0x10
|
|
/* 08DE04 7F0592D4 006C7024 */ and $t6, $v1, $t4
|
|
/* 08DE08 7F0592D8 01CFC025 */ or $t8, $t6, $t7
|
|
/* 08DE0C 7F0592DC 30CEFFFF */ andi $t6, $a2, 0xffff
|
|
/* 08DE10 7F0592E0 0003CC00 */ sll $t9, $v1, 0x10
|
|
/* 08DE14 7F0592E4 032E7825 */ or $t7, $t9, $t6
|
|
/* 08DE18 7F0592E8 24590003 */ addiu $t9, $v0, 3
|
|
/* 08DE1C 7F0592EC 001970C0 */ sll $t6, $t9, 3
|
|
/* 08DE20 7F0592F0 008E5821 */ addu $t3, $a0, $t6
|
|
/* 08DE24 7F0592F4 AD0F0018 */ sw $t7, 0x18($t0)
|
|
/* 08DE28 7F0592F8 AD18FFF8 */ sw $t8, -8($t0)
|
|
/* 08DE2C 7F0592FC 8D660004 */ lw $a2, 4($t3)
|
|
/* 08DE30 7F059300 8D630000 */ lw $v1, ($t3)
|
|
/* 08DE34 7F059304 24420004 */ addiu $v0, $v0, 4
|
|
/* 08DE38 7F059308 0006C402 */ srl $t8, $a2, 0x10
|
|
/* 08DE3C 7F05930C 006C7824 */ and $t7, $v1, $t4
|
|
/* 08DE40 7F059310 01F8C825 */ or $t9, $t7, $t8
|
|
/* 08DE44 7F059314 30CFFFFF */ andi $t7, $a2, 0xffff
|
|
/* 08DE48 7F059318 00037400 */ sll $t6, $v1, 0x10
|
|
/* 08DE4C 7F05931C 01CFC025 */ or $t8, $t6, $t7
|
|
/* 08DE50 7F059320 AD18001C */ sw $t8, 0x1c($t0)
|
|
/* 08DE54 7F059324 144DFFCB */ bne $v0, $t5, .L7F059254
|
|
/* 08DE58 7F059328 AD19FFFC */ sw $t9, -4($t0)
|
|
/* 08DE5C 7F05932C 03E00008 */ jr $ra
|
|
/* 08DE60 7F059330 00000000 */ nop
|
|
)
|
|
#endif
|
|
|
|
/*
|
|
for ($v0 = 0; $v0 < 2; $v0++) { // pointers?
|
|
$a1[$v0 * 2 + 0][0] = $a0[$v0][0] & 0xFFFF0000 | ($a0[$v0 + 2][0] >> 16)
|
|
$a1[$v0 * 2 + 0][1] = $a0[$v0][0] << 16 | ($a0[$v0 + 2][0] & 0xFFFF)
|
|
$a1[$v0 * 2 + 0][2] = $a0[$v0][1] & 0xFFFF0000 | $a0[$v0 + 2][1] >> 16
|
|
$a1[$v0 * 2 + 0][3] = $a0[$v0][1] << 16 | $a0[$v0 + 2][1] & 0xFFFF
|
|
$a1[$v0 * 2 + 1][0] = $a0[$v0][2] & 0xFFFF0000 | $a0[$v0 + 2][2] << 16
|
|
$a1[$v0 * 2 + 1][1] = $a0[$v0][2] << 16 | $a0[$v0 + 2][2] & 0xFFFF
|
|
$a1[$v0 * 2 + 1][2] = $a0[$v0][3] & 0xFFFF0000 | $a0[$v0 + 2][3] >> 16
|
|
$a1[$v0 * 2 + 1][3] = $a0[$v0][3] << 16 | $a0[$v0 + 2][3] & 0xffff
|
|
}
|
|
|
|
*/
|
|
|
|
/*
|
|
$v0 = 0
|
|
$a3 = $a0
|
|
loop:
|
|
$v1 = *($a3)
|
|
$a2 = *($a3 + 0x20)
|
|
$t0 = $a1 + (($v0 + 0) * 8)
|
|
*($t0) = ($v1 & 0xFFFF0000) | ($a2 >> 16)
|
|
*($t0 + 0x4) = ($v1 << 16) | ($a2 & 0xFFFF)
|
|
$a2 = *($a3 + 0x24)
|
|
$v1 = *($a3 + 0x4)
|
|
$t1 = $a1 + (($v0 + 1) * 8)
|
|
*($t1 + 0) = $v1 & 0xFFFF0000 | $a2 >> 16
|
|
*($t1 + 4) = $v1 << 16 | $a2 & 0xFFFF
|
|
$a2 = *($a3 + 0x28)
|
|
$v1 = *($a3 + 0x8)
|
|
$t2 = $a1 + (($v0 + 2) * 8)
|
|
*($t2 + 0) = $v1 & 0xFFFF0000 | $a2 << 16
|
|
*($t2 + 4) = $v1 << 16 | $a2 & 0xFFFF
|
|
$a2 = *($a3 + 0x2C)
|
|
$v1 = *($a3 + 0xC)
|
|
$t3 = $a1 + (($v0 + 3) * 8)
|
|
$v0 += 4
|
|
*($t3 + 0) = $v1 & 0xFFFF0000 | $a2 >> 16
|
|
*($t3 + 4) = $v1 << 16 | $a2 & 0xffff
|
|
if ($v0 != 8)
|
|
{
|
|
$a3 += 0x10;
|
|
goto loop;
|
|
}
|
|
return
|
|
|
|
*/
|
|
/*
|
|
0, 0
|
|
0, 1
|
|
0, 2
|
|
0, 3
|
|
1, 0
|
|
1, 1
|
|
1, 2
|
|
1, 3
|
|
2, 0
|
|
*/
|
|
|
|
// void sub_GAME_7F059334(mat4s arg0, mat4s arg1) {
|
|
// s32 var1;
|
|
// s32 var2;
|
|
// s32 i, j;
|
|
// for (i = 0; i < 2; i++) {
|
|
// for (j = 0; j < 2; j++) {
|
|
// var1 = arg0[i + 0][j + 0];
|
|
// var2 = arg0[i + 2][j + 0];
|
|
// arg1[i * 2 + 0][] [i * 8 + j * 2 + 0] = ((var1 & 0xFFFF0000) | (var2 >> 16));
|
|
// arg1[i * 2 + 0] * 2 + 1] = ((var1 << 16) | (var2 & 0xFFFF));
|
|
// var1 = arg0[i + 0][j + 1];
|
|
// var2 = arg0[i + 2][j + 1];
|
|
// arg1[i * 2 + 1][2] = ((var1 & 0xFFFF0000) | (var2 >> 16));
|
|
// arg1[i * 2 + 1][3] = ((var1 << 16) | (var2 & 0xFFFF));
|
|
// // var1 = arg0[i + 0][2];
|
|
// // var2 = arg0[i + 2][2];
|
|
// // arg1[i * 2 + 1][0] = ((var1 & 0xFFFF0000) | (var2 << 16));
|
|
// // arg1[i * 2 + 1][1] = ((var1 << 16) | (var2 & 0xFFFF));
|
|
// // var1 = arg0[i + 0][3];
|
|
// // var2 = arg0[i + 2][3];
|
|
// // arg1[i * 2 + 1][2] = ((var1 & 0xFFFF0000) | (var2 >> 16));
|
|
// // arg1[i * 2 + 1][3] = ((var1 << 16) | (var2 & 0xffff));
|
|
// }
|
|
// }
|
|
|
|
|
|
|
|
|
|
// sub_GAME_7F059334(s32* arg0, s32* arg1) {
|
|
// s32* var1 = arg0;
|
|
// s32* var2 = arg1;
|
|
// for (i = 0; i < 2; i++) {
|
|
// for (; var1 < (arg0 + 8); var1++, var2 += 4)
|
|
// var1 = arg0[i + 0][0];
|
|
// var2 = arg0[i + 2][0];
|
|
// arg1[i * 2 + 0][0] = ((var1 & 0xFFFF0000) | (var2 >> 16));
|
|
// arg1[i * 2 + 0][1] = ((var1 << 16) | (var2 & 0xFFFF));
|
|
// var1 = arg0[i + 0][1];
|
|
// var2 = arg0[i + 2][1];
|
|
// arg1[i * 2 + 0][2] = ((var1 & 0xFFFF0000) | (var2 >> 16));
|
|
// arg1[i * 2 + 0][3] = ((var1 << 16) | (var2 & 0xFFFF));
|
|
// var1 = arg0[i + 0][2];
|
|
// var2 = arg0[i + 2][2];
|
|
// arg1[i * 2 + 1][0] = ((var1 & 0xFFFF0000) | (var2 << 16));
|
|
// arg1[i * 2 + 1][1] = ((var1 << 16) | (var2 & 0xFFFF));
|
|
// var1 = arg0[i + 0][3];
|
|
// var2 = arg0[i + 2][3];
|
|
// arg1[i * 2 + 1][2] = ((var1 & 0xFFFF0000) | (var2 >> 16));
|
|
// arg1[i * 2 + 1][3] = ((var1 << 16) | (var2 & 0xffff));
|
|
// }
|
|
|
|
// s32 var1;
|
|
// s32 var2;
|
|
// s32 i;
|
|
// for (i = 0; i < 2; i++) {
|
|
// var1 = arg0[i + 0][0];
|
|
// var2 = arg0[i + 2][0];
|
|
// arg1[i * 2 + 0][0] = ((var1 & 0xFFFF0000) | (var2 >> 16));
|
|
// arg1[i * 2 + 0][1] = ((var1 << 16) | (var2 & 0xFFFF));
|
|
// var1 = arg0[i + 0][1];
|
|
// var2 = arg0[i + 2][1];
|
|
// arg1[i * 2 + 0][2] = ((var1 & 0xFFFF0000) | (var2 >> 16));
|
|
// arg1[i * 2 + 0][3] = ((var1 << 16) | (var2 & 0xFFFF));
|
|
// var1 = arg0[i + 0][2];
|
|
// var2 = arg0[i + 2][2];
|
|
// arg1[i * 2 + 1][0] = ((var1 & 0xFFFF0000) | (var2 << 16));
|
|
// arg1[i * 2 + 1][1] = ((var1 << 16) | (var2 & 0xFFFF));
|
|
// var1 = arg0[i + 0][3];
|
|
// var2 = arg0[i + 2][3];
|
|
// arg1[i * 2 + 1][2] = ((var1 & 0xFFFF0000) | (var2 >> 16));
|
|
// arg1[i * 2 + 1][3] = ((var1 << 16) | (var2 & 0xffff));
|
|
// }
|
|
|
|
// s32 temp_v1;
|
|
// s32 temp_v1_2;
|
|
// s32 temp_v1_3;
|
|
// s32 temp_v1_4;
|
|
// u32 temp_a2;
|
|
// u32 temp_a2_2;
|
|
// u32 temp_a2_3;
|
|
// u32 temp_a2_4;
|
|
// s32 i;
|
|
|
|
// for (i = 0; i < 2; i++) {
|
|
// temp_v1 = arg0[i + 0][0];
|
|
// temp_a2 = arg0[i + 2][0];
|
|
// arg1[i * 2][0] = ((temp_v1 & 0xFFFF0000) | (temp_a2 >> 0x10));
|
|
// arg1[i * 2][1] = ((temp_v1 << 0x10) | (temp_a2 & 0xFFFF));
|
|
// temp_v1_2 = arg0[i + 0][1];
|
|
// temp_a2_2 = arg0[i + 2][1];
|
|
// arg1[i * 2][2] = ((temp_v1_2 & 0xFFFF0000) | (temp_a2_2 >> 0x10));
|
|
// arg1[i * 2][3] = ((temp_v1_2 << 0x10) | (temp_a2_2 & 0xFFFF));
|
|
// temp_v1_3 = arg0[i + 0][2];
|
|
// temp_a2_3 = arg0[i + 2][2];
|
|
// arg1[i * 2 + 1][0] = ((temp_v1_3 & 0xFFFF0000) | (temp_a2_3 >> 0x10));
|
|
// arg1[i * 2 + 1][1] = ((temp_v1_3 << 0x10) | (temp_a2_3 & 0xFFFF));
|
|
// temp_v1_4 = arg0[i + 0][3];
|
|
// temp_a2_4 = arg0[i + 2][3];
|
|
// arg1[i * 2 + 1][2] = ((temp_v1_4 & 0xFFFF0000) | (temp_a2_4 >> 0x10));
|
|
// arg1[i * 2 + 1][3] = ((temp_v1_4 << 0x10) | (temp_a2_4 & 0xFFFF));
|
|
// }
|
|
//}
|
|
|
|
#ifdef NONMATCHING
|
|
#define MTX_INTPART_PACK(w1, w2) (((w1) & 0xFFFF0000) | (((w2) >> 16)/* & 0xFFFF*/))
|
|
#define MTX_FRACPART_PACK(w1, w2) ((((w1) << 16) & 0xFFFF0000) | ((w2) & 0xFFFF))
|
|
|
|
// void sub_GAME_7F059334(s32 arg0[4][4], s32 arg1[4][4]) {
|
|
// s32 i;
|
|
// s32 j;
|
|
// u32 *m1 = (u32*)&arg0[0][0];
|
|
// u32 *m2 = (u32*)&arg0[2][0];
|
|
// for (i = 0; i < 4; i++) {
|
|
// for (j = 0; j < 2; j++) {
|
|
// arg1[i][j * 2 + 0] = MTX_INTPART_PACK((*m1), (*m2));
|
|
// m1++;
|
|
// arg1[i][j * 2 + 1] = MTX_FRACPART_PACK((*m1), (*m2));
|
|
// m2++;
|
|
// }
|
|
// }
|
|
|
|
|
|
// s32 var1;
|
|
// u32 var2;
|
|
// s32 i;
|
|
// for ()
|
|
// for (i = 0; i < 2; i++) {
|
|
// var1 = arg0[i + 0][0];
|
|
// var2 = arg0[i + 2][0];
|
|
// arg1[i * 2 + 0][0] = ((var1 & 0xFFFF0000) | (var2 >> 16));
|
|
// arg1[i * 2 + 0][1] = ((var1 << 16) | (var2 & 0xFFFF));
|
|
// var1 = arg0[i + 0][1];
|
|
// var2 = arg0[i + 2][1];
|
|
// arg1[i * 2 + 0][2] = ((var1 & 0xFFFF0000) | (var2 >> 16));
|
|
// arg1[i * 2 + 0][3] = ((var1 << 16) | (var2 & 0xFFFF));
|
|
// var1 = arg0[i + 0][2];
|
|
// var2 = arg0[i + 2][2];
|
|
// arg1[i * 2 + 1][0] = ((var1 & 0xFFFF0000) | (var2 << 16));
|
|
// arg1[i * 2 + 1][1] = ((var1 << 16) | (var2 & 0xFFFF));
|
|
// var1 = arg0[i + 0][3];
|
|
// var2 = arg0[i + 2][3];
|
|
// arg1[i * 2 + 1][2] = ((var1 & 0xFFFF0000) | (var2 >> 16));
|
|
// arg1[i * 2 + 1][3] = ((var1 << 16) | (var2 & 0xffff));
|
|
// }
|
|
//}
|
|
// void sub_GAME_7F059334(s32 m1[4][4], s32 m2[4][4]) {
|
|
// int i;
|
|
// int j;
|
|
// int *ai = &m1[0][0];
|
|
// u32 *af = &m1[2][0];
|
|
|
|
// for (j=0; j<2; j++) {
|
|
// for (i=0; i<4; i++) {
|
|
// m2[i][j*2+0] = (*ai & 0xffff0000) | ((*af >> 16) & 0xffff);
|
|
// m2[i][j*2+1] = ((*(ai++) << 16) & 0xffff0000) | (*(af++) & 0xffff);
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
//void sub_GAME_7F059334(s32 m1[16], s32 m2[16]) {
|
|
// s32 i;
|
|
// for (i = 0; i < 8; i++) {
|
|
// s32 t1 = m1[i+0];
|
|
// s32 t2 = m1[i+8];
|
|
// m2[i * 2 + 0] = MTX_INTPART_PACK(t1, t2);
|
|
// m2[i * 2 + 1] = MTX_FRACPART_PACK(t1, t2);
|
|
// }
|
|
// s32 i, j;
|
|
// for (i = 0; i < 2; i++) {
|
|
// for (j = 0; j < 4; j++) {
|
|
// s32 t1 = m1[i+0][j];
|
|
// s32 t2 = m1[i+2][j];
|
|
// m2[i*8+j*2+0] = MTX_INTPART_PACK(t1, t2);
|
|
// m2[i*8+j*2+1] = MTX_FRACPART_PACK(t1, t2);
|
|
// }
|
|
// }
|
|
//}
|
|
#else
|
|
GLOBAL_ASM(
|
|
.text
|
|
glabel sub_GAME_7F059334
|
|
/* 08DE64 7F059334 00001025 */ move $v0, $zero
|
|
/* 08DE68 7F059338 00803825 */ move $a3, $a0
|
|
/* 08DE6C 7F05933C 240D0008 */ li $t5, 8
|
|
/* 08DE70 7F059340 3C0CFFFF */ lui $t4, 0xffff
|
|
.L7F059344:
|
|
/* 08DE74 7F059344 8CE30000 */ lw $v1, ($a3)
|
|
/* 08DE78 7F059348 8CE60020 */ lw $a2, 0x20($a3)
|
|
/* 08DE7C 7F05934C 000278C0 */ sll $t7, $v0, 3
|
|
/* 08DE80 7F059350 006CC024 */ and $t8, $v1, $t4
|
|
/* 08DE84 7F059354 0006CC02 */ srl $t9, $a2, 0x10
|
|
/* 08DE88 7F059358 03197025 */ or $t6, $t8, $t9
|
|
/* 08DE8C 7F05935C 00AF4021 */ addu $t0, $a1, $t7
|
|
/* 08DE90 7F059360 00037C00 */ sll $t7, $v1, 0x10
|
|
/* 08DE94 7F059364 30D8FFFF */ andi $t8, $a2, 0xffff
|
|
/* 08DE98 7F059368 01F8C825 */ or $t9, $t7, $t8
|
|
/* 08DE9C 7F05936C AD0E0000 */ sw $t6, ($t0)
|
|
/* 08DEA0 7F059370 AD190004 */ sw $t9, 4($t0)
|
|
/* 08DEA4 7F059374 8CE60024 */ lw $a2, 0x24($a3)
|
|
/* 08DEA8 7F059378 8CE30004 */ lw $v1, 4($a3)
|
|
/* 08DEAC 7F05937C 244F0001 */ addiu $t7, $v0, 1
|
|
/* 08DEB0 7F059380 000FC0C0 */ sll $t8, $t7, 3
|
|
/* 08DEB4 7F059384 00067402 */ srl $t6, $a2, 0x10
|
|
/* 08DEB8 7F059388 006CC824 */ and $t9, $v1, $t4
|
|
/* 08DEBC 7F05938C 032E7825 */ or $t7, $t9, $t6
|
|
/* 08DEC0 7F059390 00B84821 */ addu $t1, $a1, $t8
|
|
/* 08DEC4 7F059394 30D9FFFF */ andi $t9, $a2, 0xffff
|
|
/* 08DEC8 7F059398 0003C400 */ sll $t8, $v1, 0x10
|
|
/* 08DECC 7F05939C 03197025 */ or $t6, $t8, $t9
|
|
/* 08DED0 7F0593A0 AD2E0004 */ sw $t6, 4($t1)
|
|
/* 08DED4 7F0593A4 AD2F0000 */ sw $t7, ($t1)
|
|
/* 08DED8 7F0593A8 8CE60028 */ lw $a2, 0x28($a3)
|
|
/* 08DEDC 7F0593AC 8CE30008 */ lw $v1, 8($a3)
|
|
/* 08DEE0 7F0593B0 24580002 */ addiu $t8, $v0, 2
|
|
/* 08DEE4 7F0593B4 0018C8C0 */ sll $t9, $t8, 3
|
|
/* 08DEE8 7F0593B8 00067C02 */ srl $t7, $a2, 0x10
|
|
/* 08DEEC 7F0593BC 006C7024 */ and $t6, $v1, $t4
|
|
/* 08DEF0 7F0593C0 01CFC025 */ or $t8, $t6, $t7
|
|
/* 08DEF4 7F0593C4 00B95021 */ addu $t2, $a1, $t9
|
|
/* 08DEF8 7F0593C8 30CEFFFF */ andi $t6, $a2, 0xffff
|
|
/* 08DEFC 7F0593CC 0003CC00 */ sll $t9, $v1, 0x10
|
|
/* 08DF00 7F0593D0 032E7825 */ or $t7, $t9, $t6
|
|
/* 08DF04 7F0593D4 AD4F0004 */ sw $t7, 4($t2)
|
|
/* 08DF08 7F0593D8 AD580000 */ sw $t8, ($t2)
|
|
/* 08DF0C 7F0593DC 8CE6002C */ lw $a2, 0x2c($a3)
|
|
/* 08DF10 7F0593E0 8CE3000C */ lw $v1, 0xc($a3)
|
|
/* 08DF14 7F0593E4 24590003 */ addiu $t9, $v0, 3
|
|
/* 08DF18 7F0593E8 001970C0 */ sll $t6, $t9, 3
|
|
/* 08DF1C 7F0593EC 0006C402 */ srl $t8, $a2, 0x10
|
|
/* 08DF20 7F0593F0 006C7824 */ and $t7, $v1, $t4
|
|
/* 08DF24 7F0593F4 01F8C825 */ or $t9, $t7, $t8
|
|
/* 08DF28 7F0593F8 00AE5821 */ addu $t3, $a1, $t6
|
|
/* 08DF2C 7F0593FC 30CFFFFF */ andi $t7, $a2, 0xffff
|
|
/* 08DF30 7F059400 00037400 */ sll $t6, $v1, 0x10
|
|
/* 08DF34 7F059404 01CFC025 */ or $t8, $t6, $t7
|
|
/* 08DF38 7F059408 24420004 */ addiu $v0, $v0, 4
|
|
/* 08DF3C 7F05940C AD780004 */ sw $t8, 4($t3)
|
|
/* 08DF40 7F059410 AD790000 */ sw $t9, ($t3)
|
|
/* 08DF44 7F059414 144DFFCB */ bne $v0, $t5, .L7F059344
|
|
/* 08DF48 7F059418 24E70010 */ addiu $a3, $a3, 0x10
|
|
/* 08DF4C 7F05941C 03E00008 */ jr $ra
|
|
/* 08DF50 7F059420 00000000 */ nop
|
|
)
|
|
#endif
|
|
|
|
void matrix_4x4_7F059424(Mtxf *arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4, f32 arg5, f32 arg6, f32 arg7, f32 arg8, f32 arg9) {
|
|
f32 temp_f26;
|
|
f32 temp_f28;
|
|
f32 temp_f2_2;
|
|
f32 temp_f2_3;
|
|
f32 temp_f30;
|
|
f32 temp_f2 = -1.0f / sqrtf((arg4 * arg4) + (arg5 * arg5) + (arg6 * arg6));
|
|
arg4 *= temp_f2;
|
|
arg5 *= temp_f2;
|
|
arg6 *= temp_f2;
|
|
temp_f26 = (arg8 * arg6) - (arg9 * arg5);
|
|
temp_f28 = (arg9 * arg4) - (arg7 * arg6);
|
|
temp_f30 = (arg7 * arg5) - (arg8 * arg4);
|
|
temp_f2_2 = 1.0f / sqrtf((temp_f26 * temp_f26) + (temp_f28 * temp_f28) + (temp_f30 * temp_f30));
|
|
temp_f26 *= temp_f2_2;
|
|
temp_f28 *= temp_f2_2;
|
|
temp_f30 *= temp_f2_2;
|
|
arg7 = (arg5 * temp_f30) - (arg6 * temp_f28);
|
|
arg8 = (arg6 * temp_f26) - (arg4 * temp_f30);
|
|
arg9 = (arg4 * temp_f28) - (arg5 * temp_f26);
|
|
temp_f2_3 = 1.0f / sqrtf((arg7 * arg7) + (arg8 * arg8) + (arg9 * arg9));
|
|
arg7 *= temp_f2_3;
|
|
arg8 *= temp_f2_3;
|
|
arg9 *= temp_f2_3;
|
|
arg0->m[0][0] = temp_f26;
|
|
arg0->m[1][0] = temp_f28;
|
|
arg0->m[2][0] = temp_f30;
|
|
arg0->m[3][0] = -((arg1 * temp_f26) + (arg2 * temp_f28) + (arg3 * temp_f30));
|
|
arg0->m[0][1] = arg7;
|
|
arg0->m[1][1] = arg8;
|
|
arg0->m[2][1] = arg9;
|
|
arg0->m[3][1] = -((arg1 * arg7) + (arg2 * arg8) + (arg3 * arg9));
|
|
arg0->m[0][2] = arg4;
|
|
arg0->m[1][2] = arg5;
|
|
arg0->m[2][2] = arg6;
|
|
arg0->m[3][2] = -((arg1 * arg4) + (arg2 * arg5) + (arg3 * arg6));
|
|
arg0->m[0][3] = 0.0f;
|
|
arg0->m[1][3] = 0.0f;
|
|
arg0->m[2][3] = 0.0f;
|
|
arg0->m[3][3] = 1.0f;
|
|
}
|
|
|
|
void matrix_4x4_7F059424(Mtxf *arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4, f32 arg5, f32 arg6, f32 arg7, f32 arg8, f32 arg9);
|
|
|
|
void matrix_4x4_7F059694(Mtxf *arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4, f32 arg5, f32 arg6, f32 arg7, f32 arg8, f32 arg9) {
|
|
matrix_4x4_7F059424(arg0, arg1, arg2, arg3, arg4 - arg1, arg5 - arg2, arg6 - arg3, arg7, arg8, arg9);
|
|
}
|
|
|
|
void matrix_4x4_7F059708(Mtxf *arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4, f32 arg5, f32 arg6, f32 arg7, f32 arg8, f32 arg9) {
|
|
f32 temp_f26;
|
|
f32 temp_f28;
|
|
f32 temp_f2_2;
|
|
f32 temp_f2_3;
|
|
f32 temp_f30;
|
|
f32 temp_f2 = -1.0f / sqrtf((arg4 * arg4) + (arg5 * arg5) + (arg6 * arg6));
|
|
arg4 *= temp_f2;
|
|
arg5 *= temp_f2;
|
|
arg6 *= temp_f2;
|
|
temp_f26 = (arg8 * arg6) - (arg9 * arg5);
|
|
temp_f28 = (arg9 * arg4) - (arg7 * arg6);
|
|
temp_f30 = (arg7 * arg5) - (arg8 * arg4);
|
|
temp_f2_2 = 1.0f / sqrtf((temp_f26 * temp_f26) + (temp_f28 * temp_f28) + (temp_f30 * temp_f30));
|
|
temp_f26 *= temp_f2_2;
|
|
temp_f28 *= temp_f2_2;
|
|
temp_f30 *= temp_f2_2;
|
|
arg7 = (arg5 * temp_f30) - (arg6 * temp_f28);
|
|
arg8 = (arg6 * temp_f26) - (arg4 * temp_f30);
|
|
arg9 = (arg4 * temp_f28) - (arg5 * temp_f26);
|
|
temp_f2_3 = 1.0f / sqrtf((arg7 * arg7) + (arg8 * arg8) + (arg9 * arg9));
|
|
arg7 *= temp_f2_3;
|
|
arg8 *= temp_f2_3;
|
|
arg9 *= temp_f2_3;
|
|
arg0->m[0][0] = temp_f26;
|
|
arg0->m[1][0] = arg7;
|
|
arg0->m[2][0] = arg4;
|
|
arg0->m[3][0] = arg1;
|
|
arg0->m[0][1] = temp_f28;
|
|
arg0->m[1][1] = arg8;
|
|
arg0->m[2][1] = arg5;
|
|
arg0->m[3][1] = arg2;
|
|
arg0->m[0][2] = temp_f30;
|
|
arg0->m[1][2] = arg9;
|
|
arg0->m[2][2] = arg6;
|
|
arg0->m[3][2] = arg3;
|
|
arg0->m[0][3] = 0.0f;
|
|
arg0->m[1][3] = 0.0f;
|
|
arg0->m[2][3] = 0.0f;
|
|
arg0->m[3][3] = 1.0f;
|
|
}
|
|
|
|
void matrix_4x4_7F059908(Mtxf *arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4, f32 arg5, f32 arg6, f32 arg7, f32 arg8, f32 arg9) {
|
|
matrix_4x4_7F059708(arg0, arg1, arg2, arg3, arg4 - arg1, arg5 - arg2, arg6 - arg3, arg7, arg8, arg9);
|
|
}
|
|
|
|
#ifdef NONMATCHING
|
|
// > 8e570: move v0,v1
|
|
// 8e570: jr ra 8e574: jr ra
|
|
// 8e574: move v0,v1 | 8e578: nop
|
|
u16 sub_GAME_7F05997C(f32 arg0, f32 arg1) {
|
|
u16 phi_v1;
|
|
f32 temp_f0 = arg0 + arg1;
|
|
if (temp_f0 <= 2.0f)
|
|
return -1;
|
|
phi_v1 = (131072.0f / temp_f0);
|
|
if (phi_v1 <= 0)
|
|
phi_v1 = 1;
|
|
return phi_v1;
|
|
}
|
|
#else
|
|
GLOBAL_ASM(
|
|
.text
|
|
glabel sub_GAME_7F05997C
|
|
/* 08E4AC 7F05997C 460E6000 */ add.s $f0, $f12, $f14
|
|
/* 08E4B0 7F059980 3C014000 */ li $at, 0x40000000 # 2.000000
|
|
/* 08E4B4 7F059984 44812000 */ mtc1 $at, $f4
|
|
/* 08E4B8 7F059988 3C014800 */ li $at, 0x48000000 # 131072.000000
|
|
/* 08E4BC 7F05998C 4604003E */ c.le.s $f0, $f4
|
|
/* 08E4C0 7F059990 00000000 */ nop
|
|
/* 08E4C4 7F059994 45020004 */ bc1fl .L7F0599A8
|
|
/* 08E4C8 7F059998 44813000 */ mtc1 $at, $f6
|
|
/* 08E4CC 7F05999C 03E00008 */ jr $ra
|
|
/* 08E4D0 7F0599A0 3402FFFF */ li $v0, 65535
|
|
|
|
/* 08E4D4 7F0599A4 44813000 */ mtc1 $at, $f6
|
|
.L7F0599A8:
|
|
/* 08E4D8 7F0599A8 24020001 */ li $v0, 1
|
|
/* 08E4DC 7F0599AC 3C014F00 */ li $at, 0x4F000000 # 2147483648.000000
|
|
/* 08E4E0 7F0599B0 46003203 */ div.s $f8, $f6, $f0
|
|
/* 08E4E4 7F0599B4 444EF800 */ cfc1 $t6, $31
|
|
/* 08E4E8 7F0599B8 44C2F800 */ ctc1 $v0, $31
|
|
/* 08E4EC 7F0599BC 00000000 */ nop
|
|
/* 08E4F0 7F0599C0 460042A4 */ cvt.w.s $f10, $f8
|
|
/* 08E4F4 7F0599C4 4442F800 */ cfc1 $v0, $31
|
|
/* 08E4F8 7F0599C8 00000000 */ nop
|
|
/* 08E4FC 7F0599CC 30420078 */ andi $v0, $v0, 0x78
|
|
/* 08E500 7F0599D0 50400013 */ beql $v0, $zero, .L7F059A20
|
|
/* 08E504 7F0599D4 44025000 */ mfc1 $v0, $f10
|
|
/* 08E508 7F0599D8 44815000 */ mtc1 $at, $f10
|
|
/* 08E50C 7F0599DC 24020001 */ li $v0, 1
|
|
/* 08E510 7F0599E0 460A4281 */ sub.s $f10, $f8, $f10
|
|
/* 08E514 7F0599E4 44C2F800 */ ctc1 $v0, $31
|
|
/* 08E518 7F0599E8 00000000 */ nop
|
|
/* 08E51C 7F0599EC 460052A4 */ cvt.w.s $f10, $f10
|
|
/* 08E520 7F0599F0 4442F800 */ cfc1 $v0, $31
|
|
/* 08E524 7F0599F4 00000000 */ nop
|
|
/* 08E528 7F0599F8 30420078 */ andi $v0, $v0, 0x78
|
|
/* 08E52C 7F0599FC 14400005 */ bnez $v0, .L7F059A14
|
|
/* 08E530 7F059A00 00000000 */ nop
|
|
/* 08E534 7F059A04 44025000 */ mfc1 $v0, $f10
|
|
/* 08E538 7F059A08 3C018000 */ lui $at, 0x8000
|
|
/* 08E53C 7F059A0C 10000007 */ b .L7F059A2C
|
|
/* 08E540 7F059A10 00411025 */ or $v0, $v0, $at
|
|
.L7F059A14:
|
|
/* 08E544 7F059A14 10000005 */ b .L7F059A2C
|
|
/* 08E548 7F059A18 2402FFFF */ li $v0, -1
|
|
/* 08E54C 7F059A1C 44025000 */ mfc1 $v0, $f10
|
|
.L7F059A20:
|
|
/* 08E550 7F059A20 00000000 */ nop
|
|
/* 08E554 7F059A24 0440FFFB */ bltz $v0, .L7F059A14
|
|
/* 08E558 7F059A28 00000000 */ nop
|
|
.L7F059A2C:
|
|
/* 08E55C 7F059A2C 44CEF800 */ ctc1 $t6, $31
|
|
/* 08E560 7F059A30 304FFFFF */ andi $t7, $v0, 0xffff
|
|
/* 08E564 7F059A34 1DE00002 */ bgtz $t7, .L7F059A40
|
|
/* 08E568 7F059A38 3043FFFF */ andi $v1, $v0, 0xffff
|
|
/* 08E56C 7F059A3C 24030001 */ li $v1, 1
|
|
.L7F059A40:
|
|
/* 08E570 7F059A40 03E00008 */ jr $ra
|
|
/* 08E574 7F059A44 00601025 */ move $v0, $v1
|
|
)
|
|
#endif
|
|
|
|
u16 sub_GAME_7F05997C(f32 arg0, f32 arg1);
|
|
|
|
void matrix_4x4_7F059A48(Mtxf *matrix, u16* arg1, f32 angle, f32 arg3, f32 arg4, f32 arg5, f32 arg6) {
|
|
f32 temp_f12_2 = cosf(angle * 0.5f) / sinf(angle * 0.5f);
|
|
arg6 *= 65536.0f;
|
|
matrix->m[0][0] = ((temp_f12_2 / arg3) * arg6);
|
|
matrix->m[1][1] = (temp_f12_2 * arg6);
|
|
matrix->m[1][0] = 0.0f;
|
|
matrix->m[2][0] = 0.0f;
|
|
matrix->m[3][0] = 0.0f;
|
|
matrix->m[0][1] = 0.0f;
|
|
matrix->m[2][1] = 0.0f;
|
|
matrix->m[3][1] = 0.0f;
|
|
matrix->m[0][2] = 0.0f;
|
|
matrix->m[1][2] = 0.0f;
|
|
matrix->m[2][2] = (((arg4 + arg5) / (arg4 - arg5)) * arg6);
|
|
matrix->m[3][2] = ((((arg4 + arg4) * arg5) / (arg4 - arg5)) * arg6);
|
|
matrix->m[2][3] = -arg6;
|
|
matrix->m[0][3] = 0.0f;
|
|
matrix->m[1][3] = 0.0f;
|
|
matrix->m[3][3] = 0.0f;
|
|
if (arg1 != 0) {
|
|
*arg1 = sub_GAME_7F05997C(arg4, arg5);
|
|
}
|
|
}
|
|
|
|
void guNormalize(f32 *x, f32 *y, f32 *z);
|
|
|
|
void matrix_4x4_7F059B58(Mtxf *matrix, 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.0f) {
|
|
cos_x = x * cosine;
|
|
sin_x = x * sine;
|
|
cos_z = z * cosine;
|
|
sin_z = z * sine;
|
|
invnorm = 1.0f / norm;
|
|
matrix->m[0][0] = ((-cos_z - (y * sin_x)) * invnorm);
|
|
matrix->m[1][0] = (sine * norm);
|
|
matrix->m[2][0] = ((cos_x - (y * sin_z)) * invnorm);
|
|
matrix->m[3][0] = 0.0f;
|
|
matrix->m[0][1] = ((sin_z - (y * cos_x)) * invnorm);
|
|
matrix->m[1][1] = (cosine * norm);
|
|
matrix->m[2][1] = ((-sin_x - (y * cos_z)) * invnorm);
|
|
matrix->m[3][1] = 0.0f;
|
|
matrix->m[0][2] = -x;
|
|
matrix->m[1][2] = -y;
|
|
matrix->m[2][2] = -z;
|
|
matrix->m[3][2] = 0.0f;
|
|
matrix->m[0][3] = 0.0f;
|
|
matrix->m[1][3] = 0.0f;
|
|
matrix->m[2][3] = 0.0f;
|
|
matrix->m[3][3] = 1.0f;
|
|
return;
|
|
}
|
|
matrix_4x4_set_identity(matrix);
|
|
}
|
|
|
|
void guAlignF(float mf[4][4], float a, float x, float y, float z);
|
|
|
|
#define RAD2DEG(x) x * 57.295776f
|
|
|
|
void matrix_4x4_align(Mtxf *matrix, f32 angle, f32 x, f32 y, f32 z) {
|
|
angle = RAD2DEG(angle);
|
|
guAlignF(matrix->m, angle, x, y, z);
|
|
}
|
|
|
|
void matrix_4x4_7F059D30(u32 arg0) {
|
|
return;
|
|
}
|
|
|
|
void matrix_4x4_set_rotation_inverse(Mtxf *rotation, Mtxf *transpose) {
|
|
transpose->m[0][0] = rotation->m[0][0];
|
|
transpose->m[0][1] = rotation->m[1][0];
|
|
transpose->m[0][2] = rotation->m[2][0];
|
|
transpose->m[1][0] = rotation->m[0][1];
|
|
transpose->m[1][1] = rotation->m[1][1];
|
|
transpose->m[1][2] = rotation->m[2][1];
|
|
transpose->m[2][0] = rotation->m[0][2];
|
|
transpose->m[2][1] = rotation->m[1][2];
|
|
transpose->m[2][2] = rotation->m[2][2];
|
|
transpose->m[3][0] = 0.0f;
|
|
transpose->m[3][1] = 0.0f;
|
|
transpose->m[3][2] = 0.0f;
|
|
transpose->m[0][3] = 0.0f;
|
|
transpose->m[1][3] = 0.0f;
|
|
transpose->m[2][3] = 0.0f;
|
|
transpose->m[3][3] = 1.0f;
|
|
}
|
|
|
|
void matrix_4x4_7F059DAC(Mtxf *arg0, Mtxf *arg1) {
|
|
f32 temp_f0 = ((arg0->m[0][0] * arg0->m[0][0]) + (arg0->m[1][0] * arg0->m[1][0]) + (arg0->m[2][0] * arg0->m[2][0]));
|
|
temp_f0 = 1.0f / temp_f0;
|
|
arg1->m[0][0] = (arg0->m[0][0] * temp_f0);
|
|
arg1->m[0][1] = (arg0->m[1][0] * temp_f0);
|
|
arg1->m[0][2] = (arg0->m[2][0] * temp_f0);
|
|
arg1->m[1][0] = (arg0->m[0][1] * temp_f0);
|
|
arg1->m[1][1] = (arg0->m[1][1] * temp_f0);
|
|
arg1->m[1][2] = (arg0->m[2][1] * temp_f0);
|
|
arg1->m[2][0] = (arg0->m[0][2] * temp_f0);
|
|
arg1->m[2][1] = (arg0->m[1][2] * temp_f0);
|
|
arg1->m[2][2] = (arg0->m[2][2] * temp_f0);
|
|
arg1->m[3][0] = 0.0f;
|
|
arg1->m[3][1] = 0.0f;
|
|
arg1->m[3][2] = 0.0f;
|
|
arg1->m[0][3] = 0.0f;
|
|
arg1->m[1][3] = 0.0f;
|
|
arg1->m[2][3] = 0.0f;
|
|
arg1->m[3][3] = 1.0f;
|
|
}
|
|
|
|
void matrix_4x4_7F059E64(Mtxf *arg0, Mtxf *arg1) {
|
|
f32 temp_f0 = (arg0->m[0][0] * arg0->m[0][0]) + (arg0->m[1][0] * arg0->m[1][0]) + (arg0->m[2][0] * arg0->m[2][0]);
|
|
temp_f0 = 1.0f / temp_f0;
|
|
arg1->m[0][0] = (arg0->m[0][0] * temp_f0);
|
|
arg1->m[0][1] = (arg0->m[1][0] * temp_f0);
|
|
arg1->m[0][2] = (arg0->m[2][0] * temp_f0);
|
|
arg1->m[1][0] = (arg0->m[0][1] * temp_f0);
|
|
arg1->m[1][1] = (arg0->m[1][1] * temp_f0);
|
|
arg1->m[1][2] = (arg0->m[2][1] * temp_f0);
|
|
arg1->m[2][0] = (arg0->m[0][2] * temp_f0);
|
|
arg1->m[2][1] = (arg0->m[1][2] * temp_f0);
|
|
arg1->m[2][2] = (arg0->m[2][2] * temp_f0);
|
|
arg1->m[3][0] = -((arg1->m[0][0] * arg0->m[3][0]) + (arg1->m[1][0] * arg0->m[3][1]) + (arg1->m[2][0] * arg0->m[3][2]));
|
|
arg1->m[3][1] = -((arg1->m[0][1] * arg0->m[3][0]) + (arg1->m[1][1] * arg0->m[3][1]) + (arg1->m[2][1] * arg0->m[3][2]));
|
|
arg1->m[3][2] = -((arg1->m[0][2] * arg0->m[3][0]) + (arg1->m[1][2] * arg0->m[3][1]) + (arg1->m[2][2] * arg0->m[3][2]));
|
|
arg1->m[3][3] = 1.0f;
|
|
arg1->m[0][3] = 0.0f;
|
|
arg1->m[1][3] = 0.0f;
|
|
arg1->m[2][3] = 0.0f;
|
|
}
|
|
|
|
|
|
#ifdef NONMATCHING
|
|
void sub_GAME_7F059FB8(Mtxf *arg0, Mtxf *arg1) {
|
|
f32 temp_f0 = (arg0->m[0][0] * arg0->m[1][1] * arg0->m[2][2]) + (arg0->m[0][1] * arg0->m[1][2] * arg0->m[2][0]) + (arg0->m[0][2] * arg0->m[1][0] * arg0->m[2][1]) - (arg0->m[0][2] * arg0->m[1][1] * arg0->m[2][0]) - (arg0->m[0][1] * arg0->m[1][0] * arg0->m[2][2]) - (arg0->m[0][0] * arg0->m[1][2] * arg0->m[2][1]);
|
|
temp_f0 = 1.0f / temp_f0;
|
|
arg1->m[0][0] = (((arg0->m[1][1] * arg0->m[2][2]) - (arg0->m[2][1] * arg0->m[1][2])) * temp_f0);
|
|
arg1->m[1][0] = (((arg0->m[1][2] * arg0->m[2][0]) - (arg0->m[2][2] * arg0->m[1][0])) * temp_f0);
|
|
arg1->m[2][0] = (((arg0->m[1][0] * arg0->m[2][1]) - (arg0->m[2][0] * arg0->m[1][1])) * temp_f0);
|
|
arg1->m[0][1] = (((arg0->m[0][2] * arg0->m[2][1]) - (arg0->m[2][2] * arg0->m[0][1])) * temp_f0);
|
|
arg1->m[1][1] = (((arg0->m[0][0] * arg0->m[2][2]) - (arg0->m[2][0] * arg0->m[0][2])) * temp_f0);
|
|
arg1->m[2][1] = (((arg0->m[0][1] * arg0->m[2][0]) - (arg0->m[2][1] * arg0->m[0][0])) * temp_f0);
|
|
arg1->m[0][2] = (((arg0->m[0][1] * arg0->m[1][2]) - (arg0->m[1][1] * arg0->m[0][2])) * temp_f0);
|
|
arg1->m[1][2] = (((arg0->m[0][2] * arg0->m[1][0]) - (arg0->m[1][2] * arg0->m[0][0])) * temp_f0);
|
|
arg1->m[2][2] = (((arg0->m[0][0] * arg0->m[1][1]) - (arg0->m[1][0] * arg0->m[0][1])) * temp_f0);
|
|
arg1->m[3][0] = -((arg1->m[0][0] * arg0->m[3][0]) + (arg1->m[1][0] * arg0->m[3][1]) + (arg1->m[2][0] * arg0->m[3][2]));
|
|
arg1->m[3][1] = -((arg1->m[0][1] * arg0->m[3][0]) + (arg1->m[1][1] * arg0->m[3][1]) + (arg1->m[2][1] * arg0->m[3][2]));
|
|
arg1->m[3][2] = -((arg1->m[0][2] * arg0->m[3][0]) + (arg1->m[1][2] * arg0->m[3][1]) + (arg1->m[2][2] * arg0->m[3][2]));
|
|
arg1->m[3][3] = 1.0f;
|
|
arg1->m[0][3] = 0.0f;
|
|
arg1->m[1][3] = 0.0f;
|
|
arg1->m[2][3] = 0.0f;
|
|
}
|
|
#else
|
|
GLOBAL_ASM(
|
|
.text
|
|
glabel sub_GAME_7F059FB8
|
|
/* 08EAE8 7F059FB8 C4820000 */ lwc1 $f2, ($a0)
|
|
/* 08EAEC 7F059FBC C48C0014 */ lwc1 $f12, 0x14($a0)
|
|
/* 08EAF0 7F059FC0 C48E0028 */ lwc1 $f14, 0x28($a0)
|
|
/* 08EAF4 7F059FC4 C4900004 */ lwc1 $f16, 4($a0)
|
|
/* 08EAF8 7F059FC8 460C1102 */ mul.s $f4, $f2, $f12
|
|
/* 08EAFC 7F059FCC C4920018 */ lwc1 $f18, 0x18($a0)
|
|
/* 08EB00 7F059FD0 C48A0020 */ lwc1 $f10, 0x20($a0)
|
|
/* 08EB04 7F059FD4 27BDFFD0 */ addiu $sp, $sp, -0x30
|
|
/* 08EB08 7F059FD8 3C013F80 */ li $at, 0x3F800000 # 1.000000
|
|
/* 08EB0C 7F059FDC E7AA0010 */ swc1 $f10, 0x10($sp)
|
|
/* 08EB10 7F059FE0 C7A80010 */ lwc1 $f8, 0x10($sp)
|
|
/* 08EB14 7F059FE4 460E2002 */ mul.s $f0, $f4, $f14
|
|
/* 08EB18 7F059FE8 C48A0008 */ lwc1 $f10, 8($a0)
|
|
/* 08EB1C 7F059FEC 46128182 */ mul.s $f6, $f16, $f18
|
|
/* 08EB20 7F059FF0 E7AA000C */ swc1 $f10, 0xc($sp)
|
|
/* 08EB24 7F059FF4 C7AA000C */ lwc1 $f10, 0xc($sp)
|
|
/* 08EB28 7F059FF8 46083102 */ mul.s $f4, $f6, $f8
|
|
/* 08EB2C 7F059FFC C4860010 */ lwc1 $f6, 0x10($a0)
|
|
/* 08EB30 7F05A000 E7A60008 */ swc1 $f6, 8($sp)
|
|
/* 08EB34 7F05A004 C7A60008 */ lwc1 $f6, 8($sp)
|
|
/* 08EB38 7F05A008 46040000 */ add.s $f0, $f0, $f4
|
|
/* 08EB3C 7F05A00C C4840024 */ lwc1 $f4, 0x24($a0)
|
|
/* 08EB40 7F05A010 E7A80000 */ swc1 $f8, ($sp)
|
|
/* 08EB44 7F05A014 E7A4001C */ swc1 $f4, 0x1c($sp)
|
|
/* 08EB48 7F05A018 46065102 */ mul.s $f4, $f10, $f6
|
|
/* 08EB4C 7F05A01C C7A8001C */ lwc1 $f8, 0x1c($sp)
|
|
/* 08EB50 7F05A020 46082102 */ mul.s $f4, $f4, $f8
|
|
/* 08EB54 7F05A024 46040000 */ add.s $f0, $f0, $f4
|
|
/* 08EB58 7F05A028 460C5102 */ mul.s $f4, $f10, $f12
|
|
/* 08EB5C 7F05A02C C7AA0000 */ lwc1 $f10, ($sp)
|
|
/* 08EB60 7F05A030 460A2102 */ mul.s $f4, $f4, $f10
|
|
/* 08EB64 7F05A034 00000000 */ nop
|
|
/* 08EB68 7F05A038 46068282 */ mul.s $f10, $f16, $f6
|
|
/* 08EB6C 7F05A03C 46040001 */ sub.s $f0, $f0, $f4
|
|
/* 08EB70 7F05A040 460E5102 */ mul.s $f4, $f10, $f14
|
|
/* 08EB74 7F05A044 00000000 */ nop
|
|
/* 08EB78 7F05A048 46121182 */ mul.s $f6, $f2, $f18
|
|
/* 08EB7C 7F05A04C 44811000 */ mtc1 $at, $f2
|
|
/* 08EB80 7F05A050 46040001 */ sub.s $f0, $f0, $f4
|
|
/* 08EB84 7F05A054 46083282 */ mul.s $f10, $f6, $f8
|
|
/* 08EB88 7F05A058 460A0001 */ sub.s $f0, $f0, $f10
|
|
/* 08EB8C 7F05A05C 460E6102 */ mul.s $f4, $f12, $f14
|
|
/* 08EB90 7F05A060 00000000 */ nop
|
|
/* 08EB94 7F05A064 46124182 */ mul.s $f6, $f8, $f18
|
|
/* 08EB98 7F05A068 46001003 */ div.s $f0, $f2, $f0
|
|
/* 08EB9C 7F05A06C 46062281 */ sub.s $f10, $f4, $f6
|
|
/* 08EBA0 7F05A070 46005202 */ mul.s $f8, $f10, $f0
|
|
/* 08EBA4 7F05A074 E4A80000 */ swc1 $f8, ($a1)
|
|
/* 08EBA8 7F05A078 C4840018 */ lwc1 $f4, 0x18($a0)
|
|
/* 08EBAC 7F05A07C C4860020 */ lwc1 $f6, 0x20($a0)
|
|
/* 08EBB0 7F05A080 C4880028 */ lwc1 $f8, 0x28($a0)
|
|
/* 08EBB4 7F05A084 46062282 */ mul.s $f10, $f4, $f6
|
|
/* 08EBB8 7F05A088 C4840010 */ lwc1 $f4, 0x10($a0)
|
|
/* 08EBBC 7F05A08C 46044182 */ mul.s $f6, $f8, $f4
|
|
/* 08EBC0 7F05A090 46065201 */ sub.s $f8, $f10, $f6
|
|
/* 08EBC4 7F05A094 46004102 */ mul.s $f4, $f8, $f0
|
|
/* 08EBC8 7F05A098 E4A40010 */ swc1 $f4, 0x10($a1)
|
|
/* 08EBCC 7F05A09C C48A0010 */ lwc1 $f10, 0x10($a0)
|
|
/* 08EBD0 7F05A0A0 C4860024 */ lwc1 $f6, 0x24($a0)
|
|
/* 08EBD4 7F05A0A4 C4840020 */ lwc1 $f4, 0x20($a0)
|
|
/* 08EBD8 7F05A0A8 46065202 */ mul.s $f8, $f10, $f6
|
|
/* 08EBDC 7F05A0AC C48A0014 */ lwc1 $f10, 0x14($a0)
|
|
/* 08EBE0 7F05A0B0 460A2182 */ mul.s $f6, $f4, $f10
|
|
/* 08EBE4 7F05A0B4 46064101 */ sub.s $f4, $f8, $f6
|
|
/* 08EBE8 7F05A0B8 46002282 */ mul.s $f10, $f4, $f0
|
|
/* 08EBEC 7F05A0BC E4AA0020 */ swc1 $f10, 0x20($a1)
|
|
/* 08EBF0 7F05A0C0 C4880008 */ lwc1 $f8, 8($a0)
|
|
/* 08EBF4 7F05A0C4 C4860024 */ lwc1 $f6, 0x24($a0)
|
|
/* 08EBF8 7F05A0C8 C48A0028 */ lwc1 $f10, 0x28($a0)
|
|
/* 08EBFC 7F05A0CC 46064102 */ mul.s $f4, $f8, $f6
|
|
/* 08EC00 7F05A0D0 C4880004 */ lwc1 $f8, 4($a0)
|
|
/* 08EC04 7F05A0D4 46085182 */ mul.s $f6, $f10, $f8
|
|
/* 08EC08 7F05A0D8 46062281 */ sub.s $f10, $f4, $f6
|
|
/* 08EC0C 7F05A0DC 46005202 */ mul.s $f8, $f10, $f0
|
|
/* 08EC10 7F05A0E0 E4A80004 */ swc1 $f8, 4($a1)
|
|
/* 08EC14 7F05A0E4 C4840000 */ lwc1 $f4, ($a0)
|
|
/* 08EC18 7F05A0E8 C4860028 */ lwc1 $f6, 0x28($a0)
|
|
/* 08EC1C 7F05A0EC C4880020 */ lwc1 $f8, 0x20($a0)
|
|
/* 08EC20 7F05A0F0 46062282 */ mul.s $f10, $f4, $f6
|
|
/* 08EC24 7F05A0F4 C4840008 */ lwc1 $f4, 8($a0)
|
|
/* 08EC28 7F05A0F8 46044182 */ mul.s $f6, $f8, $f4
|
|
/* 08EC2C 7F05A0FC 46065201 */ sub.s $f8, $f10, $f6
|
|
/* 08EC30 7F05A100 46004102 */ mul.s $f4, $f8, $f0
|
|
/* 08EC34 7F05A104 E4A40014 */ swc1 $f4, 0x14($a1)
|
|
/* 08EC38 7F05A108 C48A0004 */ lwc1 $f10, 4($a0)
|
|
/* 08EC3C 7F05A10C C4860020 */ lwc1 $f6, 0x20($a0)
|
|
/* 08EC40 7F05A110 C4840024 */ lwc1 $f4, 0x24($a0)
|
|
/* 08EC44 7F05A114 46065202 */ mul.s $f8, $f10, $f6
|
|
/* 08EC48 7F05A118 C48A0000 */ lwc1 $f10, ($a0)
|
|
/* 08EC4C 7F05A11C 460A2182 */ mul.s $f6, $f4, $f10
|
|
/* 08EC50 7F05A120 46064101 */ sub.s $f4, $f8, $f6
|
|
/* 08EC54 7F05A124 46002282 */ mul.s $f10, $f4, $f0
|
|
/* 08EC58 7F05A128 E4AA0024 */ swc1 $f10, 0x24($a1)
|
|
/* 08EC5C 7F05A12C C4880004 */ lwc1 $f8, 4($a0)
|
|
/* 08EC60 7F05A130 C4860018 */ lwc1 $f6, 0x18($a0)
|
|
/* 08EC64 7F05A134 C48A0014 */ lwc1 $f10, 0x14($a0)
|
|
/* 08EC68 7F05A138 46064102 */ mul.s $f4, $f8, $f6
|
|
/* 08EC6C 7F05A13C C4880008 */ lwc1 $f8, 8($a0)
|
|
/* 08EC70 7F05A140 46085182 */ mul.s $f6, $f10, $f8
|
|
/* 08EC74 7F05A144 46062281 */ sub.s $f10, $f4, $f6
|
|
/* 08EC78 7F05A148 46005202 */ mul.s $f8, $f10, $f0
|
|
/* 08EC7C 7F05A14C E4A80008 */ swc1 $f8, 8($a1)
|
|
/* 08EC80 7F05A150 C4860010 */ lwc1 $f6, 0x10($a0)
|
|
/* 08EC84 7F05A154 C4840008 */ lwc1 $f4, 8($a0)
|
|
/* 08EC88 7F05A158 C4880018 */ lwc1 $f8, 0x18($a0)
|
|
/* 08EC8C 7F05A15C 46062282 */ mul.s $f10, $f4, $f6
|
|
/* 08EC90 7F05A160 C4840000 */ lwc1 $f4, ($a0)
|
|
/* 08EC94 7F05A164 46044182 */ mul.s $f6, $f8, $f4
|
|
/* 08EC98 7F05A168 46065201 */ sub.s $f8, $f10, $f6
|
|
/* 08EC9C 7F05A16C 46004102 */ mul.s $f4, $f8, $f0
|
|
/* 08ECA0 7F05A170 E4A40018 */ swc1 $f4, 0x18($a1)
|
|
/* 08ECA4 7F05A174 C4860014 */ lwc1 $f6, 0x14($a0)
|
|
/* 08ECA8 7F05A178 C48A0000 */ lwc1 $f10, ($a0)
|
|
/* 08ECAC 7F05A17C C4840010 */ lwc1 $f4, 0x10($a0)
|
|
/* 08ECB0 7F05A180 46065202 */ mul.s $f8, $f10, $f6
|
|
/* 08ECB4 7F05A184 C48A0004 */ lwc1 $f10, 4($a0)
|
|
/* 08ECB8 7F05A188 460A2182 */ mul.s $f6, $f4, $f10
|
|
/* 08ECBC 7F05A18C 46064101 */ sub.s $f4, $f8, $f6
|
|
/* 08ECC0 7F05A190 C4A60000 */ lwc1 $f6, ($a1)
|
|
/* 08ECC4 7F05A194 46002282 */ mul.s $f10, $f4, $f0
|
|
/* 08ECC8 7F05A198 44800000 */ mtc1 $zero, $f0
|
|
/* 08ECCC 7F05A19C E4AA0028 */ swc1 $f10, 0x28($a1)
|
|
/* 08ECD0 7F05A1A0 C4880030 */ lwc1 $f8, 0x30($a0)
|
|
/* 08ECD4 7F05A1A4 C48A0034 */ lwc1 $f10, 0x34($a0)
|
|
/* 08ECD8 7F05A1A8 46064102 */ mul.s $f4, $f8, $f6
|
|
/* 08ECDC 7F05A1AC C4A80010 */ lwc1 $f8, 0x10($a1)
|
|
/* 08ECE0 7F05A1B0 46085182 */ mul.s $f6, $f10, $f8
|
|
/* 08ECE4 7F05A1B4 C4A80020 */ lwc1 $f8, 0x20($a1)
|
|
/* 08ECE8 7F05A1B8 46062280 */ add.s $f10, $f4, $f6
|
|
/* 08ECEC 7F05A1BC C4840038 */ lwc1 $f4, 0x38($a0)
|
|
/* 08ECF0 7F05A1C0 46044182 */ mul.s $f6, $f8, $f4
|
|
/* 08ECF4 7F05A1C4 460A3200 */ add.s $f8, $f6, $f10
|
|
/* 08ECF8 7F05A1C8 C4AA0004 */ lwc1 $f10, 4($a1)
|
|
/* 08ECFC 7F05A1CC 46004107 */ neg.s $f4, $f8
|
|
/* 08ED00 7F05A1D0 E4A40030 */ swc1 $f4, 0x30($a1)
|
|
/* 08ED04 7F05A1D4 C4860030 */ lwc1 $f6, 0x30($a0)
|
|
/* 08ED08 7F05A1D8 C4840034 */ lwc1 $f4, 0x34($a0)
|
|
/* 08ED0C 7F05A1DC 460A3202 */ mul.s $f8, $f6, $f10
|
|
/* 08ED10 7F05A1E0 C4A60014 */ lwc1 $f6, 0x14($a1)
|
|
/* 08ED14 7F05A1E4 46062282 */ mul.s $f10, $f4, $f6
|
|
/* 08ED18 7F05A1E8 C4A60024 */ lwc1 $f6, 0x24($a1)
|
|
/* 08ED1C 7F05A1EC 460A4100 */ add.s $f4, $f8, $f10
|
|
/* 08ED20 7F05A1F0 C4880038 */ lwc1 $f8, 0x38($a0)
|
|
/* 08ED24 7F05A1F4 46083282 */ mul.s $f10, $f6, $f8
|
|
/* 08ED28 7F05A1F8 46045180 */ add.s $f6, $f10, $f4
|
|
/* 08ED2C 7F05A1FC C4A40008 */ lwc1 $f4, 8($a1)
|
|
/* 08ED30 7F05A200 46003207 */ neg.s $f8, $f6
|
|
/* 08ED34 7F05A204 E4A80034 */ swc1 $f8, 0x34($a1)
|
|
/* 08ED38 7F05A208 C48A0030 */ lwc1 $f10, 0x30($a0)
|
|
/* 08ED3C 7F05A20C C4880034 */ lwc1 $f8, 0x34($a0)
|
|
/* 08ED40 7F05A210 46045182 */ mul.s $f6, $f10, $f4
|
|
/* 08ED44 7F05A214 C4AA0018 */ lwc1 $f10, 0x18($a1)
|
|
/* 08ED48 7F05A218 460A4102 */ mul.s $f4, $f8, $f10
|
|
/* 08ED4C 7F05A21C C4AA0028 */ lwc1 $f10, 0x28($a1)
|
|
/* 08ED50 7F05A220 46043200 */ add.s $f8, $f6, $f4
|
|
/* 08ED54 7F05A224 C4860038 */ lwc1 $f6, 0x38($a0)
|
|
/* 08ED58 7F05A228 27BD0030 */ addiu $sp, $sp, 0x30
|
|
/* 08ED5C 7F05A22C E4A2003C */ swc1 $f2, 0x3c($a1)
|
|
/* 08ED60 7F05A230 46065102 */ mul.s $f4, $f10, $f6
|
|
/* 08ED64 7F05A234 E4A0000C */ swc1 $f0, 0xc($a1)
|
|
/* 08ED68 7F05A238 E4A0001C */ swc1 $f0, 0x1c($a1)
|
|
/* 08ED6C 7F05A23C E4A0002C */ swc1 $f0, 0x2c($a1)
|
|
/* 08ED70 7F05A240 46082280 */ add.s $f10, $f4, $f8
|
|
/* 08ED74 7F05A244 46005187 */ neg.s $f6, $f10
|
|
/* 08ED78 7F05A248 03E00008 */ jr $ra
|
|
/* 08ED7C 7F05A24C E4A60038 */ swc1 $f6, 0x38($a1)
|
|
)
|
|
#endif
|
|
|
|
void matrix_4x4_7F05A310(Mtxf *arg0, Mtxf *arg1);
|
|
|
|
f32 matrix_4x4_determinant(Mtxf *matrix);
|
|
|
|
void matrix_4x4_7F05A250(Mtxf *arg0, Mtxf *arg1) {
|
|
s32 i, j;
|
|
f32 inv_det;
|
|
matrix_4x4_7F05A310(arg0, arg1);
|
|
inv_det = 1.0f / matrix_4x4_determinant(arg0);
|
|
for (i = 0; i < 4; i++) {
|
|
for (j = 0; j < 4; j++) {
|
|
arg1->m[i][j] *= inv_det;
|
|
}
|
|
}
|
|
}
|
|
|
|
#ifdef NONMATCHING
|
|
f32 matrix_3x3_determinant(f32 a, f32 d, f32 g, f32 b, f32 e, f32 h, f32 c, f32 f, f32 i);
|
|
// Stack pointer mostly
|
|
void matrix_4x4_7F05A310(Mtxf arg0, Mtxf arg1) {
|
|
f32 m00 = arg0->m[0][0];
|
|
f32 m01 = arg0->m[0][1];
|
|
f32 m02 = arg0->m[0][2];
|
|
f32 m03 = arg0->m[0][3];
|
|
f32 m10 = arg0->m[1][0];
|
|
f32 m11 = arg0->m[1][1];
|
|
f32 m12 = arg0->m[1][2];
|
|
f32 m13 = arg0->m[1][3];
|
|
f32 m20 = arg0->m[2][0];
|
|
f32 m21 = arg0->m[2][1];
|
|
f32 m22 = arg0->m[2][2];
|
|
f32 m23 = arg0->m[2][3];
|
|
f32 m30 = arg0->m[3][0];
|
|
f32 m31 = arg0->m[3][1];
|
|
f32 m32 = arg0->m[3][2];
|
|
f32 m33 = arg0->m[3][3];
|
|
arg1->m[0][0] = matrix_3x3_determinant(m11, m21, m31, m12, m22, m32, m13, m23, m33);
|
|
arg1->m[1][0] = -matrix_3x3_determinant(m10, m20, m30, m12, m22, m32, m13, m23, m33);
|
|
arg1->m[2][0] = matrix_3x3_determinant(m10, m20, m30, m11, m21, m31, m13, m23, m33);
|
|
arg1->m[3][0] = -matrix_3x3_determinant(m10, m20, m30, m11, m21, m31, m12, m22, m32);
|
|
arg1->m[0][1] = -matrix_3x3_determinant(m01, m21, m31, m02, m22, m32, m03, m23, m33);
|
|
arg1->m[1][1] = matrix_3x3_determinant(m00, m20, m30, m02, m22, m32, m03, m23, m33);
|
|
arg1->m[2][1] = -matrix_3x3_determinant(m00, m20, m30, m01, m21, m31, m03, m23, m33);
|
|
arg1->m[3][1] = matrix_3x3_determinant(m00, m20, m30, m01, m21, m31, m02, m22, m32);
|
|
arg1->m[0][2] = matrix_3x3_determinant(m01, m11, m31, m02, m12, m32, m03, m13, m33);
|
|
arg1->m[1][2] = -matrix_3x3_determinant(m00, m10, m30, m02, m12, m32, m03, m13, m33);
|
|
arg1->m[2][2] = matrix_3x3_determinant(m00, m10, m30, m01, m11, m31, m03, m13, m33);
|
|
arg1->m[3][2] = -matrix_3x3_determinant(m00, m10, m30, m01, m11, m31, m02, m12, m32);
|
|
arg1->m[0][3] = -matrix_3x3_determinant(m01, m11, m21, m02, m12, m22, m03, m13, m23);
|
|
arg1->m[1][3] = matrix_3x3_determinant(m00, m10, m20, m02, m12, m22, m03, m13, m23);
|
|
arg1->m[2][3] = -matrix_3x3_determinant(m00, m10, m20, m01, m11, m21, m03, m13, m23);
|
|
arg1->m[3][3] = matrix_3x3_determinant(m00, m10, m20, m01, m11, m21, m02, m12, m22);
|
|
}
|
|
#else
|
|
GLOBAL_ASM(
|
|
.text
|
|
glabel matrix_4x4_7F05A310
|
|
/* 08EE40 7F05A310 27BDFF58 */ addiu $sp, $sp, -0xa8
|
|
/* 08EE44 7F05A314 AFBF0064 */ sw $ra, 0x64($sp)
|
|
/* 08EE48 7F05A318 AFB00060 */ sw $s0, 0x60($sp)
|
|
/* 08EE4C 7F05A31C F7BE0058 */ sdc1 $f30, 0x58($sp)
|
|
/* 08EE50 7F05A320 F7BC0050 */ sdc1 $f28, 0x50($sp)
|
|
/* 08EE54 7F05A324 F7BA0048 */ sdc1 $f26, 0x48($sp)
|
|
/* 08EE58 7F05A328 F7B80040 */ sdc1 $f24, 0x40($sp)
|
|
/* 08EE5C 7F05A32C F7B60038 */ sdc1 $f22, 0x38($sp)
|
|
/* 08EE60 7F05A330 F7B40030 */ sdc1 $f20, 0x30($sp)
|
|
/* 08EE64 7F05A334 C4840008 */ lwc1 $f4, 8($a0)
|
|
/* 08EE68 7F05A338 C49E0004 */ lwc1 $f30, 4($a0)
|
|
/* 08EE6C 7F05A33C C49C0000 */ lwc1 $f28, ($a0)
|
|
/* 08EE70 7F05A340 E7A40084 */ swc1 $f4, 0x84($sp)
|
|
/* 08EE74 7F05A344 C486000C */ lwc1 $f6, 0xc($a0)
|
|
/* 08EE78 7F05A348 00A08025 */ move $s0, $a1
|
|
/* 08EE7C 7F05A34C E7A60074 */ swc1 $f6, 0x74($sp)
|
|
/* 08EE80 7F05A350 C4880010 */ lwc1 $f8, 0x10($a0)
|
|
/* 08EE84 7F05A354 E7A800A0 */ swc1 $f8, 0xa0($sp)
|
|
/* 08EE88 7F05A358 C48A0020 */ lwc1 $f10, 0x20($a0)
|
|
/* 08EE8C 7F05A35C C48C0014 */ lwc1 $f12, 0x14($a0)
|
|
/* 08EE90 7F05A360 C482001C */ lwc1 $f2, 0x1c($a0)
|
|
/* 08EE94 7F05A364 C4800018 */ lwc1 $f0, 0x18($a0)
|
|
/* 08EE98 7F05A368 E7AA009C */ swc1 $f10, 0x9c($sp)
|
|
/* 08EE9C 7F05A36C C4960034 */ lwc1 $f22, 0x34($a0)
|
|
/* 08EEA0 7F05A370 C48E0024 */ lwc1 $f14, 0x24($a0)
|
|
/* 08EEA4 7F05A374 C492002C */ lwc1 $f18, 0x2c($a0)
|
|
/* 08EEA8 7F05A378 C4900028 */ lwc1 $f16, 0x28($a0)
|
|
/* 08EEAC 7F05A37C C49A003C */ lwc1 $f26, 0x3c($a0)
|
|
/* 08EEB0 7F05A380 C4980038 */ lwc1 $f24, 0x38($a0)
|
|
/* 08EEB4 7F05A384 C4940030 */ lwc1 $f20, 0x30($a0)
|
|
/* 08EEB8 7F05A388 44070000 */ mfc1 $a3, $f0
|
|
/* 08EEBC 7F05A38C 4406B000 */ mfc1 $a2, $f22
|
|
/* 08EEC0 7F05A390 E7AC0090 */ swc1 $f12, 0x90($sp)
|
|
/* 08EEC4 7F05A394 E7A20070 */ swc1 $f2, 0x70($sp)
|
|
/* 08EEC8 7F05A398 E7A20018 */ swc1 $f2, 0x18($sp)
|
|
/* 08EECC 7F05A39C E7A00080 */ swc1 $f0, 0x80($sp)
|
|
/* 08EED0 7F05A3A0 E7AE008C */ swc1 $f14, 0x8c($sp)
|
|
/* 08EED4 7F05A3A4 E7B2006C */ swc1 $f18, 0x6c($sp)
|
|
/* 08EED8 7F05A3A8 E7B2001C */ swc1 $f18, 0x1c($sp)
|
|
/* 08EEDC 7F05A3AC E7B0007C */ swc1 $f16, 0x7c($sp)
|
|
/* 08EEE0 7F05A3B0 E7B00010 */ swc1 $f16, 0x10($sp)
|
|
/* 08EEE4 7F05A3B4 E7BA0020 */ swc1 $f26, 0x20($sp)
|
|
/* 08EEE8 7F05A3B8 0FC16A4A */ jal matrix_3x3_determinant
|
|
/* 08EEEC 7F05A3BC E7B80014 */ swc1 $f24, 0x14($sp)
|
|
/* 08EEF0 7F05A3C0 E6000000 */ swc1 $f0, ($s0)
|
|
/* 08EEF4 7F05A3C4 C7A8006C */ lwc1 $f8, 0x6c($sp)
|
|
/* 08EEF8 7F05A3C8 C7A60070 */ lwc1 $f6, 0x70($sp)
|
|
/* 08EEFC 7F05A3CC C7A4007C */ lwc1 $f4, 0x7c($sp)
|
|
/* 08EF00 7F05A3D0 4406A000 */ mfc1 $a2, $f20
|
|
/* 08EF04 7F05A3D4 E7BA0020 */ swc1 $f26, 0x20($sp)
|
|
/* 08EF08 7F05A3D8 E7B80014 */ swc1 $f24, 0x14($sp)
|
|
/* 08EF0C 7F05A3DC 8FA70080 */ lw $a3, 0x80($sp)
|
|
/* 08EF10 7F05A3E0 C7AE009C */ lwc1 $f14, 0x9c($sp)
|
|
/* 08EF14 7F05A3E4 C7AC00A0 */ lwc1 $f12, 0xa0($sp)
|
|
/* 08EF18 7F05A3E8 E7A8001C */ swc1 $f8, 0x1c($sp)
|
|
/* 08EF1C 7F05A3EC E7A60018 */ swc1 $f6, 0x18($sp)
|
|
/* 08EF20 7F05A3F0 0FC16A4A */ jal matrix_3x3_determinant
|
|
/* 08EF24 7F05A3F4 E7A40010 */ swc1 $f4, 0x10($sp)
|
|
/* 08EF28 7F05A3F8 46000287 */ neg.s $f10, $f0
|
|
/* 08EF2C 7F05A3FC 4406A000 */ mfc1 $a2, $f20
|
|
/* 08EF30 7F05A400 E60A0010 */ swc1 $f10, 0x10($s0)
|
|
/* 08EF34 7F05A404 C7A8006C */ lwc1 $f8, 0x6c($sp)
|
|
/* 08EF38 7F05A408 C7A60070 */ lwc1 $f6, 0x70($sp)
|
|
/* 08EF3C 7F05A40C C7A4008C */ lwc1 $f4, 0x8c($sp)
|
|
/* 08EF40 7F05A410 E7BA0020 */ swc1 $f26, 0x20($sp)
|
|
/* 08EF44 7F05A414 E7B60014 */ swc1 $f22, 0x14($sp)
|
|
/* 08EF48 7F05A418 8FA70090 */ lw $a3, 0x90($sp)
|
|
/* 08EF4C 7F05A41C C7AE009C */ lwc1 $f14, 0x9c($sp)
|
|
/* 08EF50 7F05A420 C7AC00A0 */ lwc1 $f12, 0xa0($sp)
|
|
/* 08EF54 7F05A424 E7A8001C */ swc1 $f8, 0x1c($sp)
|
|
/* 08EF58 7F05A428 E7A60018 */ swc1 $f6, 0x18($sp)
|
|
/* 08EF5C 7F05A42C 0FC16A4A */ jal matrix_3x3_determinant
|
|
/* 08EF60 7F05A430 E7A40010 */ swc1 $f4, 0x10($sp)
|
|
/* 08EF64 7F05A434 E6000020 */ swc1 $f0, 0x20($s0)
|
|
/* 08EF68 7F05A438 C7A6007C */ lwc1 $f6, 0x7c($sp)
|
|
/* 08EF6C 7F05A43C C7A40080 */ lwc1 $f4, 0x80($sp)
|
|
/* 08EF70 7F05A440 C7AA008C */ lwc1 $f10, 0x8c($sp)
|
|
/* 08EF74 7F05A444 4406A000 */ mfc1 $a2, $f20
|
|
/* 08EF78 7F05A448 E7B80020 */ swc1 $f24, 0x20($sp)
|
|
/* 08EF7C 7F05A44C E7B60014 */ swc1 $f22, 0x14($sp)
|
|
/* 08EF80 7F05A450 8FA70090 */ lw $a3, 0x90($sp)
|
|
/* 08EF84 7F05A454 C7AE009C */ lwc1 $f14, 0x9c($sp)
|
|
/* 08EF88 7F05A458 C7AC00A0 */ lwc1 $f12, 0xa0($sp)
|
|
/* 08EF8C 7F05A45C E7A6001C */ swc1 $f6, 0x1c($sp)
|
|
/* 08EF90 7F05A460 E7A40018 */ swc1 $f4, 0x18($sp)
|
|
/* 08EF94 7F05A464 0FC16A4A */ jal matrix_3x3_determinant
|
|
/* 08EF98 7F05A468 E7AA0010 */ swc1 $f10, 0x10($sp)
|
|
/* 08EF9C 7F05A46C 46000207 */ neg.s $f8, $f0
|
|
/* 08EFA0 7F05A470 4406B000 */ mfc1 $a2, $f22
|
|
/* 08EFA4 7F05A474 E6080030 */ swc1 $f8, 0x30($s0)
|
|
/* 08EFA8 7F05A478 C7A6006C */ lwc1 $f6, 0x6c($sp)
|
|
/* 08EFAC 7F05A47C C7A40074 */ lwc1 $f4, 0x74($sp)
|
|
/* 08EFB0 7F05A480 C7AA007C */ lwc1 $f10, 0x7c($sp)
|
|
/* 08EFB4 7F05A484 E7BA0020 */ swc1 $f26, 0x20($sp)
|
|
/* 08EFB8 7F05A488 E7B80014 */ swc1 $f24, 0x14($sp)
|
|
/* 08EFBC 7F05A48C 8FA70084 */ lw $a3, 0x84($sp)
|
|
/* 08EFC0 7F05A490 C7AE008C */ lwc1 $f14, 0x8c($sp)
|
|
/* 08EFC4 7F05A494 4600F306 */ mov.s $f12, $f30
|
|
/* 08EFC8 7F05A498 E7A6001C */ swc1 $f6, 0x1c($sp)
|
|
/* 08EFCC 7F05A49C E7A40018 */ swc1 $f4, 0x18($sp)
|
|
/* 08EFD0 7F05A4A0 0FC16A4A */ jal matrix_3x3_determinant
|
|
/* 08EFD4 7F05A4A4 E7AA0010 */ swc1 $f10, 0x10($sp)
|
|
/* 08EFD8 7F05A4A8 46000207 */ neg.s $f8, $f0
|
|
/* 08EFDC 7F05A4AC 4406A000 */ mfc1 $a2, $f20
|
|
/* 08EFE0 7F05A4B0 E6080004 */ swc1 $f8, 4($s0)
|
|
/* 08EFE4 7F05A4B4 C7A6006C */ lwc1 $f6, 0x6c($sp)
|
|
/* 08EFE8 7F05A4B8 C7A40074 */ lwc1 $f4, 0x74($sp)
|
|
/* 08EFEC 7F05A4BC C7AA007C */ lwc1 $f10, 0x7c($sp)
|
|
/* 08EFF0 7F05A4C0 E7BA0020 */ swc1 $f26, 0x20($sp)
|
|
/* 08EFF4 7F05A4C4 E7B80014 */ swc1 $f24, 0x14($sp)
|
|
/* 08EFF8 7F05A4C8 8FA70084 */ lw $a3, 0x84($sp)
|
|
/* 08EFFC 7F05A4CC C7AE009C */ lwc1 $f14, 0x9c($sp)
|
|
/* 08F000 7F05A4D0 4600E306 */ mov.s $f12, $f28
|
|
/* 08F004 7F05A4D4 E7A6001C */ swc1 $f6, 0x1c($sp)
|
|
/* 08F008 7F05A4D8 E7A40018 */ swc1 $f4, 0x18($sp)
|
|
/* 08F00C 7F05A4DC 0FC16A4A */ jal matrix_3x3_determinant
|
|
/* 08F010 7F05A4E0 E7AA0010 */ swc1 $f10, 0x10($sp)
|
|
/* 08F014 7F05A4E4 E6000014 */ swc1 $f0, 0x14($s0)
|
|
/* 08F018 7F05A4E8 C7A4006C */ lwc1 $f4, 0x6c($sp)
|
|
/* 08F01C 7F05A4EC C7AA0074 */ lwc1 $f10, 0x74($sp)
|
|
/* 08F020 7F05A4F0 C7A8008C */ lwc1 $f8, 0x8c($sp)
|
|
/* 08F024 7F05A4F4 4406A000 */ mfc1 $a2, $f20
|
|
/* 08F028 7F05A4F8 4407F000 */ mfc1 $a3, $f30
|
|
/* 08F02C 7F05A4FC E7BA0020 */ swc1 $f26, 0x20($sp)
|
|
/* 08F030 7F05A500 E7B60014 */ swc1 $f22, 0x14($sp)
|
|
/* 08F034 7F05A504 C7AE009C */ lwc1 $f14, 0x9c($sp)
|
|
/* 08F038 7F05A508 4600E306 */ mov.s $f12, $f28
|
|
/* 08F03C 7F05A50C E7A4001C */ swc1 $f4, 0x1c($sp)
|
|
/* 08F040 7F05A510 E7AA0018 */ swc1 $f10, 0x18($sp)
|
|
/* 08F044 7F05A514 0FC16A4A */ jal matrix_3x3_determinant
|
|
/* 08F048 7F05A518 E7A80010 */ swc1 $f8, 0x10($sp)
|
|
/* 08F04C 7F05A51C 46000187 */ neg.s $f6, $f0
|
|
/* 08F050 7F05A520 4406A000 */ mfc1 $a2, $f20
|
|
/* 08F054 7F05A524 E6060024 */ swc1 $f6, 0x24($s0)
|
|
/* 08F058 7F05A528 C7A4007C */ lwc1 $f4, 0x7c($sp)
|
|
/* 08F05C 7F05A52C C7AA0084 */ lwc1 $f10, 0x84($sp)
|
|
/* 08F060 7F05A530 C7A8008C */ lwc1 $f8, 0x8c($sp)
|
|
/* 08F064 7F05A534 4407F000 */ mfc1 $a3, $f30
|
|
/* 08F068 7F05A538 E7B80020 */ swc1 $f24, 0x20($sp)
|
|
/* 08F06C 7F05A53C E7B60014 */ swc1 $f22, 0x14($sp)
|
|
/* 08F070 7F05A540 C7AE009C */ lwc1 $f14, 0x9c($sp)
|
|
/* 08F074 7F05A544 4600E306 */ mov.s $f12, $f28
|
|
/* 08F078 7F05A548 E7A4001C */ swc1 $f4, 0x1c($sp)
|
|
/* 08F07C 7F05A54C E7AA0018 */ swc1 $f10, 0x18($sp)
|
|
/* 08F080 7F05A550 0FC16A4A */ jal matrix_3x3_determinant
|
|
/* 08F084 7F05A554 E7A80010 */ swc1 $f8, 0x10($sp)
|
|
/* 08F088 7F05A558 E6000034 */ swc1 $f0, 0x34($s0)
|
|
/* 08F08C 7F05A55C C7AA0070 */ lwc1 $f10, 0x70($sp)
|
|
/* 08F090 7F05A560 C7A80074 */ lwc1 $f8, 0x74($sp)
|
|
/* 08F094 7F05A564 C7A60080 */ lwc1 $f6, 0x80($sp)
|
|
/* 08F098 7F05A568 4406B000 */ mfc1 $a2, $f22
|
|
/* 08F09C 7F05A56C E7BA0020 */ swc1 $f26, 0x20($sp)
|
|
/* 08F0A0 7F05A570 E7B80014 */ swc1 $f24, 0x14($sp)
|
|
/* 08F0A4 7F05A574 8FA70084 */ lw $a3, 0x84($sp)
|
|
/* 08F0A8 7F05A578 C7AE0090 */ lwc1 $f14, 0x90($sp)
|
|
/* 08F0AC 7F05A57C 4600F306 */ mov.s $f12, $f30
|
|
/* 08F0B0 7F05A580 E7AA001C */ swc1 $f10, 0x1c($sp)
|
|
/* 08F0B4 7F05A584 E7A80018 */ swc1 $f8, 0x18($sp)
|
|
/* 08F0B8 7F05A588 0FC16A4A */ jal matrix_3x3_determinant
|
|
/* 08F0BC 7F05A58C E7A60010 */ swc1 $f6, 0x10($sp)
|
|
/* 08F0C0 7F05A590 E6000008 */ swc1 $f0, 8($s0)
|
|
/* 08F0C4 7F05A594 C7A80070 */ lwc1 $f8, 0x70($sp)
|
|
/* 08F0C8 7F05A598 C7A60074 */ lwc1 $f6, 0x74($sp)
|
|
/* 08F0CC 7F05A59C C7A40080 */ lwc1 $f4, 0x80($sp)
|
|
/* 08F0D0 7F05A5A0 4406A000 */ mfc1 $a2, $f20
|
|
/* 08F0D4 7F05A5A4 E7BA0020 */ swc1 $f26, 0x20($sp)
|
|
/* 08F0D8 7F05A5A8 E7B80014 */ swc1 $f24, 0x14($sp)
|
|
/* 08F0DC 7F05A5AC 8FA70084 */ lw $a3, 0x84($sp)
|
|
/* 08F0E0 7F05A5B0 C7AE00A0 */ lwc1 $f14, 0xa0($sp)
|
|
/* 08F0E4 7F05A5B4 4600E306 */ mov.s $f12, $f28
|
|
/* 08F0E8 7F05A5B8 E7A8001C */ swc1 $f8, 0x1c($sp)
|
|
/* 08F0EC 7F05A5BC E7A60018 */ swc1 $f6, 0x18($sp)
|
|
/* 08F0F0 7F05A5C0 0FC16A4A */ jal matrix_3x3_determinant
|
|
/* 08F0F4 7F05A5C4 E7A40010 */ swc1 $f4, 0x10($sp)
|
|
/* 08F0F8 7F05A5C8 46000287 */ neg.s $f10, $f0
|
|
/* 08F0FC 7F05A5CC 4406A000 */ mfc1 $a2, $f20
|
|
/* 08F100 7F05A5D0 E60A0018 */ swc1 $f10, 0x18($s0)
|
|
/* 08F104 7F05A5D4 C7A80070 */ lwc1 $f8, 0x70($sp)
|
|
/* 08F108 7F05A5D8 C7A60074 */ lwc1 $f6, 0x74($sp)
|
|
/* 08F10C 7F05A5DC C7A40090 */ lwc1 $f4, 0x90($sp)
|
|
/* 08F110 7F05A5E0 4407F000 */ mfc1 $a3, $f30
|
|
/* 08F114 7F05A5E4 E7BA0020 */ swc1 $f26, 0x20($sp)
|
|
/* 08F118 7F05A5E8 E7B60014 */ swc1 $f22, 0x14($sp)
|
|
/* 08F11C 7F05A5EC C7AE00A0 */ lwc1 $f14, 0xa0($sp)
|
|
/* 08F120 7F05A5F0 4600E306 */ mov.s $f12, $f28
|
|
/* 08F124 7F05A5F4 E7A8001C */ swc1 $f8, 0x1c($sp)
|
|
/* 08F128 7F05A5F8 E7A60018 */ swc1 $f6, 0x18($sp)
|
|
/* 08F12C 7F05A5FC 0FC16A4A */ jal matrix_3x3_determinant
|
|
/* 08F130 7F05A600 E7A40010 */ swc1 $f4, 0x10($sp)
|
|
/* 08F134 7F05A604 E6000028 */ swc1 $f0, 0x28($s0)
|
|
/* 08F138 7F05A608 C7A60080 */ lwc1 $f6, 0x80($sp)
|
|
/* 08F13C 7F05A60C C7A40084 */ lwc1 $f4, 0x84($sp)
|
|
/* 08F140 7F05A610 C7AA0090 */ lwc1 $f10, 0x90($sp)
|
|
/* 08F144 7F05A614 4406A000 */ mfc1 $a2, $f20
|
|
/* 08F148 7F05A618 4407F000 */ mfc1 $a3, $f30
|
|
/* 08F14C 7F05A61C E7B80020 */ swc1 $f24, 0x20($sp)
|
|
/* 08F150 7F05A620 E7B60014 */ swc1 $f22, 0x14($sp)
|
|
/* 08F154 7F05A624 C7AE00A0 */ lwc1 $f14, 0xa0($sp)
|
|
/* 08F158 7F05A628 4600E306 */ mov.s $f12, $f28
|
|
/* 08F15C 7F05A62C E7A6001C */ swc1 $f6, 0x1c($sp)
|
|
/* 08F160 7F05A630 E7A40018 */ swc1 $f4, 0x18($sp)
|
|
/* 08F164 7F05A634 0FC16A4A */ jal matrix_3x3_determinant
|
|
/* 08F168 7F05A638 E7AA0010 */ swc1 $f10, 0x10($sp)
|
|
/* 08F16C 7F05A63C 46000207 */ neg.s $f8, $f0
|
|
/* 08F170 7F05A640 4600F306 */ mov.s $f12, $f30
|
|
/* 08F174 7F05A644 E6080038 */ swc1 $f8, 0x38($s0)
|
|
/* 08F178 7F05A648 C7AA0080 */ lwc1 $f10, 0x80($sp)
|
|
/* 08F17C 7F05A64C C7A80070 */ lwc1 $f8, 0x70($sp)
|
|
/* 08F180 7F05A650 C7A60074 */ lwc1 $f6, 0x74($sp)
|
|
/* 08F184 7F05A654 E7AA0010 */ swc1 $f10, 0x10($sp)
|
|
/* 08F188 7F05A658 C7AA006C */ lwc1 $f10, 0x6c($sp)
|
|
/* 08F18C 7F05A65C C7A4007C */ lwc1 $f4, 0x7c($sp)
|
|
/* 08F190 7F05A660 8FA70084 */ lw $a3, 0x84($sp)
|
|
/* 08F194 7F05A664 8FA6008C */ lw $a2, 0x8c($sp)
|
|
/* 08F198 7F05A668 C7AE0090 */ lwc1 $f14, 0x90($sp)
|
|
/* 08F19C 7F05A66C E7A8001C */ swc1 $f8, 0x1c($sp)
|
|
/* 08F1A0 7F05A670 E7A60018 */ swc1 $f6, 0x18($sp)
|
|
/* 08F1A4 7F05A674 E7AA0020 */ swc1 $f10, 0x20($sp)
|
|
/* 08F1A8 7F05A678 0FC16A4A */ jal matrix_3x3_determinant
|
|
/* 08F1AC 7F05A67C E7A40014 */ swc1 $f4, 0x14($sp)
|
|
/* 08F1B0 7F05A680 46000107 */ neg.s $f4, $f0
|
|
/* 08F1B4 7F05A684 4600E306 */ mov.s $f12, $f28
|
|
/* 08F1B8 7F05A688 E604000C */ swc1 $f4, 0xc($s0)
|
|
/* 08F1BC 7F05A68C C7A60080 */ lwc1 $f6, 0x80($sp)
|
|
/* 08F1C0 7F05A690 C7A40070 */ lwc1 $f4, 0x70($sp)
|
|
/* 08F1C4 7F05A694 C7AA0074 */ lwc1 $f10, 0x74($sp)
|
|
/* 08F1C8 7F05A698 E7A60010 */ swc1 $f6, 0x10($sp)
|
|
/* 08F1CC 7F05A69C C7A6006C */ lwc1 $f6, 0x6c($sp)
|
|
/* 08F1D0 7F05A6A0 C7A8007C */ lwc1 $f8, 0x7c($sp)
|
|
/* 08F1D4 7F05A6A4 8FA70084 */ lw $a3, 0x84($sp)
|
|
/* 08F1D8 7F05A6A8 8FA6009C */ lw $a2, 0x9c($sp)
|
|
/* 08F1DC 7F05A6AC C7AE00A0 */ lwc1 $f14, 0xa0($sp)
|
|
/* 08F1E0 7F05A6B0 E7A4001C */ swc1 $f4, 0x1c($sp)
|
|
/* 08F1E4 7F05A6B4 E7AA0018 */ swc1 $f10, 0x18($sp)
|
|
/* 08F1E8 7F05A6B8 E7A60020 */ swc1 $f6, 0x20($sp)
|
|
/* 08F1EC 7F05A6BC 0FC16A4A */ jal matrix_3x3_determinant
|
|
/* 08F1F0 7F05A6C0 E7A80014 */ swc1 $f8, 0x14($sp)
|
|
/* 08F1F4 7F05A6C4 E600001C */ swc1 $f0, 0x1c($s0)
|
|
/* 08F1F8 7F05A6C8 C7A80090 */ lwc1 $f8, 0x90($sp)
|
|
/* 08F1FC 7F05A6CC C7A60070 */ lwc1 $f6, 0x70($sp)
|
|
/* 08F200 7F05A6D0 C7A40074 */ lwc1 $f4, 0x74($sp)
|
|
/* 08F204 7F05A6D4 E7A80010 */ swc1 $f8, 0x10($sp)
|
|
/* 08F208 7F05A6D8 C7A8006C */ lwc1 $f8, 0x6c($sp)
|
|
/* 08F20C 7F05A6DC C7AA008C */ lwc1 $f10, 0x8c($sp)
|
|
/* 08F210 7F05A6E0 4407F000 */ mfc1 $a3, $f30
|
|
/* 08F214 7F05A6E4 8FA6009C */ lw $a2, 0x9c($sp)
|
|
/* 08F218 7F05A6E8 C7AE00A0 */ lwc1 $f14, 0xa0($sp)
|
|
/* 08F21C 7F05A6EC 4600E306 */ mov.s $f12, $f28
|
|
/* 08F220 7F05A6F0 E7A6001C */ swc1 $f6, 0x1c($sp)
|
|
/* 08F224 7F05A6F4 E7A40018 */ swc1 $f4, 0x18($sp)
|
|
/* 08F228 7F05A6F8 E7A80020 */ swc1 $f8, 0x20($sp)
|
|
/* 08F22C 7F05A6FC 0FC16A4A */ jal matrix_3x3_determinant
|
|
/* 08F230 7F05A700 E7AA0014 */ swc1 $f10, 0x14($sp)
|
|
/* 08F234 7F05A704 46000287 */ neg.s $f10, $f0
|
|
/* 08F238 7F05A708 4407F000 */ mfc1 $a3, $f30
|
|
/* 08F23C 7F05A70C E60A002C */ swc1 $f10, 0x2c($s0)
|
|
/* 08F240 7F05A710 C7A40090 */ lwc1 $f4, 0x90($sp)
|
|
/* 08F244 7F05A714 C7AA0080 */ lwc1 $f10, 0x80($sp)
|
|
/* 08F248 7F05A718 C7A80084 */ lwc1 $f8, 0x84($sp)
|
|
/* 08F24C 7F05A71C E7A40010 */ swc1 $f4, 0x10($sp)
|
|
/* 08F250 7F05A720 C7A4007C */ lwc1 $f4, 0x7c($sp)
|
|
/* 08F254 7F05A724 C7A6008C */ lwc1 $f6, 0x8c($sp)
|
|
/* 08F258 7F05A728 8FA6009C */ lw $a2, 0x9c($sp)
|
|
/* 08F25C 7F05A72C C7AE00A0 */ lwc1 $f14, 0xa0($sp)
|
|
/* 08F260 7F05A730 4600E306 */ mov.s $f12, $f28
|
|
/* 08F264 7F05A734 E7AA001C */ swc1 $f10, 0x1c($sp)
|
|
/* 08F268 7F05A738 E7A80018 */ swc1 $f8, 0x18($sp)
|
|
/* 08F26C 7F05A73C E7A40020 */ swc1 $f4, 0x20($sp)
|
|
/* 08F270 7F05A740 0FC16A4A */ jal matrix_3x3_determinant
|
|
/* 08F274 7F05A744 E7A60014 */ swc1 $f6, 0x14($sp)
|
|
/* 08F278 7F05A748 E600003C */ swc1 $f0, 0x3c($s0)
|
|
/* 08F27C 7F05A74C 8FBF0064 */ lw $ra, 0x64($sp)
|
|
/* 08F280 7F05A750 8FB00060 */ lw $s0, 0x60($sp)
|
|
/* 08F284 7F05A754 D7BE0058 */ ldc1 $f30, 0x58($sp)
|
|
/* 08F288 7F05A758 D7BC0050 */ ldc1 $f28, 0x50($sp)
|
|
/* 08F28C 7F05A75C D7BA0048 */ ldc1 $f26, 0x48($sp)
|
|
/* 08F290 7F05A760 D7B80040 */ ldc1 $f24, 0x40($sp)
|
|
/* 08F294 7F05A764 D7B60038 */ ldc1 $f22, 0x38($sp)
|
|
/* 08F298 7F05A768 D7B40030 */ ldc1 $f20, 0x30($sp)
|
|
/* 08F29C 7F05A76C 03E00008 */ jr $ra
|
|
/* 08F2A0 7F05A770 27BD00A8 */ addiu $sp, $sp, 0xa8
|
|
)
|
|
#endif
|
|
|
|
#ifdef NONMATCHING
|
|
f32 matrix_3x3_determinant(f32 a, f32 d, f32 g, f32 b, f32 e, f32 h, f32 c, f32 f, f32 i);
|
|
// Stack pointer mostly
|
|
f32 matrix_4x4_determinant(Mtxf *matrix) {
|
|
f32 det;
|
|
f32 a = matrix->m[0][0];
|
|
f32 b = matrix->m[0][1];
|
|
f32 c = matrix->m[0][2];
|
|
f32 d = matrix->m[0][3];
|
|
f32 e = matrix->m[1][0];
|
|
f32 f = matrix->m[1][1];
|
|
f32 g = matrix->m[1][2];
|
|
f32 h = matrix->m[1][3];
|
|
f32 i = matrix->m[2][0];
|
|
f32 j = matrix->m[2][1];
|
|
f32 k = matrix->m[2][2];
|
|
f32 l = matrix->m[2][3];
|
|
f32 m = matrix->m[3][0];
|
|
f32 n = matrix->m[3][1];
|
|
f32 o = matrix->m[3][2];
|
|
f32 p = matrix->m[3][3];
|
|
det = (a * matrix_3x3_determinant(f, j, n, g, k, o, h, l, p)) - (b * matrix_3x3_determinant(e, i, m, g, k, o, h, l, p)) + (c * matrix_3x3_determinant(e, i, m, f, j, n, h, l, p)) - (d * matrix_3x3_determinant(e, i, m, f, j, n, g, k, o));
|
|
// det = (a * matrix_3x3_determinant(f, g, h, j, k, l, n, o, p)) - (b * matrix_3x3_determinant(e, g, h, i, k, l, m, o, p)) + (c * matrix_3x3_determinant(e, f, h, i, j, l, m, n, p)) - (d * matrix_3x3_determinant(e, f, g, i, j, k, m, n, o));
|
|
return det;
|
|
}
|
|
#else
|
|
GLOBAL_ASM(
|
|
.text
|
|
glabel matrix_4x4_determinant
|
|
/* 08F2A4 7F05A774 27BDFF80 */ addiu $sp, $sp, -0x80
|
|
/* 08F2A8 7F05A778 AFBF002C */ sw $ra, 0x2c($sp)
|
|
/* 08F2AC 7F05A77C C4840000 */ lwc1 $f4, ($a0)
|
|
/* 08F2B0 7F05A780 E7A40078 */ swc1 $f4, 0x78($sp)
|
|
/* 08F2B4 7F05A784 C4860004 */ lwc1 $f6, 4($a0)
|
|
/* 08F2B8 7F05A788 E7A60068 */ swc1 $f6, 0x68($sp)
|
|
/* 08F2BC 7F05A78C C4880008 */ lwc1 $f8, 8($a0)
|
|
/* 08F2C0 7F05A790 E7A80058 */ swc1 $f8, 0x58($sp)
|
|
/* 08F2C4 7F05A794 C48A000C */ lwc1 $f10, 0xc($a0)
|
|
/* 08F2C8 7F05A798 E7AA0048 */ swc1 $f10, 0x48($sp)
|
|
/* 08F2CC 7F05A79C C4840018 */ lwc1 $f4, 0x18($a0)
|
|
/* 08F2D0 7F05A7A0 C4800014 */ lwc1 $f0, 0x14($a0)
|
|
/* 08F2D4 7F05A7A4 C48C0010 */ lwc1 $f12, 0x10($a0)
|
|
/* 08F2D8 7F05A7A8 E7A40054 */ swc1 $f4, 0x54($sp)
|
|
/* 08F2DC 7F05A7AC C4860028 */ lwc1 $f6, 0x28($a0)
|
|
/* 08F2E0 7F05A7B0 C482001C */ lwc1 $f2, 0x1c($a0)
|
|
/* 08F2E4 7F05A7B4 C4900024 */ lwc1 $f16, 0x24($a0)
|
|
/* 08F2E8 7F05A7B8 C48E0020 */ lwc1 $f14, 0x20($a0)
|
|
/* 08F2EC 7F05A7BC E7A60050 */ swc1 $f6, 0x50($sp)
|
|
/* 08F2F0 7F05A7C0 C4880030 */ lwc1 $f8, 0x30($a0)
|
|
/* 08F2F4 7F05A7C4 C492002C */ lwc1 $f18, 0x2c($a0)
|
|
/* 08F2F8 7F05A7C8 44070000 */ mfc1 $a3, $f0
|
|
/* 08F2FC 7F05A7CC E7A8006C */ swc1 $f8, 0x6c($sp)
|
|
/* 08F300 7F05A7D0 C48A0034 */ lwc1 $f10, 0x34($a0)
|
|
/* 08F304 7F05A7D4 8FA6006C */ lw $a2, 0x6c($sp)
|
|
/* 08F308 7F05A7D8 E7AA005C */ swc1 $f10, 0x5c($sp)
|
|
/* 08F30C 7F05A7DC C4840038 */ lwc1 $f4, 0x38($a0)
|
|
/* 08F310 7F05A7E0 C7A8005C */ lwc1 $f8, 0x5c($sp)
|
|
/* 08F314 7F05A7E4 E7A4004C */ swc1 $f4, 0x4c($sp)
|
|
/* 08F318 7F05A7E8 C486003C */ lwc1 $f6, 0x3c($a0)
|
|
/* 08F31C 7F05A7EC E7A00064 */ swc1 $f0, 0x64($sp)
|
|
/* 08F320 7F05A7F0 E7AC0074 */ swc1 $f12, 0x74($sp)
|
|
/* 08F324 7F05A7F4 E7A6003C */ swc1 $f6, 0x3c($sp)
|
|
/* 08F328 7F05A7F8 C7AA003C */ lwc1 $f10, 0x3c($sp)
|
|
/* 08F32C 7F05A7FC E7A20044 */ swc1 $f2, 0x44($sp)
|
|
/* 08F330 7F05A800 E7A20018 */ swc1 $f2, 0x18($sp)
|
|
/* 08F334 7F05A804 E7B00060 */ swc1 $f16, 0x60($sp)
|
|
/* 08F338 7F05A808 E7B00010 */ swc1 $f16, 0x10($sp)
|
|
/* 08F33C 7F05A80C E7AE0070 */ swc1 $f14, 0x70($sp)
|
|
/* 08F340 7F05A810 E7B20040 */ swc1 $f18, 0x40($sp)
|
|
/* 08F344 7F05A814 E7B2001C */ swc1 $f18, 0x1c($sp)
|
|
/* 08F348 7F05A818 E7A80014 */ swc1 $f8, 0x14($sp)
|
|
/* 08F34C 7F05A81C 0FC16A4A */ jal matrix_3x3_determinant
|
|
/* 08F350 7F05A820 E7AA0020 */ swc1 $f10, 0x20($sp)
|
|
/* 08F354 7F05A824 C7A40050 */ lwc1 $f4, 0x50($sp)
|
|
/* 08F358 7F05A828 C7A6004C */ lwc1 $f6, 0x4c($sp)
|
|
/* 08F35C 7F05A82C C7A80044 */ lwc1 $f8, 0x44($sp)
|
|
/* 08F360 7F05A830 E7A40010 */ swc1 $f4, 0x10($sp)
|
|
/* 08F364 7F05A834 C7A4003C */ lwc1 $f4, 0x3c($sp)
|
|
/* 08F368 7F05A838 C7AA0040 */ lwc1 $f10, 0x40($sp)
|
|
/* 08F36C 7F05A83C E7A00030 */ swc1 $f0, 0x30($sp)
|
|
/* 08F370 7F05A840 C7AC0074 */ lwc1 $f12, 0x74($sp)
|
|
/* 08F374 7F05A844 C7AE0070 */ lwc1 $f14, 0x70($sp)
|
|
/* 08F378 7F05A848 8FA6006C */ lw $a2, 0x6c($sp)
|
|
/* 08F37C 7F05A84C 8FA70054 */ lw $a3, 0x54($sp)
|
|
/* 08F380 7F05A850 E7A60014 */ swc1 $f6, 0x14($sp)
|
|
/* 08F384 7F05A854 E7A80018 */ swc1 $f8, 0x18($sp)
|
|
/* 08F388 7F05A858 E7A40020 */ swc1 $f4, 0x20($sp)
|
|
/* 08F38C 7F05A85C 0FC16A4A */ jal matrix_3x3_determinant
|
|
/* 08F390 7F05A860 E7AA001C */ swc1 $f10, 0x1c($sp)
|
|
/* 08F394 7F05A864 C7A60050 */ lwc1 $f6, 0x50($sp)
|
|
/* 08F398 7F05A868 C7A8004C */ lwc1 $f8, 0x4c($sp)
|
|
/* 08F39C 7F05A86C C7AA0044 */ lwc1 $f10, 0x44($sp)
|
|
/* 08F3A0 7F05A870 E7A60010 */ swc1 $f6, 0x10($sp)
|
|
/* 08F3A4 7F05A874 C7A6003C */ lwc1 $f6, 0x3c($sp)
|
|
/* 08F3A8 7F05A878 C7A40040 */ lwc1 $f4, 0x40($sp)
|
|
/* 08F3AC 7F05A87C E7A00034 */ swc1 $f0, 0x34($sp)
|
|
/* 08F3B0 7F05A880 C7AC0064 */ lwc1 $f12, 0x64($sp)
|
|
/* 08F3B4 7F05A884 C7AE0060 */ lwc1 $f14, 0x60($sp)
|
|
/* 08F3B8 7F05A888 8FA6005C */ lw $a2, 0x5c($sp)
|
|
/* 08F3BC 7F05A88C 8FA70054 */ lw $a3, 0x54($sp)
|
|
/* 08F3C0 7F05A890 E7A80014 */ swc1 $f8, 0x14($sp)
|
|
/* 08F3C4 7F05A894 E7AA0018 */ swc1 $f10, 0x18($sp)
|
|
/* 08F3C8 7F05A898 E7A60020 */ swc1 $f6, 0x20($sp)
|
|
/* 08F3CC 7F05A89C 0FC16A4A */ jal matrix_3x3_determinant
|
|
/* 08F3D0 7F05A8A0 E7A4001C */ swc1 $f4, 0x1c($sp)
|
|
/* 08F3D4 7F05A8A4 C7A80060 */ lwc1 $f8, 0x60($sp)
|
|
/* 08F3D8 7F05A8A8 C7AA005C */ lwc1 $f10, 0x5c($sp)
|
|
/* 08F3DC 7F05A8AC C7A40054 */ lwc1 $f4, 0x54($sp)
|
|
/* 08F3E0 7F05A8B0 E7A80010 */ swc1 $f8, 0x10($sp)
|
|
/* 08F3E4 7F05A8B4 C7A8004C */ lwc1 $f8, 0x4c($sp)
|
|
/* 08F3E8 7F05A8B8 C7A60050 */ lwc1 $f6, 0x50($sp)
|
|
/* 08F3EC 7F05A8BC E7A00038 */ swc1 $f0, 0x38($sp)
|
|
/* 08F3F0 7F05A8C0 C7AC0074 */ lwc1 $f12, 0x74($sp)
|
|
/* 08F3F4 7F05A8C4 C7AE0070 */ lwc1 $f14, 0x70($sp)
|
|
/* 08F3F8 7F05A8C8 8FA6006C */ lw $a2, 0x6c($sp)
|
|
/* 08F3FC 7F05A8CC 8FA70064 */ lw $a3, 0x64($sp)
|
|
/* 08F400 7F05A8D0 E7AA0014 */ swc1 $f10, 0x14($sp)
|
|
/* 08F404 7F05A8D4 E7A40018 */ swc1 $f4, 0x18($sp)
|
|
/* 08F408 7F05A8D8 E7A80020 */ swc1 $f8, 0x20($sp)
|
|
/* 08F40C 7F05A8DC 0FC16A4A */ jal matrix_3x3_determinant
|
|
/* 08F410 7F05A8E0 E7A6001C */ swc1 $f6, 0x1c($sp)
|
|
/* 08F414 7F05A8E4 C7AA0078 */ lwc1 $f10, 0x78($sp)
|
|
/* 08F418 7F05A8E8 C7A40038 */ lwc1 $f4, 0x38($sp)
|
|
/* 08F41C 7F05A8EC C7A80068 */ lwc1 $f8, 0x68($sp)
|
|
/* 08F420 7F05A8F0 8FBF002C */ lw $ra, 0x2c($sp)
|
|
/* 08F424 7F05A8F4 46045182 */ mul.s $f6, $f10, $f4
|
|
/* 08F428 7F05A8F8 C7AA0034 */ lwc1 $f10, 0x34($sp)
|
|
/* 08F42C 7F05A8FC 460A4102 */ mul.s $f4, $f8, $f10
|
|
/* 08F430 7F05A900 C7AA0058 */ lwc1 $f10, 0x58($sp)
|
|
/* 08F434 7F05A904 46043201 */ sub.s $f8, $f6, $f4
|
|
/* 08F438 7F05A908 C7A60030 */ lwc1 $f6, 0x30($sp)
|
|
/* 08F43C 7F05A90C 46065102 */ mul.s $f4, $f10, $f6
|
|
/* 08F440 7F05A910 C7A60048 */ lwc1 $f6, 0x48($sp)
|
|
/* 08F444 7F05A914 27BD0080 */ addiu $sp, $sp, 0x80
|
|
/* 08F448 7F05A918 46044280 */ add.s $f10, $f8, $f4
|
|
/* 08F44C 7F05A91C 46060202 */ mul.s $f8, $f0, $f6
|
|
/* 08F450 7F05A920 03E00008 */ jr $ra
|
|
/* 08F454 7F05A924 46085001 */ sub.s $f0, $f10, $f8
|
|
)
|
|
#endif
|
|
|
|
|
|
f32 matrix_2x2_determinant(f32 a, f32 c, f32 b, f32 d);
|
|
|
|
f32 matrix_3x3_determinant(f32 a, f32 d, f32 g, f32 b, f32 e, f32 h, f32 c, f32 f, f32 i) {
|
|
f32 determinant = (a * matrix_2x2_determinant(e, h, f, i)) - (b * matrix_2x2_determinant(d, g, f, i)) + (c * matrix_2x2_determinant(d, g, e, h));
|
|
return determinant;
|
|
}
|
|
|
|
f32 matrix_2x2_determinant(f32 a, f32 c, f32 b, f32 d) {
|
|
return (a * d) - (c * b);
|
|
} |