Add CScriptVisorFlare and CVisorFlare

Former-commit-id: 2999309f13
This commit is contained in:
Henrique Gemignani Passos Lima 2022-10-23 16:44:06 +03:00
parent 057b66a82f
commit 22aca437ce
12 changed files with 471 additions and 43 deletions

View File

@ -35,8 +35,8 @@ lbl_805A7F64:
.section .text, "ax" .section .text, "ax"
.global sub_802075fc .global ResetTevSwapMode__11CVisorFlareCFRC13CStateManager
sub_802075fc: ResetTevSwapMode__11CVisorFlareCFRC13CStateManager:
/* 802075FC 0020455C 94 21 FF F0 */ stwu r1, -0x10(r1) /* 802075FC 0020455C 94 21 FF F0 */ stwu r1, -0x10(r1)
/* 80207600 00204560 7C 08 02 A6 */ mflr r0 /* 80207600 00204560 7C 08 02 A6 */ mflr r0
/* 80207604 00204564 90 01 00 14 */ stw r0, 0x14(r1) /* 80207604 00204564 90 01 00 14 */ stw r0, 0x14(r1)
@ -53,8 +53,8 @@ lbl_80207624:
/* 8020762C 0020458C 38 21 00 10 */ addi r1, r1, 0x10 /* 8020762C 0020458C 38 21 00 10 */ addi r1, r1, 0x10
/* 80207630 00204590 4E 80 00 20 */ blr /* 80207630 00204590 4E 80 00 20 */ blr
.global sub_80207634 .global SetupRenderState__11CVisorFlareCFRC13CStateManager
sub_80207634: SetupRenderState__11CVisorFlareCFRC13CStateManager:
/* 80207634 00204594 94 21 FF F0 */ stwu r1, -0x10(r1) /* 80207634 00204594 94 21 FF F0 */ stwu r1, -0x10(r1)
/* 80207638 00204598 7C 08 02 A6 */ mflr r0 /* 80207638 00204598 7C 08 02 A6 */ mflr r0
/* 8020763C 0020459C 90 01 00 14 */ stw r0, 0x14(r1) /* 8020763C 0020459C 90 01 00 14 */ stw r0, 0x14(r1)
@ -188,8 +188,8 @@ lbl_80207810:
/* 8020781C 0020477C 38 21 00 10 */ addi r1, r1, 0x10 /* 8020781C 0020477C 38 21 00 10 */ addi r1, r1, 0x10
/* 80207820 00204780 4E 80 00 20 */ blr /* 80207820 00204780 4E 80 00 20 */ blr
.global sub_80207824 .global DrawStreamed__11CVisorFlareCFRC6CColorff
sub_80207824: DrawStreamed__11CVisorFlareCFRC6CColorff:
/* 80207824 00204784 94 21 FF A0 */ stwu r1, -0x60(r1) /* 80207824 00204784 94 21 FF A0 */ stwu r1, -0x60(r1)
/* 80207828 00204788 7C 08 02 A6 */ mflr r0 /* 80207828 00204788 7C 08 02 A6 */ mflr r0
/* 8020782C 0020478C 90 01 00 64 */ stw r0, 0x64(r1) /* 8020782C 0020478C 90 01 00 64 */ stw r0, 0x64(r1)
@ -273,8 +273,8 @@ sub_80207824:
/* 80207964 002048C4 38 21 00 60 */ addi r1, r1, 0x60 /* 80207964 002048C4 38 21 00 60 */ addi r1, r1, 0x60
/* 80207968 002048C8 4E 80 00 20 */ blr /* 80207968 002048C8 4E 80 00 20 */ blr
.global sub_8020796c .global DrawDirect__11CVisorFlareCFRC6CColorff
sub_8020796c: DrawDirect__11CVisorFlareCFRC6CColorff:
/* 8020796C 002048CC 94 21 FF D0 */ stwu r1, -0x30(r1) /* 8020796C 002048CC 94 21 FF D0 */ stwu r1, -0x30(r1)
/* 80207970 002048D0 7C 08 02 A6 */ mflr r0 /* 80207970 002048D0 7C 08 02 A6 */ mflr r0
/* 80207974 002048D4 90 01 00 34 */ stw r0, 0x34(r1) /* 80207974 002048D4 90 01 00 34 */ stw r0, 0x34(r1)
@ -519,7 +519,7 @@ lbl_80207D04:
/* 80207D0C 00204C6C 7F E4 FB 78 */ mr r4, r31 /* 80207D0C 00204C6C 7F E4 FB 78 */ mr r4, r31
/* 80207D10 00204C70 7C 00 00 34 */ cntlzw r0, r0 /* 80207D10 00204C70 7C 00 00 34 */ cntlzw r0, r0
/* 80207D14 00204C74 54 1A D9 7E */ srwi r26, r0, 5 /* 80207D14 00204C74 54 1A D9 7E */ srwi r26, r0, 5
/* 80207D18 00204C78 4B FF F9 1D */ bl sub_80207634 /* 80207D18 00204C78 4B FF F9 1D */ bl SetupRenderState__11CVisorFlareCFRC13CStateManager
/* 80207D1C 00204C7C C0 02 B0 E8 */ lfs f0, lbl_805ACE08@sda21(r2) /* 80207D1C 00204C7C C0 02 B0 E8 */ lfs f0, lbl_805ACE08@sda21(r2)
/* 80207D20 00204C80 3C 60 80 5A */ lis r3, sUpVector__9CVector3f@ha /* 80207D20 00204C80 3C 60 80 5A */ lis r3, sUpVector__9CVector3f@ha
/* 80207D24 00204C84 C3 C2 B0 EC */ lfs f30, lbl_805ACE0C@sda21(r2) /* 80207D24 00204C84 C3 C2 B0 EC */ lfs f30, lbl_805ACE0C@sda21(r2)
@ -626,14 +626,14 @@ lbl_80207E98:
/* 80207EA8 00204E08 90 61 00 0C */ stw r3, 0xc(r1) /* 80207EA8 00204E08 90 61 00 0C */ stw r3, 0xc(r1)
/* 80207EAC 00204E0C 7F C3 F3 78 */ mr r3, r30 /* 80207EAC 00204E0C 7F C3 F3 78 */ mr r3, r30
/* 80207EB0 00204E10 38 81 00 0C */ addi r4, r1, 0xc /* 80207EB0 00204E10 38 81 00 0C */ addi r4, r1, 0xc
/* 80207EB4 00204E14 4B FF FA B9 */ bl sub_8020796c /* 80207EB4 00204E14 4B FF FA B9 */ bl DrawDirect__11CVisorFlareCFRC6CColorff
/* 80207EB8 00204E18 48 00 00 18 */ b lbl_80207ED0 /* 80207EB8 00204E18 48 00 00 18 */ b lbl_80207ED0
lbl_80207EBC: lbl_80207EBC:
/* 80207EBC 00204E1C FC 20 B8 90 */ fmr f1, f23 /* 80207EBC 00204E1C FC 20 B8 90 */ fmr f1, f23
/* 80207EC0 00204E20 90 61 00 08 */ stw r3, 8(r1) /* 80207EC0 00204E20 90 61 00 08 */ stw r3, 8(r1)
/* 80207EC4 00204E24 7F C3 F3 78 */ mr r3, r30 /* 80207EC4 00204E24 7F C3 F3 78 */ mr r3, r30
/* 80207EC8 00204E28 38 81 00 08 */ addi r4, r1, 8 /* 80207EC8 00204E28 38 81 00 08 */ addi r4, r1, 8
/* 80207ECC 00204E2C 4B FF F9 59 */ bl sub_80207824 /* 80207ECC 00204E2C 4B FF F9 59 */ bl DrawStreamed__11CVisorFlareCFRC6CColorff
lbl_80207ED0: lbl_80207ED0:
/* 80207ED0 00204E30 38 61 00 58 */ addi r3, r1, 0x58 /* 80207ED0 00204E30 38 61 00 58 */ addi r3, r1, 0x58
/* 80207ED4 00204E34 38 80 00 00 */ li r4, 0 /* 80207ED4 00204E34 38 80 00 00 */ li r4, 0
@ -647,7 +647,7 @@ lbl_80207EE4:
/* 80207EEC 00204E4C 41 80 FE 54 */ blt lbl_80207D40 /* 80207EEC 00204E4C 41 80 FE 54 */ blt lbl_80207D40
/* 80207EF0 00204E50 7F C3 F3 78 */ mr r3, r30 /* 80207EF0 00204E50 7F C3 F3 78 */ mr r3, r30
/* 80207EF4 00204E54 7F E4 FB 78 */ mr r4, r31 /* 80207EF4 00204E54 7F E4 FB 78 */ mr r4, r31
/* 80207EF8 00204E58 4B FF F7 05 */ bl sub_802075fc /* 80207EF8 00204E58 4B FF F7 05 */ bl ResetTevSwapMode__11CVisorFlareCFRC13CStateManager
lbl_80207EFC: lbl_80207EFC:
/* 80207EFC 00204E5C E3 E1 02 08 */ psq_l f31, 520(r1), 0, qr0 /* 80207EFC 00204E5C E3 E1 02 08 */ psq_l f31, 520(r1), 0, qr0
/* 80207F00 00204E60 CB E1 02 00 */ lfd f31, 0x200(r1) /* 80207F00 00204E60 CB E1 02 00 */ lfd f31, 0x200(r1)
@ -914,8 +914,8 @@ lbl_802082AC:
/* 802082D0 00205230 38 21 09 20 */ addi r1, r1, 0x920 /* 802082D0 00205230 38 21 09 20 */ addi r1, r1, 0x920
/* 802082D4 00205234 4E 80 00 20 */ blr /* 802082D4 00205234 4E 80 00 20 */ blr
.global "__ct__11CVisorFlareFQ211CVisorFlare10EBlendModebfffRCQ24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>" .global "__ct__11CVisorFlareFQ211CVisorFlare10EBlendModebfffUiUiRCQ24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>"
"__ct__11CVisorFlareFQ211CVisorFlare10EBlendModebfffRCQ24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>": "__ct__11CVisorFlareFQ211CVisorFlare10EBlendModebfffUiUiRCQ24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>":
/* 802082D8 00205238 94 21 FF C0 */ stwu r1, -0x40(r1) /* 802082D8 00205238 94 21 FF C0 */ stwu r1, -0x40(r1)
/* 802082DC 0020523C 7C 08 02 A6 */ mflr r0 /* 802082DC 0020523C 7C 08 02 A6 */ mflr r0
/* 802082E0 00205240 90 01 00 44 */ stw r0, 0x44(r1) /* 802082E0 00205240 90 01 00 44 */ stw r0, 0x44(r1)
@ -937,7 +937,7 @@ lbl_802082AC:
/* 80208320 00205280 7C FF 3B 78 */ mr r31, r7 /* 80208320 00205280 7C FF 3B 78 */ mr r31, r7
/* 80208324 00205284 7D 04 43 78 */ mr r4, r8 /* 80208324 00205284 7D 04 43 78 */ mr r4, r8
/* 80208328 00205288 38 7C 00 04 */ addi r3, r28, 4 /* 80208328 00205288 38 7C 00 04 */ addi r3, r28, 4
/* 8020832C 0020528C 4B EC 61 41 */ bl sub_800ce46c /* 8020832C 0020528C 4B EC 61 41 */ bl "__ct__Q24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>FRCQ24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>"
/* 80208330 00205290 9B BC 00 14 */ stb r29, 0x14(r28) /* 80208330 00205290 9B BC 00 14 */ stb r29, 0x14(r28)
/* 80208334 00205294 C0 2D 93 90 */ lfs f1, lbl_805A7F50@sda21(r13) /* 80208334 00205294 C0 2D 93 90 */ lfs f1, lbl_805A7F50@sda21(r13)
/* 80208338 00205298 C0 01 00 08 */ lfs f0, 8(r1) /* 80208338 00205298 C0 01 00 08 */ lfs f0, 8(r1)

View File

@ -708,7 +708,7 @@ lbl_8015F0C0:
lbl_8015F0E8: lbl_8015F0E8:
/* 8015F0E8 0015C048 38 7E 05 7C */ addi r3, r30, 0x57c /* 8015F0E8 0015C048 38 7E 05 7C */ addi r3, r30, 0x57c
/* 8015F0EC 0015C04C 38 80 FF FF */ li r4, -1 /* 8015F0EC 0015C04C 38 80 FF FF */ li r4, -1
/* 8015F0F0 0015C050 4B F6 E6 C9 */ bl sub_800cd7b8 /* 8015F0F0 0015C050 4B F6 E6 C9 */ bl "__dt__Q24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>Fv"
/* 8015F0F4 0015C054 34 1E 05 6C */ addic. r0, r30, 0x56c /* 8015F0F4 0015C054 34 1E 05 6C */ addic. r0, r30, 0x56c
/* 8015F0F8 0015C058 41 82 00 18 */ beq lbl_8015F110 /* 8015F0F8 0015C058 41 82 00 18 */ beq lbl_8015F110
/* 8015F0FC 0015C05C 34 1E 05 6C */ addic. r0, r30, 0x56c /* 8015F0FC 0015C05C 34 1E 05 6C */ addic. r0, r30, 0x56c
@ -8481,7 +8481,7 @@ sub_801660a4:
/* 80166210 00163170 90 01 00 10 */ stw r0, 0x10(r1) /* 80166210 00163170 90 01 00 10 */ stw r0, 0x10(r1)
/* 80166214 00163174 39 20 00 00 */ li r9, 0 /* 80166214 00163174 39 20 00 00 */ li r9, 0
/* 80166218 00163178 39 40 00 01 */ li r10, 1 /* 80166218 00163178 39 40 00 01 */ li r10, 1
/* 8016621C 0016317C 48 07 05 11 */ bl "__ct__17CScriptVisorFlareF9TUniqueIdRCQ24rstl66basic_string<c,Q24rstl14char_traits<c>,Q24rstl17rmemory_allocator>RC11CEntityInfobRC9CVector3fQ211CVisorFlare10EBlendModebfffRCQ24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>" /* 8016621C 0016317C 48 07 05 11 */ bl "__ct__17CScriptVisorFlareF9TUniqueIdRCQ24rstl66basic_string<c,Q24rstl14char_traits<c>,Q24rstl17rmemory_allocator>RC11CEntityInfobRC9CVector3fQ211CVisorFlare10EBlendModebfffUiUiRCQ24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>"
/* 80166220 00163180 7C 7F 1B 78 */ mr r31, r3 /* 80166220 00163180 7C 7F 1B 78 */ mr r31, r3
lbl_80166224: lbl_80166224:
/* 80166224 00163184 7F 40 07 75 */ extsb. r0, r26 /* 80166224 00163184 7F 40 07 75 */ extsb. r0, r26
@ -8990,7 +8990,7 @@ lbl_8016689C:
/* 80166954 001638B4 B0 1E 05 78 */ sth r0, 0x578(r30) /* 80166954 001638B4 B0 1E 05 78 */ sth r0, 0x578(r30)
/* 80166958 001638B8 A0 0D A3 8C */ lhz r0, kInvalidUniqueId@sda21(r13) /* 80166958 001638B8 A0 0D A3 8C */ lhz r0, kInvalidUniqueId@sda21(r13)
/* 8016695C 001638BC B0 1E 05 7A */ sth r0, 0x57a(r30) /* 8016695C 001638BC B0 1E 05 7A */ sth r0, 0x57a(r30)
/* 80166960 001638C0 4B F6 7B 0D */ bl sub_800ce46c /* 80166960 001638C0 4B F6 7B 0D */ bl "__ct__Q24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>FRCQ24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>"
/* 80166964 001638C4 38 00 00 02 */ li r0, 2 /* 80166964 001638C4 38 00 00 02 */ li r0, 2
/* 80166968 001638C8 3C 60 80 5A */ lis r3, sZeroVector__9CVector3f@ha /* 80166968 001638C8 3C 60 80 5A */ lis r3, sZeroVector__9CVector3f@ha
/* 8016696C 001638CC 90 1E 05 8C */ stw r0, 0x58c(r30) /* 8016696C 001638CC 90 1E 05 8C */ stw r0, 0x58c(r30)

View File

@ -9191,12 +9191,12 @@ lbl_800CD61C:
/* 800CD684 000CA5E4 38 A1 00 3C */ addi r5, r1, 0x3c /* 800CD684 000CA5E4 38 A1 00 3C */ addi r5, r1, 0x3c
/* 800CD688 000CA5E8 90 01 00 10 */ stw r0, 0x10(r1) /* 800CD688 000CA5E8 90 01 00 10 */ stw r0, 0x10(r1)
/* 800CD68C 000CA5EC 39 01 00 30 */ addi r8, r1, 0x30 /* 800CD68C 000CA5EC 39 01 00 30 */ addi r8, r1, 0x30
/* 800CD690 000CA5F0 48 10 90 9D */ bl "__ct__17CScriptVisorFlareF9TUniqueIdRCQ24rstl66basic_string<c,Q24rstl14char_traits<c>,Q24rstl17rmemory_allocator>RC11CEntityInfobRC9CVector3fQ211CVisorFlare10EBlendModebfffRCQ24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>" /* 800CD690 000CA5F0 48 10 90 9D */ bl "__ct__17CScriptVisorFlareF9TUniqueIdRCQ24rstl66basic_string<c,Q24rstl14char_traits<c>,Q24rstl17rmemory_allocator>RC11CEntityInfobRC9CVector3fQ211CVisorFlare10EBlendModebfffUiUiRCQ24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>"
/* 800CD694 000CA5F4 7C 7B 1B 78 */ mr r27, r3 /* 800CD694 000CA5F4 7C 7B 1B 78 */ mr r27, r3
lbl_800CD698: lbl_800CD698:
/* 800CD698 000CA5F8 38 61 00 20 */ addi r3, r1, 0x20 /* 800CD698 000CA5F8 38 61 00 20 */ addi r3, r1, 0x20
/* 800CD69C 000CA5FC 38 80 FF FF */ li r4, -1 /* 800CD69C 000CA5FC 38 80 FF FF */ li r4, -1
/* 800CD6A0 000CA600 48 00 01 19 */ bl sub_800cd7b8 /* 800CD6A0 000CA600 48 00 01 19 */ bl "__dt__Q24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>Fv"
/* 800CD6A4 000CA604 88 01 00 D8 */ lbz r0, 0xd8(r1) /* 800CD6A4 000CA604 88 01 00 D8 */ lbz r0, 0xd8(r1)
/* 800CD6A8 000CA608 28 00 00 00 */ cmplwi r0, 0 /* 800CD6A8 000CA608 28 00 00 00 */ cmplwi r0, 0
/* 800CD6AC 000CA60C 41 82 00 1C */ beq lbl_800CD6C8 /* 800CD6AC 000CA60C 41 82 00 1C */ beq lbl_800CD6C8
@ -9273,8 +9273,8 @@ lbl_800CD78C:
/* 800CD7B0 000CA710 38 21 01 90 */ addi r1, r1, 0x190 /* 800CD7B0 000CA710 38 21 01 90 */ addi r1, r1, 0x190
/* 800CD7B4 000CA714 4E 80 00 20 */ blr /* 800CD7B4 000CA714 4E 80 00 20 */ blr
.global sub_800cd7b8 .global "__dt__Q24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>Fv"
sub_800cd7b8: "__dt__Q24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>Fv":
/* 800CD7B8 000CA718 94 21 FF D0 */ stwu r1, -0x30(r1) /* 800CD7B8 000CA718 94 21 FF D0 */ stwu r1, -0x30(r1)
/* 800CD7BC 000CA71C 7C 08 02 A6 */ mflr r0 /* 800CD7BC 000CA71C 7C 08 02 A6 */ mflr r0
/* 800CD7C0 000CA720 90 01 00 34 */ stw r0, 0x34(r1) /* 800CD7C0 000CA720 90 01 00 34 */ stw r0, 0x34(r1)
@ -9783,7 +9783,7 @@ lbl_800CDEE4:
/* 800CDEFC 000CAE5C 41 82 01 08 */ beq lbl_800CE004 /* 800CDEFC 000CAE5C 41 82 01 08 */ beq lbl_800CE004
/* 800CDF00 000CAE60 38 61 00 98 */ addi r3, r1, 0x98 /* 800CDF00 000CAE60 38 61 00 98 */ addi r3, r1, 0x98
/* 800CDF04 000CAE64 38 80 FF FF */ li r4, -1 /* 800CDF04 000CAE64 38 80 FF FF */ li r4, -1
/* 800CDF08 000CAE68 4B FF F8 B1 */ bl sub_800cd7b8 /* 800CDF08 000CAE68 4B FF F8 B1 */ bl "__dt__Q24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>Fv"
/* 800CDF0C 000CAE6C 88 01 01 6C */ lbz r0, 0x16c(r1) /* 800CDF0C 000CAE6C 88 01 01 6C */ lbz r0, 0x16c(r1)
/* 800CDF10 000CAE70 28 00 00 00 */ cmplwi r0, 0 /* 800CDF10 000CAE70 28 00 00 00 */ cmplwi r0, 0
/* 800CDF14 000CAE74 41 82 00 1C */ beq lbl_800CDF30 /* 800CDF14 000CAE74 41 82 00 1C */ beq lbl_800CDF30
@ -9942,7 +9942,7 @@ lbl_800CE004:
/* 800CE160 000CB0C0 41 82 01 40 */ beq lbl_800CE2A0 /* 800CE160 000CB0C0 41 82 01 40 */ beq lbl_800CE2A0
/* 800CE164 000CB0C4 38 61 00 88 */ addi r3, r1, 0x88 /* 800CE164 000CB0C4 38 61 00 88 */ addi r3, r1, 0x88
/* 800CE168 000CB0C8 38 81 00 98 */ addi r4, r1, 0x98 /* 800CE168 000CB0C8 38 81 00 98 */ addi r4, r1, 0x98
/* 800CE16C 000CB0CC 48 00 03 01 */ bl sub_800ce46c /* 800CE16C 000CB0CC 48 00 03 01 */ bl "__ct__Q24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>FRCQ24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>"
/* 800CE170 000CB0D0 80 E1 04 70 */ lwz r7, 0x470(r1) /* 800CE170 000CB0D0 80 E1 04 70 */ lwz r7, 0x470(r1)
/* 800CE174 000CB0D4 38 A0 00 01 */ li r5, 1 /* 800CE174 000CB0D4 38 A0 00 01 */ li r5, 1
/* 800CE178 000CB0D8 80 C1 04 74 */ lwz r6, 0x474(r1) /* 800CE178 000CB0D8 80 C1 04 74 */ lwz r6, 0x474(r1)
@ -10030,11 +10030,11 @@ lbl_800CE2B4:
/* 800CE2B8 000CB218 41 82 00 10 */ beq lbl_800CE2C8 /* 800CE2B8 000CB218 41 82 00 10 */ beq lbl_800CE2C8
/* 800CE2BC 000CB21C 38 61 00 88 */ addi r3, r1, 0x88 /* 800CE2BC 000CB21C 38 61 00 88 */ addi r3, r1, 0x88
/* 800CE2C0 000CB220 38 80 FF FF */ li r4, -1 /* 800CE2C0 000CB220 38 80 FF FF */ li r4, -1
/* 800CE2C4 000CB224 4B FF F4 F5 */ bl sub_800cd7b8 /* 800CE2C4 000CB224 4B FF F4 F5 */ bl "__dt__Q24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>Fv"
lbl_800CE2C8: lbl_800CE2C8:
/* 800CE2C8 000CB228 38 61 00 98 */ addi r3, r1, 0x98 /* 800CE2C8 000CB228 38 61 00 98 */ addi r3, r1, 0x98
/* 800CE2CC 000CB22C 38 80 FF FF */ li r4, -1 /* 800CE2CC 000CB22C 38 80 FF FF */ li r4, -1
/* 800CE2D0 000CB230 4B FF F4 E9 */ bl sub_800cd7b8 /* 800CE2D0 000CB230 4B FF F4 E9 */ bl "__dt__Q24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>Fv"
/* 800CE2D4 000CB234 88 01 01 6C */ lbz r0, 0x16c(r1) /* 800CE2D4 000CB234 88 01 01 6C */ lbz r0, 0x16c(r1)
/* 800CE2D8 000CB238 28 00 00 00 */ cmplwi r0, 0 /* 800CE2D8 000CB238 28 00 00 00 */ cmplwi r0, 0
/* 800CE2DC 000CB23C 41 82 00 1C */ beq lbl_800CE2F8 /* 800CE2DC 000CB23C 41 82 00 1C */ beq lbl_800CE2F8
@ -10144,8 +10144,8 @@ lbl_800CE3C8:
/* 800CE464 000CB3C4 38 21 06 30 */ addi r1, r1, 0x630 /* 800CE464 000CB3C4 38 21 06 30 */ addi r1, r1, 0x630
/* 800CE468 000CB3C8 4E 80 00 20 */ blr /* 800CE468 000CB3C8 4E 80 00 20 */ blr
.global sub_800ce46c .global "__ct__Q24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>FRCQ24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>"
sub_800ce46c: "__ct__Q24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>FRCQ24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>":
/* 800CE46C 000CB3CC 94 21 FF E0 */ stwu r1, -0x20(r1) /* 800CE46C 000CB3CC 94 21 FF E0 */ stwu r1, -0x20(r1)
/* 800CE470 000CB3D0 7C 08 02 A6 */ mflr r0 /* 800CE470 000CB3D0 7C 08 02 A6 */ mflr r0
/* 800CE474 000CB3D4 90 01 00 24 */ stw r0, 0x24(r1) /* 800CE474 000CB3D4 90 01 00 24 */ stw r0, 0x24(r1)

View File

@ -3,8 +3,8 @@
.section .data .section .data
.balign 8 .balign 8
.global lbl_803E5830 .global __vt__17CScriptVisorFlare
lbl_803E5830: __vt__17CScriptVisorFlare:
# ROM: 0x3E2830 # ROM: 0x3E2830
.4byte 0 .4byte 0
.4byte 0 .4byte 0
@ -193,12 +193,12 @@ __dt__17CScriptVisorFlareFv:
/* 801D6678 001D35D8 93 C1 00 08 */ stw r30, 8(r1) /* 801D6678 001D35D8 93 C1 00 08 */ stw r30, 8(r1)
/* 801D667C 001D35DC 7C 7E 1B 79 */ or. r30, r3, r3 /* 801D667C 001D35DC 7C 7E 1B 79 */ or. r30, r3, r3
/* 801D6680 001D35E0 41 82 00 38 */ beq lbl_801D66B8 /* 801D6680 001D35E0 41 82 00 38 */ beq lbl_801D66B8
/* 801D6684 001D35E4 3C 80 80 3E */ lis r4, lbl_803E5830@ha /* 801D6684 001D35E4 3C 80 80 3E */ lis r4, __vt__17CScriptVisorFlare@ha
/* 801D6688 001D35E8 38 7E 00 E8 */ addi r3, r30, 0xe8 /* 801D6688 001D35E8 38 7E 00 E8 */ addi r3, r30, 0xe8
/* 801D668C 001D35EC 38 04 58 30 */ addi r0, r4, lbl_803E5830@l /* 801D668C 001D35EC 38 04 58 30 */ addi r0, r4, __vt__17CScriptVisorFlare@l
/* 801D6690 001D35F0 38 80 FF FF */ li r4, -1 /* 801D6690 001D35F0 38 80 FF FF */ li r4, -1
/* 801D6694 001D35F4 90 1E 00 00 */ stw r0, 0(r30) /* 801D6694 001D35F4 90 1E 00 00 */ stw r0, 0(r30)
/* 801D6698 001D35F8 48 00 00 3D */ bl sub_801d66d4 /* 801D6698 001D35F8 48 00 00 3D */ bl __dt__11CVisorFlareFv
/* 801D669C 001D35FC 7F C3 F3 78 */ mr r3, r30 /* 801D669C 001D35FC 7F C3 F3 78 */ mr r3, r30
/* 801D66A0 001D3600 38 80 00 00 */ li r4, 0 /* 801D66A0 001D3600 38 80 00 00 */ li r4, 0
/* 801D66A4 001D3604 4B E7 F0 4D */ bl __dt__6CActorFv /* 801D66A4 001D3604 4B E7 F0 4D */ bl __dt__6CActorFv
@ -215,8 +215,8 @@ lbl_801D66B8:
/* 801D66CC 001D362C 38 21 00 10 */ addi r1, r1, 0x10 /* 801D66CC 001D362C 38 21 00 10 */ addi r1, r1, 0x10
/* 801D66D0 001D3630 4E 80 00 20 */ blr /* 801D66D0 001D3630 4E 80 00 20 */ blr
.global sub_801d66d4 .global __dt__11CVisorFlareFv
sub_801d66d4: __dt__11CVisorFlareFv:
/* 801D66D4 001D3634 94 21 FF F0 */ stwu r1, -0x10(r1) /* 801D66D4 001D3634 94 21 FF F0 */ stwu r1, -0x10(r1)
/* 801D66D8 001D3638 7C 08 02 A6 */ mflr r0 /* 801D66D8 001D3638 7C 08 02 A6 */ mflr r0
/* 801D66DC 001D363C 90 01 00 14 */ stw r0, 0x14(r1) /* 801D66DC 001D363C 90 01 00 14 */ stw r0, 0x14(r1)
@ -227,7 +227,7 @@ sub_801d66d4:
/* 801D66F0 001D3650 41 82 00 20 */ beq lbl_801D6710 /* 801D66F0 001D3650 41 82 00 20 */ beq lbl_801D6710
/* 801D66F4 001D3654 38 7E 00 04 */ addi r3, r30, 4 /* 801D66F4 001D3654 38 7E 00 04 */ addi r3, r30, 4
/* 801D66F8 001D3658 38 80 FF FF */ li r4, -1 /* 801D66F8 001D3658 38 80 FF FF */ li r4, -1
/* 801D66FC 001D365C 4B EF 70 BD */ bl sub_800cd7b8 /* 801D66FC 001D365C 4B EF 70 BD */ bl "__dt__Q24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>Fv"
/* 801D6700 001D3660 7F E0 07 35 */ extsh. r0, r31 /* 801D6700 001D3660 7F E0 07 35 */ extsh. r0, r31
/* 801D6704 001D3664 40 81 00 0C */ ble lbl_801D6710 /* 801D6704 001D3664 40 81 00 0C */ ble lbl_801D6710
/* 801D6708 001D3668 7F C3 F3 78 */ mr r3, r30 /* 801D6708 001D3668 7F C3 F3 78 */ mr r3, r30
@ -241,8 +241,8 @@ lbl_801D6710:
/* 801D6724 001D3684 38 21 00 10 */ addi r1, r1, 0x10 /* 801D6724 001D3684 38 21 00 10 */ addi r1, r1, 0x10
/* 801D6728 001D3688 4E 80 00 20 */ blr /* 801D6728 001D3688 4E 80 00 20 */ blr
.global "__ct__17CScriptVisorFlareF9TUniqueIdRCQ24rstl66basic_string<c,Q24rstl14char_traits<c>,Q24rstl17rmemory_allocator>RC11CEntityInfobRC9CVector3fQ211CVisorFlare10EBlendModebfffRCQ24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>" .global "__ct__17CScriptVisorFlareF9TUniqueIdRCQ24rstl66basic_string<c,Q24rstl14char_traits<c>,Q24rstl17rmemory_allocator>RC11CEntityInfobRC9CVector3fQ211CVisorFlare10EBlendModebfffUiUiRCQ24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>"
"__ct__17CScriptVisorFlareF9TUniqueIdRCQ24rstl66basic_string<c,Q24rstl14char_traits<c>,Q24rstl17rmemory_allocator>RC11CEntityInfobRC9CVector3fQ211CVisorFlare10EBlendModebfffRCQ24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>": "__ct__17CScriptVisorFlareF9TUniqueIdRCQ24rstl66basic_string<c,Q24rstl14char_traits<c>,Q24rstl17rmemory_allocator>RC11CEntityInfobRC9CVector3fQ211CVisorFlare10EBlendModebfffUiUiRCQ24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>":
/* 801D672C 001D368C 94 21 FE B0 */ stwu r1, -0x150(r1) /* 801D672C 001D368C 94 21 FE B0 */ stwu r1, -0x150(r1)
/* 801D6730 001D3690 7C 08 02 A6 */ mflr r0 /* 801D6730 001D3690 7C 08 02 A6 */ mflr r0
/* 801D6734 001D3694 90 01 01 54 */ stw r0, 0x154(r1) /* 801D6734 001D3694 90 01 01 54 */ stw r0, 0x154(r1)
@ -307,9 +307,9 @@ lbl_801D6710:
/* 801D6820 001D3780 38 61 00 B8 */ addi r3, r1, 0xb8 /* 801D6820 001D3780 38 61 00 B8 */ addi r3, r1, 0xb8
/* 801D6824 001D3784 38 80 FF FF */ li r4, -1 /* 801D6824 001D3784 38 80 FF FF */ li r4, -1
/* 801D6828 001D3788 4B F4 02 25 */ bl __dt__10CModelDataFv /* 801D6828 001D3788 4B F4 02 25 */ bl __dt__10CModelDataFv
/* 801D682C 001D378C 3C 60 80 3E */ lis r3, lbl_803E5830@ha /* 801D682C 001D378C 3C 60 80 3E */ lis r3, __vt__17CScriptVisorFlare@ha
/* 801D6830 001D3790 FC 20 E8 90 */ fmr f1, f29 /* 801D6830 001D3790 FC 20 E8 90 */ fmr f1, f29
/* 801D6834 001D3794 38 03 58 30 */ addi r0, r3, lbl_803E5830@l /* 801D6834 001D3794 38 03 58 30 */ addi r0, r3, __vt__17CScriptVisorFlare@l
/* 801D6838 001D3798 FC 40 F0 90 */ fmr f2, f30 /* 801D6838 001D3798 FC 40 F0 90 */ fmr f2, f30
/* 801D683C 001D379C FC 60 F8 90 */ fmr f3, f31 /* 801D683C 001D379C FC 60 F8 90 */ fmr f3, f31
/* 801D6840 001D37A0 90 16 00 00 */ stw r0, 0(r22) /* 801D6840 001D37A0 90 16 00 00 */ stw r0, 0(r22)
@ -319,7 +319,7 @@ lbl_801D6710:
/* 801D6850 001D37B0 7F C7 F3 78 */ mr r7, r30 /* 801D6850 001D37B0 7F C7 F3 78 */ mr r7, r30
/* 801D6854 001D37B4 7F E8 FB 78 */ mr r8, r31 /* 801D6854 001D37B4 7F E8 FB 78 */ mr r8, r31
/* 801D6858 001D37B8 38 76 00 E8 */ addi r3, r22, 0xe8 /* 801D6858 001D37B8 38 76 00 E8 */ addi r3, r22, 0xe8
/* 801D685C 001D37BC 48 03 1A 7D */ bl "__ct__11CVisorFlareFQ211CVisorFlare10EBlendModebfffRCQ24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>" /* 801D685C 001D37BC 48 03 1A 7D */ bl "__ct__11CVisorFlareFQ211CVisorFlare10EBlendModebfffUiUiRCQ24rstl60vector<Q211CVisorFlare9CFlareDef,Q24rstl17rmemory_allocator>"
/* 801D6860 001D37C0 38 00 00 01 */ li r0, 1 /* 801D6860 001D37C0 38 00 00 01 */ li r0, 1
/* 801D6864 001D37C4 38 80 00 02 */ li r4, 2 /* 801D6864 001D37C4 38 80 00 02 */ li r4, 2
/* 801D6868 001D37C8 98 16 01 1C */ stb r0, 0x11c(r22) /* 801D6868 001D37C8 98 16 01 1C */ stb r0, 0x11c(r22)

View File

@ -284,7 +284,7 @@ LIBS = [
"MetroidPrime/ScriptObjects/CFishCloud", "MetroidPrime/ScriptObjects/CFishCloud",
["MetroidPrime/CHealthInfo", True], ["MetroidPrime/CHealthInfo", True],
"MetroidPrime/Player/CGameState", "MetroidPrime/Player/CGameState",
"MetroidPrime/ScriptObjects/CScriptVisorFlare", ["MetroidPrime/ScriptObjects/CScriptVisorFlare", False],
"MetroidPrime/ScriptObjects/CScriptWorldTeleporter", "MetroidPrime/ScriptObjects/CScriptWorldTeleporter",
"MetroidPrime/ScriptObjects/CScriptVisorGoo", "MetroidPrime/ScriptObjects/CScriptVisorGoo",
"MetroidPrime/Enemies/CJellyZap", "MetroidPrime/Enemies/CJellyZap",
@ -309,7 +309,7 @@ LIBS = [
"MetroidPrime/CMapUniverse", "MetroidPrime/CMapUniverse",
"MetroidPrime/Enemies/CThardusRockProjectile", "MetroidPrime/Enemies/CThardusRockProjectile",
"MetroidPrime/CInventoryScreen", "MetroidPrime/CInventoryScreen",
"MetroidPrime/CVisorFlare", ["MetroidPrime/CVisorFlare", False],
"MetroidPrime/Enemies/CFlaahgraPlants", "MetroidPrime/Enemies/CFlaahgraPlants",
"MetroidPrime/CWorldTransManager", "MetroidPrime/CWorldTransManager",
["MetroidPrime/ScriptObjects/CScriptMidi", False], ["MetroidPrime/ScriptObjects/CScriptMidi", False],

View File

@ -120,6 +120,7 @@ public:
static void StreamBegin(ERglPrimitive primitive); static void StreamBegin(ERglPrimitive primitive);
static void StreamColor(const CColor& color); static void StreamColor(const CColor& color);
static void StreamTexcoord(float u, float v); static void StreamTexcoord(float u, float v);
static void StreamVertex(float, float, float);
static void StreamVertex(const CVector3f& vtx); static void StreamVertex(const CVector3f& vtx);
static void StreamEnd(); static void StreamEnd();

View File

@ -31,6 +31,26 @@ public:
virtual void PostRenderFogs(); virtual void PostRenderFogs();
virtual void SetModelMatrix(const CTransform4f& xf); virtual void SetModelMatrix(const CTransform4f& xf);
virtual void AddParticleGen(const CParticleGen& gen); virtual void AddParticleGen(const CParticleGen& gen);
virtual void AddParticleGen2();
virtual void AddPlaneObject();
virtual void AddDrawable(const void* obj, const CVector3f& pos, const CAABox& bounds, int mode,
IRenderer::EDrawableSorting sorting);
virtual void SetDrawableCallback();
virtual void SetWorldViewpoint();
virtual void SetPerspective1();
virtual void SetPerspective2();
virtual rstl::pair< CVector2f, CVector2f > SetViewportOrtho(bool centered, float znear,
float zfar);
virtual void SetClippingPlanes();
virtual void SetViewport();
virtual void SetDepthReadWrite(bool read, bool update);
virtual void SetBlendMode_AdditiveAlpha();
virtual void SetBlendMode_AlphaBlended();
virtual void SetBlendMode_NoColorWrite();
virtual void SetBlendMode_ColorMultiply();
virtual void SetBlendMode_InvertDst();
virtual void SetBlendMode_InvertSrc();
virtual void SetBlendMode_AdditiveDestColor();
}; };
namespace Renderer { namespace Renderer {

View File

@ -97,6 +97,7 @@ public:
kCFS_Max, kCFS_Max,
}; };
bool RenderLast(const TUniqueId&);
void ResetEscapeSequenceTimer(float); void ResetEscapeSequenceTimer(float);
void SendScriptMsg(TUniqueId uid, TEditorId target, EScriptObjectMessage msg, void SendScriptMsg(TUniqueId uid, TEditorId target, EScriptObjectMessage msg,
EScriptObjectState state); EScriptObjectState state);
@ -109,6 +110,9 @@ public:
void AddObject(CEntity*); void AddObject(CEntity*);
TUniqueId AllocateUniqueId(); TUniqueId AllocateUniqueId();
void BuildNearList(TEntityList& nearList, const CVector3f& pos, const CVector3f& dir, float mag, const CMaterialFilter&,
const CActor*) const;
void BuildNearList(TEntityList& nearList, const CAABox&, const CMaterialFilter&, void BuildNearList(TEntityList& nearList, const CAABox&, const CMaterialFilter&,
const CActor*) const; const CActor*) const;
bool RayCollideWorld(const CVector3f& start, const CVector3f& end, const TEntityList& nearList, bool RayCollideWorld(const CVector3f& start, const CVector3f& end, const TEntityList& nearList,
@ -169,6 +173,7 @@ public:
float GetThermalColdScale1() const { return xf24_thermColdScale1; } float GetThermalColdScale1() const { return xf24_thermColdScale1; }
float GetThermalColdScale2() const { return xf28_thermColdScale2; } float GetThermalColdScale2() const { return xf28_thermColdScale2; }
void SetThermalColdScale2(float s) { xf28_thermColdScale2 = s; }
bool IsGeneratingObject() const { return xf94_26_generatingObject; } bool IsGeneratingObject() const { return xf94_26_generatingObject; }
void SetIsGeneratingObject(bool gen) { xf94_26_generatingObject = gen; } void SetIsGeneratingObject(bool gen) { xf94_26_generatingObject = gen; }
@ -199,6 +204,8 @@ public:
return xf90_deferredTransition == kSMT_MessageScreen; return xf90_deferredTransition == kSMT_MessageScreen;
} }
EThermalDrawFlag GetThermalDrawFlag() const { return xf34_thermalFlag; }
void SetLastTriggerId(TUniqueId uid) { xf74_lastTrigger = uid; } void SetLastTriggerId(TUniqueId uid) { xf74_lastTrigger = uid; }
TUniqueId GetLastTriggerId() const { return xf74_lastTrigger; } TUniqueId GetLastTriggerId() const { return xf74_lastTrigger; }

View File

@ -0,0 +1,69 @@
#ifndef _CVISORFLARE
#define _CVISORFLARE
#include "Kyoto/TToken.hpp"
#include "Kyoto/Graphics/CColor.hpp"
#include "rstl/vector.hpp"
#include "rstl/optional_object.hpp"
class CTexture;
class CStateManager;
class CVector3f;
class CActor;
class CVisorFlare {
public:
enum EBlendMode {
kBM_Additive = 0,
kBM_Blend = 1,
};
class CFlareDef {
mutable TToken<CTexture> x0_tex;
float x8_pos;
float xc_scale;
CColor x10_color;
public:
// CFlareDef() = default;
// CFlareDef(const CFlareDef& other)
// : x0_tex(other.x0_tex)
// , x8_pos(other.x8_pos)
// , xc_scale(other.xc_scale)
// , x10_color(other.x10_color)
// {}
CFlareDef(const TToken<CTexture>& tex, float pos, float scale, uint color);
TToken<CTexture>& GetTexture() const { return x0_tex; }
CColor GetColor() const { return x10_color; }
float GetPosition() const { return x8_pos; }
float GetScale() const { return xc_scale; }
};
private:
EBlendMode x0_blendMode;
rstl::vector<CFlareDef> x4_flareDefs;
bool x14_b1;
float x18_f1;
float x1c_f2;
float x20_f3;
float x24_;
float x28_;
int x2c_w1;
int x30_w2;
void SetupRenderState(const CStateManager& mgr) const;
void ResetTevSwapMode(const CStateManager& mgr) const;
void DrawDirect(const CColor& color, float f1, float f2) const;
void DrawStreamed(const CColor& color, float f1, float f2) const;
public:
CVisorFlare(EBlendMode blendMode, bool, float, float, float, uint, uint, const rstl::vector<CFlareDef>& flares);
~CVisorFlare() {}
void Update(float dt, const CVector3f& pos, const CActor* act, CStateManager& mgr);
void Render(const CVector3f& pos, const CStateManager& mgr) const;
static rstl::optional_object<CFlareDef> LoadFlareDef(CInputStream& in);
};
#endif // _CVISORFLARE

View File

@ -0,0 +1,26 @@
#ifndef _CSCRIPTVISORFLARE
#define _CSCRIPTVISORFLARE
#include "MetroidPrime/CActor.hpp"
#include "MetroidPrime/CVisorFlare.hpp"
class CScriptVisorFlare : public CActor {
CVisorFlare xe8_flare;
bool x11c_notInRenderLast;
public:
CScriptVisorFlare(TUniqueId uid, const rstl::string& name, const CEntityInfo& info, bool active,
const CVector3f& pos, CVisorFlare::EBlendMode blendMode, bool, float, float, float, uint, uint,
const rstl::vector<CVisorFlare::CFlareDef>& flares);
~CScriptVisorFlare();
void Accept(IVisitor& visitor) override;
void Think(float, CStateManager& stateMgr) override;
void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr) override;
void PreRender(CStateManager&, const CFrustumPlanes&) override;
void AddToRenderer(const CFrustumPlanes&, const CStateManager&) const override;
void Render(const CStateManager&) const override;
};
#endif // _CSCRIPTVISORFLARE

View File

@ -0,0 +1,264 @@
#include "MetroidPrime/CVisorFlare.hpp"
#include "MetroidPrime/CStateManager.hpp"
#include "MetroidPrime/Cameras/CCameraManager.hpp"
#include "MetroidPrime/Cameras/CGameCamera.hpp"
#include "MetroidPrime/Player/CPlayer.hpp"
#include "MetroidPrime/Player/CPlayerState.hpp"
#include "Collision/CRayCastResult.hpp"
#include "MetaRender/CCubeRenderer.hpp"
#include "Kyoto/Graphics/CGX.hpp"
#include "Kyoto/Graphics/CGraphics.hpp"
#include "Kyoto/Graphics/CTexture.hpp"
#include "Kyoto/Math/CloseEnough.hpp"
#include "Kyoto/Streams/CInputStream.hpp"
#include "dolphin/gx.h"
#include "math.h"
#include "rstl/math.hpp"
CVisorFlare::CFlareDef::CFlareDef(const TToken< CTexture >& tex, float pos, float scale, uint color)
: x0_tex(tex), x8_pos(pos), xc_scale(scale), x10_color(color) {
x0_tex.Lock();
}
rstl::optional_object< CVisorFlare::CFlareDef > CVisorFlare::LoadFlareDef(CInputStream& in) {
uint propCount = in.ReadLong();
if (propCount != 4)
return rstl::optional_object_null();
CAssetId txtrId = in.Get< CAssetId >();
float f1 = in.ReadFloat();
float f2 = in.ReadFloat();
CColor color = in.Get< CColor >();
if (txtrId == kInvalidAssetId)
return rstl::optional_object_null();
TToken< CTexture > tex = gpSimplePool->GetObj(SObjectTag('TXTR', txtrId));
return CFlareDef(tex, f1, f2, color.GetColor_u32());
}
CVisorFlare::CVisorFlare(EBlendMode blendMode, bool b1, float f1, float f2, float f3, uint w1,
uint w2, const rstl::vector< CFlareDef >& flares)
: x0_blendMode(blendMode)
, x4_flareDefs(flares)
, x14_b1(b1)
, x18_f1(rstl::max_val(1.0E-4f, f1))
, x1c_f2(f2)
, x20_f3(f3)
, x24_(0.f)
, x28_(0.f)
, x2c_w1(w1)
, x30_w2(w2) {}
void CVisorFlare::Update(float dt, const CVector3f& pos, const CActor* act, CStateManager& mgr) {
const CPlayerState::EPlayerVisor visor = mgr.GetPlayerState()->GetCurrentVisor();
if ((visor == CPlayerState::kPV_Combat || (x2c_w1 != 1 && visor == CPlayerState::kPV_Thermal)) &&
mgr.GetPlayer()->GetMorphballTransitionState() == CPlayer::kMS_Unmorphed) {
CVector3f camPos = mgr.GetCameraManager()->GetCurrentCamera(mgr)->GetTranslation();
CVector3f camDiff = pos - camPos;
const float mag = camDiff.Magnitude();
camDiff = camDiff * (1.f / mag);
bool rayCastIsValid;
{
const CMaterialFilter& nearMaterialList =
CMaterialFilter::MakeInclude(CMaterialList(kMT_Occluder));
TEntityList nearVec;
mgr.BuildNearList(nearVec, camPos, camDiff, mag, nearMaterialList, act);
const CMaterialFilter& rayMaterialList = CMaterialFilter::MakeIncludeExclude(
CMaterialList(kMT_Solid), CMaterialList(kMT_SeeThrough));
TUniqueId id(kInvalidUniqueId);
rayCastIsValid =
mgr.RayWorldIntersection(id, camPos, camDiff, mag, rayMaterialList, nearVec).IsValid();
}
if (!rayCastIsValid) {
x28_ -= dt;
} else {
x28_ += dt;
}
x28_ = rstl::max_val(x18_f1, rstl::min_val(x28_, 0.f));
const CGameCamera* curCam = mgr.GetCameraManager()->GetCurrentCamera(mgr);
const CVector3f cameraForward = curCam->GetTransform().GetForward();
x24_ = 1.f - (x28_ / x18_f1);
const CVector3f dir = (pos - curCam->GetTranslation()).AsNormalized();
float dot = CVector3f::Dot(dir, cameraForward);
x24_ *= rstl::max_val(0.f, 1.f - (x1c_f2 * 4.f * (1.f - dot)));
if (x2c_w1 == 2) {
mgr.SetThermalColdScale2(mgr.GetThermalColdScale2() + x24_);
}
}
}
void CVisorFlare::Render(const CVector3f& inPos, const CStateManager& mgr) const {
if (close_enough(x28_, x18_f1, 1.0E-5f) ||
mgr.GetPlayer()->GetMorphballTransitionState() != CPlayer::kMS_Unmorphed) {
return;
}
switch (mgr.GetPlayerState()->GetActiveVisor(mgr)) {
case CPlayerState::kPV_Combat:
if (x30_w2 != 0)
return;
break;
case CPlayerState::kPV_Thermal:
if (x2c_w1 != 0)
return;
break;
default:
return;
}
CGraphics::DisableAllLights();
gpRender->SetDepthReadWrite(false, false);
const CGameCamera* cam = mgr.GetCameraManager()->GetCurrentCamera(mgr);
CVector3f camPos = cam->GetTranslation();
CVector3f inPosCopy(inPos);
CTransform4f viewMatrix = CGraphics::GetViewMatrix();
const CVector3f invPos = viewMatrix.GetInverse() * inPosCopy;
const CVector3f invPos2 = viewMatrix * CVector3f(-invPos.GetX(), invPos.GetY(), -invPos.GetZ());
CVector3f camFront = cam->GetTransform().GetForward();
if (!close_enough(x24_, 0.f, 1.0E-5f)) {
float acos = 0.f;
if (!close_enough(x20_f3, 0.f, 1.0E-5f)) {
CVector3f camDist(CVector3f(inPosCopy.GetX() - camPos.GetX(), inPosCopy.GetY() - camPos.GetY(), 0.f).AsNormalized());
CVector3f camDir(CVector3f(camFront.GetX(), camFront.GetY(), 0.f).AsNormalized());
acos = CMath::ArcCosineR(CVector3f::Dot(camDist, camDir));
if (camDist.GetX() * camDir.GetY() - camDir.GetX() * camDist.GetY() < 0.f) {
acos = -acos;
}
acos = x20_f3 * acos;
}
SetupRenderState(mgr);
for (rstl::vector< CFlareDef >::const_iterator item = x4_flareDefs.begin();
item != x4_flareDefs.end(); ++item) {
const float itemPos = item->GetPosition();
const CVector3f origin = inPosCopy * (1.f - itemPos) + invPos2 * itemPos;
CTransform4f modelMatrix(CTransform4f::LookAt(origin, camPos));
gpRender->SetModelMatrix(modelMatrix);
float scale = 0.5f * x24_ * item->GetScale();
if (x14_b1) {
CVector3f dist = origin - camPos;
if (dist.CanBeNormalized()) {
scale *= dist.Magnitude();
}
}
if (item->GetTexture().IsLoaded()) {
item->GetTexture()->Load(GX_TEXMAP0, CTexture::kCM_Repeat);
float f1;
if (close_enough(acos, 0.f)) {
f1 = 0.f;
} else {
f1 = scale * sinf(acos);
scale *= cosf(acos);
}
if (mgr.GetThermalDrawFlag() == kTD_Hot) {
DrawDirect(item->GetColor(), f1, scale);
} else {
DrawStreamed(item->GetColor(), f1, scale);
}
}
}
ResetTevSwapMode(mgr);
}
}
void CVisorFlare::DrawDirect(const CColor& color, float f1, float f2) const {
// Giant TODO
// CColor kcolor = color;
// kcolor.a() *= x24_; // TODO i think this is wrong
GXColor gxColor;
CGX::SetTevKColor(GX_KCOLOR0, gxColor);
CGX::Begin(GX_TRIANGLESTRIP, GX_VTXFMT0, 4);
// GXPosition3f32(f1 - f2, 0.f, f2 + f1);
// GXTexCoord2f32(0.f, 1.f);
// GXPosition3f32(f2 + f1, 0.f, f2 - f1);
// GXTexCoord2f32(1.f, 1.f);
// GXPosition3f32(-(f2 - f1), 0.f, -(f2 - f1));
// GXTexCoord2f32(0.f, 0.f);
// GXPosition3f32(-f1 + f2, 0.f, -f2 - f1);
// GXTexCoord2f32(1.f, 0.f);
CGX::End();
}
void CVisorFlare::DrawStreamed(const CColor& color, float f1, float f2) const {
CGraphics::StreamBegin(kP_TriangleStrip);
float a = color.GetAlpha(); // TODO: incorrect
CGraphics::StreamColor(CColor(color, a * x24_));
CGraphics::StreamTexcoord(0.f, 1.f);
CGraphics::StreamVertex(f1 - f2, 0.f, f2 + f1);
CGraphics::StreamTexcoord(1.f, 1.f);
CGraphics::StreamVertex(f1 + f2, 0.f, f2 - f1);
CGraphics::StreamTexcoord(0.f, 0.f);
CGraphics::StreamVertex(-(f1 + f2), 0.f, -(f2 - f1));
CGraphics::StreamTexcoord(1.f, 0.f);
CGraphics::StreamVertex(-f1 + f2, 0.f, -f2 - f1);
CGraphics::StreamEnd();
}
void CVisorFlare::SetupRenderState(const CStateManager& mgr) const {
if (mgr.GetThermalDrawFlag() == kTD_Hot) {
CGX::SetBlendMode(GX_BM_BLEND, GX_BL_ONE, GX_BL_ONE, GX_LO_CLEAR);
CGX::SetStandardTevColorAlphaOp(GX_TEVSTAGE0);
CGX::SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL);
CGX::SetAlphaCompare(GX_ALWAYS, 0, GX_AOP_OR, GX_ALWAYS, 0);
GXSetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP0, GX_TEV_SWAP1);
CGX::SetTevKColorSel(GX_TEVSTAGE0, GX_TEV_KCSEL_K0_A);
CGX::SetTevKAlphaSel(GX_TEVSTAGE0, GX_TEV_KASEL_K0_A);
CGX::SetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_TEXC, GX_CC_KONST, GX_CC_ZERO);
CGX::SetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_TEXA, GX_CA_KONST, GX_CA_ZERO);
CGX::SetNumTexGens(1);
CGX::SetNumChans(0);
CGX::SetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY, false, GX_PTIDENTITY);
switch (x0_blendMode) {
case kBM_Additive:
CGX::SetNumTevStages(1);
break;
case kBM_Blend:
CGX::SetStandardTevColorAlphaOp(GX_TEVSTAGE1);
CGX::SetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL);
CGX::SetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_TEXA, GX_CC_CPREV, GX_CC_ZERO);
CGX::SetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_TEXA, GX_CA_APREV, GX_CA_ZERO);
CGX::SetNumTevStages(2);
break;
}
static const GXVtxDescList vtxDescList[3] = {
{GX_VA_POS, GX_DIRECT},
{GX_VA_TEX0, GX_DIRECT},
{GX_VA_NULL, GX_NONE},
};
CGX::SetVtxDescv(vtxDescList);
} else {
switch (x0_blendMode) {
case kBM_Additive:
gpRender->SetBlendMode_AdditiveAlpha();
break;
case kBM_Blend:
gpRender->SetBlendMode_AlphaBlended();
break;
}
CGraphics::SetTevOp(kTS_Stage0, CGraphics::kEnvModulate);
CGraphics::SetTevOp(kTS_Stage1, CGraphics::kEnvPassthru);
}
}
void CVisorFlare::ResetTevSwapMode(const CStateManager& mgr) const {
if (mgr.GetThermalDrawFlag() == kTD_Hot) {
GXSetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP0, GX_TEV_SWAP0);
}
}

View File

@ -0,0 +1,41 @@
#include "MetroidPrime/ScriptObjects/CScriptVisorFlare.hpp"
#include "MetroidPrime/CActorParameters.hpp"
#include "MetroidPrime/CStateManager.hpp"
#include "MetroidPrime/Player/CPlayer.hpp"
CScriptVisorFlare::CScriptVisorFlare(TUniqueId uid, const rstl::string& name, const CEntityInfo& info, bool active,
const CVector3f& pos, CVisorFlare::EBlendMode blendMode, bool b1, float f1,
float f2, float f3, uint w1, uint w2, const rstl::vector<CVisorFlare::CFlareDef>& flares)
: CActor(uid, active, name, info, CTransform4f::Translate(pos), CModelData::CModelDataNull(),
CMaterialList(kMT_NoStepLogic), CActorParameters::None(), kInvalidUniqueId)
, xe8_flare(blendMode, b1, f1, f2, f3, w1, w2, flares)
, x11c_notInRenderLast(true) {
xe6_27_thermalVisorFlags = kTF_Hot;
}
CScriptVisorFlare::~CScriptVisorFlare() {}
void CScriptVisorFlare::Accept(IVisitor& visitor) { visitor.Visit(*this); }
void CScriptVisorFlare::Think(float dt, CStateManager& stateMgr) {
if (GetActive()) {
xe8_flare.Update(dt, GetTranslation(), this, stateMgr);
}
}
void CScriptVisorFlare::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr) {
CActor::AcceptScriptMsg(msg, objId, stateMgr);
}
void CScriptVisorFlare::PreRender(CStateManager& stateMgr, const CFrustumPlanes&) {
x11c_notInRenderLast = !stateMgr.RenderLast(GetUniqueId());
}
void CScriptVisorFlare::AddToRenderer(const CFrustumPlanes&, const CStateManager& stateMgr) const {
if (x11c_notInRenderLast) {
EnsureRendered(stateMgr, stateMgr.GetPlayer()->GetTranslation(), GetSortingBounds(stateMgr));
}
}
void CScriptVisorFlare::Render(const CStateManager& stateMgr) const { xe8_flare.Render(GetTranslation(), stateMgr); }