diff --git a/src/game/bondbike.c b/src/game/bondbike.c index 9d141c6c4..194d4780e 100644 --- a/src/game/bondbike.c +++ b/src/game/bondbike.c @@ -1698,7 +1698,7 @@ void bbikeTick(void) mtx4LoadYRotation(hoverpropGetTurnAngle(obj), &spe4); func0f097044(&spe4, spd4); func0f097044(&sp124, spc4); - func0f0976c0(spc4, spd4); + quaternion0f0976c0(spc4, spd4); func0f0972b8(spd4, spc4, 0.8f, spb4); quaternionToMtx(spb4, &sp124); mtx4MultMtx4InPlace(&sp124, &sp164); @@ -1729,7 +1729,7 @@ void bbikeTick(void) func0f097044(&g_Vars.currentplayer->bondentermtx, spa4); func0f097044(&sp164, sp94); - func0f0976c0(sp94, spa4); + quaternion0f0976c0(sp94, spa4); func0f0972b8(spa4, sp94, 1.0f - g_Vars.currentplayer->bondentert2, sp84); quaternionToMtx(sp84, &sp164); } diff --git a/src/game/bondgun.c b/src/game/bondgun.c index ab993b53b..01914fc4d 100644 --- a/src/game/bondgun.c +++ b/src/game/bondgun.c @@ -11361,7 +11361,7 @@ glabel var7f1ac72c /* f09f4ac: 0fc25c11 */ jal func0f097044 /* f09f4b0: 27a50058 */ addiu $a1,$sp,0x58 /* f09f4b4: 27a40068 */ addiu $a0,$sp,0x68 -/* f09f4b8: 0fc25db0 */ jal func0f0976c0 +/* f09f4b8: 0fc25db0 */ jal quaternion0f0976c0 /* f09f4bc: 27a50058 */ addiu $a1,$sp,0x58 /* f09f4c0: 3c017f1b */ lui $at,%hi(var7f1ac720) /* f09f4c4: c430c71c */ lwc1 $f16,%lo(var7f1ac71c)($at) @@ -11877,7 +11877,7 @@ glabel var7f1ac72c /* f09f4ac: 0fc25c11 */ jal func0f097044 /* f09f4b0: 27a50058 */ addiu $a1,$sp,0x58 /* f09f4b4: 27a40068 */ addiu $a0,$sp,0x68 -/* f09f4b8: 0fc25db0 */ jal func0f0976c0 +/* f09f4b8: 0fc25db0 */ jal quaternion0f0976c0 /* f09f4bc: 27a50058 */ addiu $a1,$sp,0x58 /* f09f4c0: 3c017f1b */ lui $at,%hi(var7f1ac720) /* f09f4c4: c430c71c */ lwc1 $f16,%lo(var7f1ac71c)($at) @@ -12403,7 +12403,7 @@ glabel var7f1ac740 /* f0a006c: 0fc25bd9 */ jal func0f097044 /* f0a0070: 27a40134 */ addiu $a0,$sp,0x134 /* f0a0074: 27a400e4 */ addiu $a0,$sp,0xe4 -/* f0a0078: 0fc25d78 */ jal func0f0976c0 +/* f0a0078: 0fc25d78 */ jal quaternion0f0976c0 /* f0a007c: 02002825 */ move $a1,$s0 /* f0a0080: 3c017f1b */ lui $at,0x7f1b /* f0a0084: c432d93c */ lwc1 $f18,-0x26c4($at) @@ -13038,7 +13038,7 @@ glabel var7f1ac740 /* f09fd68: 0fc25c11 */ jal func0f097044 /* f09fd6c: 27a40134 */ addiu $a0,$sp,0x134 /* f09fd70: 27a400e4 */ addiu $a0,$sp,0xe4 -/* f09fd74: 0fc25db0 */ jal func0f0976c0 +/* f09fd74: 0fc25db0 */ jal quaternion0f0976c0 /* f09fd78: 02002825 */ or $a1,$s0,$zero /* f09fd7c: 3c017f1b */ lui $at,%hi(var7f1ac73c) /* f09fd80: c432c73c */ lwc1 $f18,%lo(var7f1ac73c)($at) @@ -13664,7 +13664,7 @@ glabel var7f1ac740 /* f09dbdc: 0fc253f5 */ jal func0f097044 /* f09dbe0: 27a40134 */ addiu $a0,$sp,0x134 /* f09dbe4: 27a400e4 */ addiu $a0,$sp,0xe4 -/* f09dbe8: 0fc25594 */ jal func0f0976c0 +/* f09dbe8: 0fc25594 */ jal quaternion0f0976c0 /* f09dbec: 02002825 */ or $a1,$s0,$zero /* f09dbf0: 3c017f1a */ lui $at,0x7f1a /* f09dbf4: c4326a84 */ lwc1 $f18,0x6a84($at) diff --git a/src/game/bondmove.c b/src/game/bondmove.c index 52d461cff..176728812 100644 --- a/src/game/bondmove.c +++ b/src/game/bondmove.c @@ -2106,7 +2106,7 @@ void bmoveUpdateHead(f32 arg0, f32 arg1, f32 arg2, Mtxf *arg3, f32 arg4) if (arg3) { func0f097044(&sp180, sp100); func0f097044(arg3, sp84); - func0f0976c0(sp100, sp84); + quaternion0f0976c0(sp100, sp84); func0f0972b8(sp100, sp84, arg4, sp68); quaternionToMtx(sp68, &sp180); } diff --git a/src/game/game_096ca0.c b/src/game/game_096ca0.c index cd46d9e71..c942d53e2 100644 --- a/src/game/game_096ca0.c +++ b/src/game/game_096ca0.c @@ -528,40 +528,17 @@ glabel func0f097518 /* f0976bc: 00000000 */ nop ); -GLOBAL_ASM( -glabel func0f0976c0 -/* f0976c0: c4ac0000 */ lwc1 $f12,0x0($a1) -/* f0976c4: c4840000 */ lwc1 $f4,0x0($a0) -/* f0976c8: c4ae0004 */ lwc1 $f14,0x4($a1) -/* f0976cc: c4880004 */ lwc1 $f8,0x4($a0) -/* f0976d0: 460c2182 */ mul.s $f6,$f4,$f12 -/* f0976d4: c4840008 */ lwc1 $f4,0x8($a0) -/* f0976d8: c4b00008 */ lwc1 $f16,0x8($a1) -/* f0976dc: 460e4282 */ mul.s $f10,$f8,$f14 -/* f0976e0: c4a2000c */ lwc1 $f2,0xc($a1) -/* f0976e4: 46102202 */ mul.s $f8,$f4,$f16 -/* f0976e8: 460a3480 */ add.s $f18,$f6,$f10 -/* f0976ec: c48a000c */ lwc1 $f10,0xc($a0) -/* f0976f0: 460a1102 */ mul.s $f4,$f2,$f10 -/* f0976f4: 46089180 */ add.s $f6,$f18,$f8 -/* f0976f8: 44809000 */ mtc1 $zero,$f18 -/* f0976fc: 46062000 */ add.s $f0,$f4,$f6 -/* f097700: 4612003c */ c.lt.s $f0,$f18 -/* f097704: 00000000 */ nop -/* f097708: 45000009 */ bc1f .L0f097730 -/* f09770c: 00000000 */ nop -/* f097710: 46006207 */ neg.s $f8,$f12 -/* f097714: 46007287 */ neg.s $f10,$f14 -/* f097718: 46008107 */ neg.s $f4,$f16 -/* f09771c: 46001187 */ neg.s $f6,$f2 -/* f097720: e4a80000 */ swc1 $f8,0x0($a1) -/* f097724: e4aa0004 */ swc1 $f10,0x4($a1) -/* f097728: e4a40008 */ swc1 $f4,0x8($a1) -/* f09772c: e4a6000c */ swc1 $f6,0xc($a1) -.L0f097730: -/* f097730: 03e00008 */ jr $ra -/* f097734: 00000000 */ nop -); +void quaternion0f0976c0(f32 q1[4], f32 q2[4]) +{ + f32 dot = q1[0] * q2[0] + q1[1] * q2[1] + q1[2] * q2[2] + q1[3] * q2[3]; + + if (dot < 0.0f) { + q2[0] = -q2[0]; + q2[1] = -q2[1]; + q2[2] = -q2[2]; + q2[3] = -q2[3]; + } +} GLOBAL_ASM( glabel func0f097738 diff --git a/src/game/player.c b/src/game/player.c index eab0f6710..81a11afde 100644 --- a/src/game/player.c +++ b/src/game/player.c @@ -2209,7 +2209,7 @@ void playerTickCutscene(bool arg0) g_Vars.bond->bond2.unk28.x, g_Vars.bond->bond2.unk28.y, g_Vars.bond->bond2.unk28.z); func0f097044(&spc4, sp74); func0f097044(&sp84, sp64); - func0f0976c0(sp64, sp74); + quaternion0f0976c0(sp64, sp74); func0f0972b8(sp74, sp64, sp104, sp54); quaternionToMtx(sp54, &sp11c); diff --git a/src/game/propobj.c b/src/game/propobj.c index 752003304..4c547648f 100644 --- a/src/game/propobj.c +++ b/src/game/propobj.c @@ -11394,7 +11394,7 @@ glabel var7f1aa298 /* f06e654: 0fc25b28 */ jal quaternion0f096ca0 /* f06e658: afa50024 */ sw $a1,0x24($sp) /* f06e65c: 8fa50024 */ lw $a1,0x24($sp) -/* f06e660: 0fc25db0 */ jal func0f0976c0 +/* f06e660: 0fc25db0 */ jal quaternion0f0976c0 /* f06e664: 8fa40038 */ lw $a0,0x38($sp) /* f06e668: 44809000 */ mtc1 $zero,$f18 /* f06e66c: 8faf0068 */ lw $t7,0x68($sp) diff --git a/src/include/game/game_096ca0.h b/src/include/game/game_096ca0.h index 56eecde53..a4ecfbb1a 100644 --- a/src/include/game/game_096ca0.h +++ b/src/include/game/game_096ca0.h @@ -10,7 +10,7 @@ void func0f097044(Mtxf *matrix, f32 arg1[4]); void quaternionToTransformMtx(struct coord *pos, f32 rot[4], Mtxf *matrix); void func0f0972b8(f32 arg0[4], f32 arg1[4], f32 arg2, f32 *arg3); u32 func0f097518(void); -void func0f0976c0(f32 arg0[4], f32 arg1[4]); +void quaternion0f0976c0(f32 q1[4], f32 q2[4]); void func0f097738(f32 *arg0, f32 *arg1, f32 *arg2); #endif diff --git a/src/lib/model.c b/src/lib/model.c index c5357497c..00a722278 100644 --- a/src/lib/model.c +++ b/src/lib/model.c @@ -734,7 +734,7 @@ void model0001b400(struct modelrenderdata *arg0, struct model *model, struct mod } quaternion0f096ca0(&sp230, spfc); - func0f0976c0(spfc, spec); + quaternion0f0976c0(spfc, spec); func0f0972b8(spfc, spec, anim->fracmerge, &spdc); quaternionToMtx(&spdc, &sp1d8); } else { @@ -1511,7 +1511,7 @@ glabel var70053fc0pf /* 1bfdc: 0fc25af0 */ jal quaternion0f096ca0 /* 1bfe0: 27a50078 */ addiu $a1,$sp,0x78 /* 1bfe4: 27a40088 */ addiu $a0,$sp,0x88 -/* 1bfe8: 0fc25d78 */ jal func0f0976c0 +/* 1bfe8: 0fc25d78 */ jal quaternion0f0976c0 /* 1bfec: 27a50078 */ addiu $a1,$sp,0x78 /* 1bff0: 27a70068 */ addiu $a3,$sp,0x68 /* 1bff4: 27a40088 */ addiu $a0,$sp,0x88 @@ -1926,7 +1926,7 @@ glabel model0001bfa8 /* 1c220: 0fc25b28 */ jal quaternion0f096ca0 /* 1c224: 27a50078 */ addiu $a1,$sp,0x78 /* 1c228: 27a40088 */ addiu $a0,$sp,0x88 -/* 1c22c: 0fc25db0 */ jal func0f0976c0 +/* 1c22c: 0fc25db0 */ jal quaternion0f0976c0 /* 1c230: 27a50078 */ addiu $a1,$sp,0x78 /* 1c234: 27a70068 */ addiu $a3,$sp,0x68 /* 1c238: 27a40088 */ addiu $a0,$sp,0x88