From 34197b1907173474d34ff26dea14edabfd987685 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Mon, 21 Feb 2022 18:53:46 +1000 Subject: [PATCH] Decompile quaternion0f097518 --- src/game/game_096ca0.c | 159 +++++++++------------------------ src/include/game/game_096ca0.h | 2 +- src/lib/model.c | 4 +- 3 files changed, 43 insertions(+), 122 deletions(-) diff --git a/src/game/game_096ca0.c b/src/game/game_096ca0.c index 958ec5b49..ae9501fe2 100644 --- a/src/game/game_096ca0.c +++ b/src/game/game_096ca0.c @@ -178,125 +178,46 @@ void quaternionSlerp(f32 q1[4], f32 q2[4], f32 t, f32 result[4]) } } -GLOBAL_ASM( -glabel func0f097518 -.late_rodata -glabel var7f1ab87c -.word 0xbf7fff58 -glabel var7f1ab880 -.word 0x3f7fff58 -.text -/* f097518: 27bdffc8 */ addiu $sp,$sp,-56 -/* f09751c: afbf0014 */ sw $ra,0x14($sp) -/* f097520: c4800000 */ lwc1 $f0,0x0($a0) -/* f097524: 44802000 */ mtc1 $zero,$f4 -/* f097528: 3c013f80 */ lui $at,0x3f80 -/* f09752c: 44811000 */ mtc1 $at,$f2 -/* f097530: 4604003c */ c.lt.s $f0,$f4 -/* f097534: 44857000 */ mtc1 $a1,$f14 -/* f097538: 3c017f1b */ lui $at,%hi(var7f1ab87c) -/* f09753c: 46000306 */ mov.s $f12,$f0 -/* f097540: 45000003 */ bc1f .L0f097550 -/* f097544: 46001406 */ mov.s $f16,$f2 -/* f097548: 46006307 */ neg.s $f12,$f12 -/* f09754c: 46001407 */ neg.s $f16,$f2 -.L0f097550: -/* f097550: c426b87c */ lwc1 $f6,%lo(var7f1ab87c)($at) -/* f097554: 3c017f1b */ lui $at,%hi(var7f1ab880) -/* f097558: 4606603c */ c.lt.s $f12,$f6 -/* f09755c: 00000000 */ nop -/* f097560: 45000011 */ bc1f .L0f0975a8 -/* f097564: 00000000 */ nop -/* f097568: 460e1281 */ sub.s $f10,$f2,$f14 -/* f09756c: 460e0202 */ mul.s $f8,$f0,$f14 -/* f097570: 00000000 */ nop -/* f097574: 46105482 */ mul.s $f18,$f10,$f16 -/* f097578: 46124101 */ sub.s $f4,$f8,$f18 -/* f09757c: e4c40000 */ swc1 $f4,0x0($a2) -/* f097580: c4860004 */ lwc1 $f6,0x4($a0) -/* f097584: 460e3282 */ mul.s $f10,$f6,$f14 -/* f097588: e4ca0004 */ swc1 $f10,0x4($a2) -/* f09758c: c4880008 */ lwc1 $f8,0x8($a0) -/* f097590: 460e4482 */ mul.s $f18,$f8,$f14 -/* f097594: e4d20008 */ swc1 $f18,0x8($a2) -/* f097598: c484000c */ lwc1 $f4,0xc($a0) -/* f09759c: 460e2182 */ mul.s $f6,$f4,$f14 -/* f0975a0: 10000043 */ b .L0f0976b0 -/* f0975a4: e4c6000c */ swc1 $f6,0xc($a2) -.L0f0975a8: -/* f0975a8: c42ab880 */ lwc1 $f10,%lo(var7f1ab880)($at) -/* f0975ac: 460a603e */ c.le.s $f12,$f10 -/* f0975b0: 00000000 */ nop -/* f0975b4: 45020030 */ bc1fl .L0f097678 -/* f0975b8: 460e1201 */ sub.s $f8,$f2,$f14 -/* f0975bc: afa40038 */ sw $a0,0x38($sp) -/* f0975c0: afa60040 */ sw $a2,0x40($sp) -/* f0975c4: e7ae003c */ swc1 $f14,0x3c($sp) -/* f0975c8: 0fc25a74 */ jal acosf -/* f0975cc: e7b00030 */ swc1 $f16,0x30($sp) -/* f0975d0: 3c013f80 */ lui $at,0x3f80 -/* f0975d4: 44811000 */ mtc1 $at,$f2 -/* f0975d8: c7ae003c */ lwc1 $f14,0x3c($sp) -/* f0975dc: 46000306 */ mov.s $f12,$f0 -/* f0975e0: 460e1481 */ sub.s $f18,$f2,$f14 -/* f0975e4: 46007202 */ mul.s $f8,$f14,$f0 -/* f0975e8: 00000000 */ nop -/* f0975ec: 46009102 */ mul.s $f4,$f18,$f0 -/* f0975f0: e7a80028 */ swc1 $f8,0x28($sp) -/* f0975f4: 0c0068f7 */ jal sinf -/* f0975f8: e7a40024 */ swc1 $f4,0x24($sp) -/* f0975fc: e7a00020 */ swc1 $f0,0x20($sp) -/* f097600: 0c0068f7 */ jal sinf -/* f097604: c7ac0028 */ lwc1 $f12,0x28($sp) -/* f097608: c7a60020 */ lwc1 $f6,0x20($sp) -/* f09760c: c7ac0024 */ lwc1 $f12,0x24($sp) -/* f097610: 46060083 */ div.s $f2,$f0,$f6 -/* f097614: 0c0068f7 */ jal sinf -/* f097618: e7a2001c */ swc1 $f2,0x1c($sp) -/* f09761c: c7b20020 */ lwc1 $f18,0x20($sp) -/* f097620: 8fa40038 */ lw $a0,0x38($sp) -/* f097624: c7a2001c */ lwc1 $f2,0x1c($sp) -/* f097628: 46120103 */ div.s $f4,$f0,$f18 -/* f09762c: c48a0000 */ lwc1 $f10,0x0($a0) -/* f097630: c7b00030 */ lwc1 $f16,0x30($sp) -/* f097634: 8fa60040 */ lw $a2,0x40($sp) -/* f097638: 46025202 */ mul.s $f8,$f10,$f2 -/* f09763c: 00000000 */ nop -/* f097640: 46102182 */ mul.s $f6,$f4,$f16 -/* f097644: 46064280 */ add.s $f10,$f8,$f6 -/* f097648: e4ca0000 */ swc1 $f10,0x0($a2) -/* f09764c: c4920004 */ lwc1 $f18,0x4($a0) -/* f097650: 46029102 */ mul.s $f4,$f18,$f2 -/* f097654: e4c40004 */ swc1 $f4,0x4($a2) -/* f097658: c4880008 */ lwc1 $f8,0x8($a0) -/* f09765c: 46024182 */ mul.s $f6,$f8,$f2 -/* f097660: e4c60008 */ swc1 $f6,0x8($a2) -/* f097664: c48a000c */ lwc1 $f10,0xc($a0) -/* f097668: 46025482 */ mul.s $f18,$f10,$f2 -/* f09766c: 10000010 */ b .L0f0976b0 -/* f097670: e4d2000c */ swc1 $f18,0xc($a2) -/* f097674: 460e1201 */ sub.s $f8,$f2,$f14 -.L0f097678: -/* f097678: 460e0102 */ mul.s $f4,$f0,$f14 -/* f09767c: 00000000 */ nop -/* f097680: 46104182 */ mul.s $f6,$f8,$f16 -/* f097684: 46062280 */ add.s $f10,$f4,$f6 -/* f097688: e4ca0000 */ swc1 $f10,0x0($a2) -/* f09768c: c4920004 */ lwc1 $f18,0x4($a0) -/* f097690: 460e9202 */ mul.s $f8,$f18,$f14 -/* f097694: e4c80004 */ swc1 $f8,0x4($a2) -/* f097698: c4840008 */ lwc1 $f4,0x8($a0) -/* f09769c: 460e2182 */ mul.s $f6,$f4,$f14 -/* f0976a0: e4c60008 */ swc1 $f6,0x8($a2) -/* f0976a4: c48a000c */ lwc1 $f10,0xc($a0) -/* f0976a8: 460e5482 */ mul.s $f18,$f10,$f14 -/* f0976ac: e4d2000c */ swc1 $f18,0xc($a2) -.L0f0976b0: -/* f0976b0: 8fbf0014 */ lw $ra,0x14($sp) -/* f0976b4: 27bd0038 */ addiu $sp,$sp,0x38 -/* f0976b8: 03e00008 */ jr $ra -/* f0976bc: 00000000 */ nop -); +void quaternion0f097518(f32 q[4], f32 t, f32 result[4]) +{ + f32 sp34 = q[0]; + f32 sp30 = 1.0f; + f32 sp2c; + f32 sp28; + f32 sp24; + f32 sp20; + f32 sp1c; + f32 sp18; + + if (q[0] < 0.0f) { + sp34 = -sp34; + sp30 = -sp30; + } + + if (sp34 < -0.99998999f) { + result[0] = q[0] * t - (1.0f - t) * sp30; + result[1] = q[1] * t; + result[2] = q[2] * t; + result[3] = q[3] * t; + } else if (sp34 <= 0.99998999f) { + sp2c = acosf(sp34); + sp28 = t * sp2c; + sp24 = (1.0f - t) * sp2c; + sp20 = sinf(sp2c); + sp1c = sinf(sp28) / sp20; + sp18 = sinf(sp24) / sp20; + + result[0] = q[0] * sp1c + sp18 * sp30; + result[1] = q[1] * sp1c; + result[2] = q[2] * sp1c; + result[3] = q[3] * sp1c; + } else { + result[0] = q[0] * t + (1.0f - t) * sp30; + result[1] = q[1] * t; + result[2] = q[2] * t; + result[3] = q[3] * t; + } +} void quaternion0f0976c0(f32 q1[4], f32 q2[4]) { diff --git a/src/include/game/game_096ca0.h b/src/include/game/game_096ca0.h index c467e76e2..3377f216f 100644 --- a/src/include/game/game_096ca0.h +++ b/src/include/game/game_096ca0.h @@ -9,7 +9,7 @@ void quaternionToMtx(f32 *arg0, Mtxf *arg1); void quaternion0f097044(Mtxf *matrix, f32 arg1[4]); void quaternionToTransformMtx(struct coord *pos, f32 rot[4], Mtxf *matrix); void quaternionSlerp(f32 q1[4], f32 q2[4], f32 t, f32 result[4]); -u32 func0f097518(void); +void quaternion0f097518(f32 q[4], f32 t, f32 result[4]); void quaternion0f0976c0(f32 q1[4], f32 q2[4]); void quaternionMultQuaternion(f32 a[4], f32 b[4], f32 result[4]); diff --git a/src/lib/model.c b/src/lib/model.c index 6e11696dc..ced9ffa1e 100644 --- a/src/lib/model.c +++ b/src/lib/model.c @@ -945,7 +945,7 @@ glabel var70054308 /* 1ba68: 27a5003c */ addiu $a1,$sp,0x3c /* 1ba6c: 27a4003c */ addiu $a0,$sp,0x3c /* 1ba70: 3c053f00 */ lui $a1,0x3f00 -/* 1ba74: 0fc25d46 */ jal func0f097518 +/* 1ba74: 0fc25d46 */ jal quaternion0f097518 /* 1ba78: 27a6002c */ addiu $a2,$sp,0x2c /* 1ba7c: 8fac00ac */ lw $t4,0xac($sp) /* 1ba80: 8fb80060 */ lw $t8,0x60($sp) @@ -1210,7 +1210,7 @@ glabel var70054320 /* 1bdf4: 33190100 */ andi $t9,$t8,0x100 /* 1bdf8: 53200019 */ beqzl $t9,.L0001be60 /* 1bdfc: 8faf00a4 */ lw $t7,0xa4($sp) -/* 1be00: 0fc25d46 */ jal func0f097518 +/* 1be00: 0fc25d46 */ jal quaternion0f097518 /* 1be04: 27a6002c */ addiu $a2,$sp,0x2c /* 1be08: 8fa9009c */ lw $t1,0x9c($sp) /* 1be0c: 8fac0050 */ lw $t4,0x50($sp)