From 5d076112e67b6359bbac8213e1006929f658ec87 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Thu, 28 Jan 2021 23:26:37 +1000 Subject: [PATCH] Decompile guLookAtReflectF --- src/include/PR/gu.h | 5 + src/lib/lib_04320.c | 347 +++++++++++--------------------------------- 2 files changed, 87 insertions(+), 265 deletions(-) diff --git a/src/include/PR/gu.h b/src/include/PR/gu.h index 3362a25b8..f44e3a9db 100644 --- a/src/include/PR/gu.h +++ b/src/include/PR/gu.h @@ -2,6 +2,11 @@ #define _ULTRA64_GU_H_ #define GU_PI 3.1415926 + +#define FTOFIX32(x) (long)((x) * (float)0x00010000) +#define FIX32TOF(x) ((float)(x) * (1.0f / (float)0x00010000)) +#define FTOFRAC8(x) ((int) MIN(((x) * (128.0f)), 127.0f) & 0xff) + /* Functions */ void guPerspectiveF(float mf[4][4], u16 *perspNorm, float fovy, float aspect, diff --git a/src/lib/lib_04320.c b/src/lib/lib_04320.c index c2c3b3bd6..4eb7b79e8 100644 --- a/src/lib/lib_04320.c +++ b/src/lib/lib_04320.c @@ -13,272 +13,89 @@ #include "types.h" void guLookAtReflectF(float mf[4][4], LookAt *l, - float xEye, float yEye, float zEye, - float xAt, float yAt, float zAt, - float xUp, float yUp, float zUp); + float xEye, float yEye, float zEye, + float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp) +{ + float len, xLook, yLook, zLook, xRight, yRight, zRight; -GLOBAL_ASM( -glabel guLookAtReflectF -/* 4320: 27bdffb8 */ addiu $sp,$sp,-72 -/* 4324: afbf0044 */ sw $ra,0x44($sp) -/* 4328: f7be0038 */ sdc1 $f30,0x38($sp) -/* 432c: f7bc0030 */ sdc1 $f28,0x30($sp) -/* 4330: f7ba0028 */ sdc1 $f26,0x28($sp) -/* 4334: f7b80020 */ sdc1 $f24,0x20($sp) -/* 4338: f7b60018 */ sdc1 $f22,0x18($sp) -/* 433c: f7b40010 */ sdc1 $f20,0x10($sp) -/* 4340: afa60050 */ sw $a2,0x50($sp) -/* 4344: afa70054 */ sw $a3,0x54($sp) -/* 4348: afa40048 */ sw $a0,0x48($sp) -/* 434c: 0c012918 */ jal guMtxIdentF -/* 4350: afa5004c */ sw $a1,0x4c($sp) -/* 4354: c7a4005c */ lwc1 $f4,0x5c($sp) -/* 4358: c7a60050 */ lwc1 $f6,0x50($sp) -/* 435c: c7a80060 */ lwc1 $f8,0x60($sp) -/* 4360: c7aa0054 */ lwc1 $f10,0x54($sp) -/* 4364: 46062001 */ sub.s $f0,$f4,$f6 -/* 4368: c7a60058 */ lwc1 $f6,0x58($sp) -/* 436c: c7a40064 */ lwc1 $f4,0x64($sp) -/* 4370: 460a4581 */ sub.s $f22,$f8,$f10 -/* 4374: 46000202 */ mul.s $f8,$f0,$f0 -/* 4378: 46000506 */ mov.s $f20,$f0 -/* 437c: 46062601 */ sub.s $f24,$f4,$f6 -/* 4380: 4616b282 */ mul.s $f10,$f22,$f22 -/* 4384: 460a4100 */ add.s $f4,$f8,$f10 -/* 4388: 4618c182 */ mul.s $f6,$f24,$f24 -/* 438c: 0c012974 */ jal sqrtf -/* 4390: 46062300 */ add.s $f12,$f4,$f6 -/* 4394: 3c01bf80 */ lui $at,0xbf80 -/* 4398: 44814000 */ mtc1 $at,$f8 -/* 439c: c7aa006c */ lwc1 $f10,0x6c($sp) -/* 43a0: c7a60070 */ lwc1 $f6,0x70($sp) -/* 43a4: 46004083 */ div.s $f2,$f8,$f0 -/* 43a8: 4602a502 */ mul.s $f20,$f20,$f2 -/* 43ac: 00000000 */ nop -/* 43b0: 4602b582 */ mul.s $f22,$f22,$f2 -/* 43b4: 00000000 */ nop -/* 43b8: 4602c602 */ mul.s $f24,$f24,$f2 -/* 43bc: 00000000 */ nop -/* 43c0: 46185102 */ mul.s $f4,$f10,$f24 -/* 43c4: 00000000 */ nop -/* 43c8: 46163202 */ mul.s $f8,$f6,$f22 -/* 43cc: 46082681 */ sub.s $f26,$f4,$f8 -/* 43d0: 46143102 */ mul.s $f4,$f6,$f20 -/* 43d4: c7a80068 */ lwc1 $f8,0x68($sp) -/* 43d8: 46184182 */ mul.s $f6,$f8,$f24 -/* 43dc: 46062701 */ sub.s $f28,$f4,$f6 -/* 43e0: 46164102 */ mul.s $f4,$f8,$f22 -/* 43e4: 00000000 */ nop -/* 43e8: 46145182 */ mul.s $f6,$f10,$f20 -/* 43ec: 46062781 */ sub.s $f30,$f4,$f6 -/* 43f0: 461ad202 */ mul.s $f8,$f26,$f26 -/* 43f4: 00000000 */ nop -/* 43f8: 461ce282 */ mul.s $f10,$f28,$f28 -/* 43fc: 460a4100 */ add.s $f4,$f8,$f10 -/* 4400: 461ef182 */ mul.s $f6,$f30,$f30 -/* 4404: 0c012974 */ jal sqrtf -/* 4408: 46062300 */ add.s $f12,$f4,$f6 -/* 440c: 3c013f80 */ lui $at,0x3f80 -/* 4410: 44814000 */ mtc1 $at,$f8 -/* 4414: 00000000 */ nop -/* 4418: 46004083 */ div.s $f2,$f8,$f0 -/* 441c: 4602d682 */ mul.s $f26,$f26,$f2 -/* 4420: 00000000 */ nop -/* 4424: 4602e702 */ mul.s $f28,$f28,$f2 -/* 4428: 00000000 */ nop -/* 442c: 4602f782 */ mul.s $f30,$f30,$f2 -/* 4430: 00000000 */ nop -/* 4434: 461eb282 */ mul.s $f10,$f22,$f30 -/* 4438: 00000000 */ nop -/* 443c: 461cc102 */ mul.s $f4,$f24,$f28 -/* 4440: 00000000 */ nop -/* 4444: 461ac182 */ mul.s $f6,$f24,$f26 -/* 4448: 00000000 */ nop -/* 444c: 461ea202 */ mul.s $f8,$f20,$f30 -/* 4450: 46045381 */ sub.s $f14,$f10,$f4 -/* 4454: 461ca282 */ mul.s $f10,$f20,$f28 -/* 4458: 00000000 */ nop -/* 445c: 461ab102 */ mul.s $f4,$f22,$f26 -/* 4460: e7ae0068 */ swc1 $f14,0x68($sp) -/* 4464: 46083401 */ sub.s $f16,$f6,$f8 -/* 4468: 460e7182 */ mul.s $f6,$f14,$f14 -/* 446c: 00000000 */ nop -/* 4470: 46108202 */ mul.s $f8,$f16,$f16 -/* 4474: e7b0006c */ swc1 $f16,0x6c($sp) -/* 4478: 46045481 */ sub.s $f18,$f10,$f4 -/* 447c: 46129102 */ mul.s $f4,$f18,$f18 -/* 4480: 46083280 */ add.s $f10,$f6,$f8 -/* 4484: e7b20070 */ swc1 $f18,0x70($sp) -/* 4488: 0c012974 */ jal sqrtf -/* 448c: 46045300 */ add.s $f12,$f10,$f4 -/* 4490: 3c0142fe */ lui $at,0x42fe -/* 4494: 44816000 */ mtc1 $at,$f12 -/* 4498: 3c014300 */ lui $at,0x4300 -/* 449c: 44818000 */ mtc1 $at,$f16 -/* 44a0: 3c013f80 */ lui $at,0x3f80 -/* 44a4: 44813000 */ mtc1 $at,$f6 -/* 44a8: c7a80068 */ lwc1 $f8,0x68($sp) -/* 44ac: c7a4006c */ lwc1 $f4,0x6c($sp) -/* 44b0: 46003083 */ div.s $f2,$f6,$f0 -/* 44b4: 8fa40048 */ lw $a0,0x48($sp) -/* 44b8: 8fa5004c */ lw $a1,0x4c($sp) -/* 44bc: 24020080 */ addiu $v0,$zero,0x80 -/* 44c0: 46024282 */ mul.s $f10,$f8,$f2 -/* 44c4: c7a80070 */ lwc1 $f8,0x70($sp) -/* 44c8: 46022182 */ mul.s $f6,$f4,$f2 -/* 44cc: e7aa0068 */ swc1 $f10,0x68($sp) -/* 44d0: 46024282 */ mul.s $f10,$f8,$f2 -/* 44d4: e7a6006c */ swc1 $f6,0x6c($sp) -/* 44d8: 4610d382 */ mul.s $f14,$f26,$f16 -/* 44dc: e7aa0070 */ swc1 $f10,0x70($sp) -/* 44e0: 4610e082 */ mul.s $f2,$f28,$f16 -/* 44e4: 460c703c */ c.lt.s $f14,$f12 -/* 44e8: 00000000 */ nop -/* 44ec: 45020004 */ bc1fl .L00004500 -/* 44f0: 46006006 */ mov.s $f0,$f12 -/* 44f4: 10000002 */ b .L00004500 -/* 44f8: 46007006 */ mov.s $f0,$f14 -/* 44fc: 46006006 */ mov.s $f0,$f12 -.L00004500: -/* 4500: 4600010d */ trunc.w.s $f4,$f0 -/* 4504: 460c103c */ c.lt.s $f2,$f12 -/* 4508: 44182000 */ mfc1 $t8,$f4 -/* 450c: 45000003 */ bc1f .L0000451c -/* 4510: a0b80008 */ sb $t8,0x8($a1) -/* 4514: 10000002 */ b .L00004520 -/* 4518: 46001006 */ mov.s $f0,$f2 -.L0000451c: -/* 451c: 46006006 */ mov.s $f0,$f12 -.L00004520: -/* 4520: 4610f082 */ mul.s $f2,$f30,$f16 -/* 4524: 4600018d */ trunc.w.s $f6,$f0 -/* 4528: 460c103c */ c.lt.s $f2,$f12 -/* 452c: 44093000 */ mfc1 $t1,$f6 -/* 4530: 45000003 */ bc1f .L00004540 -/* 4534: a0a90009 */ sb $t1,0x9($a1) -/* 4538: 10000002 */ b .L00004544 -/* 453c: 46001006 */ mov.s $f0,$f2 -.L00004540: -/* 4540: 46006006 */ mov.s $f0,$f12 -.L00004544: -/* 4544: 4600020d */ trunc.w.s $f8,$f0 -/* 4548: 440c4000 */ mfc1 $t4,$f8 -/* 454c: 00000000 */ nop -/* 4550: a0ac000a */ sb $t4,0xa($a1) -/* 4554: c7aa0068 */ lwc1 $f10,0x68($sp) -/* 4558: 46105082 */ mul.s $f2,$f10,$f16 -/* 455c: 460c103c */ c.lt.s $f2,$f12 -/* 4560: 00000000 */ nop -/* 4564: 45020004 */ bc1fl .L00004578 -/* 4568: 46006006 */ mov.s $f0,$f12 -/* 456c: 10000002 */ b .L00004578 -/* 4570: 46001006 */ mov.s $f0,$f2 -/* 4574: 46006006 */ mov.s $f0,$f12 -.L00004578: -/* 4578: 4600010d */ trunc.w.s $f4,$f0 -/* 457c: 440f2000 */ mfc1 $t7,$f4 -/* 4580: 00000000 */ nop -/* 4584: a0af0018 */ sb $t7,0x18($a1) -/* 4588: c7a6006c */ lwc1 $f6,0x6c($sp) -/* 458c: 46103082 */ mul.s $f2,$f6,$f16 -/* 4590: 460c103c */ c.lt.s $f2,$f12 -/* 4594: 00000000 */ nop -/* 4598: 45020004 */ bc1fl .L000045ac -/* 459c: 46006006 */ mov.s $f0,$f12 -/* 45a0: 10000002 */ b .L000045ac -/* 45a4: 46001006 */ mov.s $f0,$f2 -/* 45a8: 46006006 */ mov.s $f0,$f12 -.L000045ac: -/* 45ac: 4600020d */ trunc.w.s $f8,$f0 -/* 45b0: 44084000 */ mfc1 $t0,$f8 -/* 45b4: 00000000 */ nop -/* 45b8: a0a80019 */ sb $t0,0x19($a1) -/* 45bc: c7aa0070 */ lwc1 $f10,0x70($sp) -/* 45c0: 46105082 */ mul.s $f2,$f10,$f16 -/* 45c4: 460c103c */ c.lt.s $f2,$f12 -/* 45c8: 00000000 */ nop -/* 45cc: 45020004 */ bc1fl .L000045e0 -/* 45d0: 46006006 */ mov.s $f0,$f12 -/* 45d4: 10000002 */ b .L000045e0 -/* 45d8: 46001006 */ mov.s $f0,$f2 -/* 45dc: 46006006 */ mov.s $f0,$f12 -.L000045e0: -/* 45e0: 4600010d */ trunc.w.s $f4,$f0 -/* 45e4: a0a00000 */ sb $zero,0x0($a1) -/* 45e8: a0a00001 */ sb $zero,0x1($a1) -/* 45ec: a0a00002 */ sb $zero,0x2($a1) -/* 45f0: 440b2000 */ mfc1 $t3,$f4 -/* 45f4: a0a00003 */ sb $zero,0x3($a1) -/* 45f8: a0a00004 */ sb $zero,0x4($a1) -/* 45fc: a0a00005 */ sb $zero,0x5($a1) -/* 4600: a0a00006 */ sb $zero,0x6($a1) -/* 4604: a0a00007 */ sb $zero,0x7($a1) -/* 4608: a0a00010 */ sb $zero,0x10($a1) -/* 460c: a0a20011 */ sb $v0,0x11($a1) -/* 4610: a0a00012 */ sb $zero,0x12($a1) -/* 4614: a0a00013 */ sb $zero,0x13($a1) -/* 4618: a0a00014 */ sb $zero,0x14($a1) -/* 461c: a0a20015 */ sb $v0,0x15($a1) -/* 4620: a0a00016 */ sb $zero,0x16($a1) -/* 4624: a0a00017 */ sb $zero,0x17($a1) -/* 4628: a0ab001a */ sb $t3,0x1a($a1) -/* 462c: e49a0000 */ swc1 $f26,0x0($a0) -/* 4630: c7b20050 */ lwc1 $f18,0x50($sp) -/* 4634: c7b00054 */ lwc1 $f16,0x54($sp) -/* 4638: c7ae0058 */ lwc1 $f14,0x58($sp) -/* 463c: 461a9182 */ mul.s $f6,$f18,$f26 -/* 4640: c7a00068 */ lwc1 $f0,0x68($sp) -/* 4644: c7ac006c */ lwc1 $f12,0x6c($sp) -/* 4648: 461c8202 */ mul.s $f8,$f16,$f28 -/* 464c: c7a20070 */ lwc1 $f2,0x70($sp) -/* 4650: e49c0010 */ swc1 $f28,0x10($a0) -/* 4654: 461e7102 */ mul.s $f4,$f14,$f30 -/* 4658: e49e0020 */ swc1 $f30,0x20($a0) -/* 465c: e4940008 */ swc1 $f20,0x8($a0) -/* 4660: e4960018 */ swc1 $f22,0x18($a0) -/* 4664: e4980028 */ swc1 $f24,0x28($a0) -/* 4668: 46083280 */ add.s $f10,$f6,$f8 -/* 466c: e4800004 */ swc1 $f0,0x4($a0) -/* 4670: e48c0014 */ swc1 $f12,0x14($a0) -/* 4674: e4820024 */ swc1 $f2,0x24($a0) -/* 4678: 46045180 */ add.s $f6,$f10,$f4 -/* 467c: 46009282 */ mul.s $f10,$f18,$f0 -/* 4680: 44800000 */ mtc1 $zero,$f0 -/* 4684: 3c013f80 */ lui $at,0x3f80 -/* 4688: 460c8102 */ mul.s $f4,$f16,$f12 -/* 468c: 46003207 */ neg.s $f8,$f6 -/* 4690: e4880030 */ swc1 $f8,0x30($a0) -/* 4694: 46027202 */ mul.s $f8,$f14,$f2 -/* 4698: 46045180 */ add.s $f6,$f10,$f4 -/* 469c: 46083280 */ add.s $f10,$f6,$f8 -/* 46a0: 46005107 */ neg.s $f4,$f10 -/* 46a4: e4840034 */ swc1 $f4,0x34($a0) -/* 46a8: c7a60050 */ lwc1 $f6,0x50($sp) -/* 46ac: c7aa0054 */ lwc1 $f10,0x54($sp) -/* 46b0: 46143202 */ mul.s $f8,$f6,$f20 -/* 46b4: 00000000 */ nop -/* 46b8: 46165102 */ mul.s $f4,$f10,$f22 -/* 46bc: c7aa0058 */ lwc1 $f10,0x58($sp) -/* 46c0: e480000c */ swc1 $f0,0xc($a0) -/* 46c4: e480001c */ swc1 $f0,0x1c($a0) -/* 46c8: e480002c */ swc1 $f0,0x2c($a0) -/* 46cc: 46044180 */ add.s $f6,$f8,$f4 -/* 46d0: 46185202 */ mul.s $f8,$f10,$f24 -/* 46d4: 46083100 */ add.s $f4,$f6,$f8 -/* 46d8: 44813000 */ mtc1 $at,$f6 -/* 46dc: 46002287 */ neg.s $f10,$f4 -/* 46e0: e486003c */ swc1 $f6,0x3c($a0) -/* 46e4: e48a0038 */ swc1 $f10,0x38($a0) -/* 46e8: 8fbf0044 */ lw $ra,0x44($sp) -/* 46ec: d7be0038 */ ldc1 $f30,0x38($sp) -/* 46f0: d7bc0030 */ ldc1 $f28,0x30($sp) -/* 46f4: d7ba0028 */ ldc1 $f26,0x28($sp) -/* 46f8: d7b80020 */ ldc1 $f24,0x20($sp) -/* 46fc: d7b60018 */ ldc1 $f22,0x18($sp) -/* 4700: d7b40010 */ ldc1 $f20,0x10($sp) -/* 4704: 03e00008 */ jr $ra -/* 4708: 27bd0048 */ addiu $sp,$sp,0x48 -); + guMtxIdentF(mf); + + xLook = xAt - xEye; + yLook = yAt - yEye; + zLook = zAt - zEye; + + /* Negate because positive Z is behind us: */ + len = -1.0f / sqrtf (xLook*xLook + yLook*yLook + zLook*zLook); + xLook *= len; + yLook *= len; + zLook *= len; + + /* Right = Up x Look */ + + xRight = yUp * zLook - zUp * yLook; + yRight = zUp * xLook - xUp * zLook; + zRight = xUp * yLook - yUp * xLook; + len = 1.0f / sqrtf (xRight*xRight + yRight*yRight + zRight*zRight); + xRight *= len; + yRight *= len; + zRight *= len; + + /* Up = Look x Right */ + + xUp = yLook * zRight - zLook * yRight; + yUp = zLook * xRight - xLook * zRight; + zUp = xLook * yRight - yLook * xRight; + len = 1.0f / sqrtf (xUp*xUp + yUp*yUp + zUp*zUp); + xUp *= len; + yUp *= len; + zUp *= len; + + /* reflectance vectors = Up and Right */ + + l->l[0].l.dir[0] = FTOFRAC8(xRight); + l->l[0].l.dir[1] = FTOFRAC8(yRight); + l->l[0].l.dir[2] = FTOFRAC8(zRight); + l->l[1].l.dir[0] = FTOFRAC8(xUp); + l->l[1].l.dir[1] = FTOFRAC8(yUp); + l->l[1].l.dir[2] = FTOFRAC8(zUp); + l->l[0].l.col[0] = 0x00; + l->l[0].l.col[1] = 0x00; + l->l[0].l.col[2] = 0x00; + l->l[0].l.pad1 = 0x00; + l->l[0].l.colc[0] = 0x00; + l->l[0].l.colc[1] = 0x00; + l->l[0].l.colc[2] = 0x00; + l->l[0].l.pad2 = 0x00; + l->l[1].l.col[0] = 0x00; + l->l[1].l.col[1] = 0x80; + l->l[1].l.col[2] = 0x00; + l->l[1].l.pad1 = 0x00; + l->l[1].l.colc[0] = 0x00; + l->l[1].l.colc[1] = 0x80; + l->l[1].l.colc[2] = 0x00; + l->l[1].l.pad2 = 0x00; + + mf[0][0] = xRight; + mf[1][0] = yRight; + mf[2][0] = zRight; + mf[3][0] = -(xEye * xRight + yEye * yRight + zEye * zRight); + + mf[0][1] = xUp; + mf[1][1] = yUp; + mf[2][1] = zUp; + mf[3][1] = -(xEye * xUp + yEye * yUp + zEye * zUp); + + mf[0][2] = xLook; + mf[1][2] = yLook; + mf[2][2] = zLook; + mf[3][2] = -(xEye * xLook + yEye * yLook + zEye * zLook); + + mf[0][3] = 0; + mf[1][3] = 0; + mf[2][3] = 0; + mf[3][3] = 1; +} void guLookAtReflect(Mtx *m, LookAt *l, float xEye, float yEye, float zEye, float xAt, float yAt, float zAt,